데이터베이스 마이그레이션 파이프라인

자동화된 마이그레이션 테스트 파이프라인을 사용하여 우리는 프로덕션과 유사한 환경( Database Lab 사용)에서 마이그레이션을 자동으로 테스트할 수 있습니다. 이것은 아키텍처 설계도에 기반을 두고 있습니다.

마이그레이션 테스팅은 GitLab 프로젝트에서 새로운 데이터베이스 마이그레이션을 추가하는 변경 사항에 대해 활성화되어 있습니다. 이 작업을 매뉴얼으로 실행하여 test 단계 내에서 db:gitlabcom-database-testing 작업을 트리거합니다. 자원을 낭비하지 않도록, MR이 리뷰할 준비가 된 경우에만이 작업을 실행하세요. 추가로 파이프라인이 테스트 단계에 나타나려면 MR이 “database” 라벨을 가져야 합니다.

작업은 ops GitLab 인스턴스에서 파이프라인을 시작합니다. 보안상의 이유로, 파이프라인에 대한 액세스는 데이터베이스 유지 보수자로 제한됩니다.

파이프라인이 시작되면 봇이 MR에 댓글로 알립니다. 작업이 완료되면 테스트 결과가 댓글에 업데이트됩니다.

댓글에는 mainci 데이터베이스에 대한 테스트 정보가 포함되어 있습니다. 테스트된 각 데이터베이스에는 아래에서 설명하는 네 가지 섹션이 있습니다.

요약

댓글의 첫 번째 섹션에는 테스트 결과에 대한 요약이 포함되어 있습니다.

  • 경고 - 예외 또는 오랜 실행 쿼리와 같은 중요한 문제점을 강조합니다.
  • 마이그레이션 - 각 마이그레이션이 완료된 데 걸린 시간, 성공 여부 및 데이터베이스 크기 증가가 나와 있습니다.
  • 실행 시간 히스토그램 - 이 섹션을 확장하여 모든 마이그레이션의 쿼리 실행 시간 히스토그램을 볼 수 있습니다.

마이그레이션 세부 정보

댓글의 다음 섹션에는 각 마이그레이션에 대한 세부 정보가 포함되어 있습니다.

  • 세부 정보 - 마이그레이션 유형, 총 걸린 시간 및 데이터베이스 크기 변경이 나와 있습니다.
  • 쿼리 - 각 마이그레이션 중 실행된 모든 쿼리가 호출 횟수, 실행 시간, 변경된 행 수와 함께 나와 있습니다.
  • 실행 시간 히스토그램 - 마이그레이션의 쿼리 실행 시간 분포를 나타냅니다.

데이터베이스 크기 증가

가끔 마이그레이션은 예상되지 않은 데이터베이스 크기의 증가인 +8.00 KiB를 보여줄 수 있습니다. 어떤 마이그레이션이 새로운 디스크 페이지를 생성하는 경우 데이터베이스의 크기가 정확히 8 KiB 증가할 수 있습니다.

배경 마이그레이션 세부 정보

댓글의 다음 섹션에는 각 배치 배경 마이그레이션에 대한 세부 정보가 포함되어 있습니다.

  • 샘플링 정보 -이 테스트 실행 중에 샘플링된 배치 수가 나와 있습니다. 샘플링된 배치는 테이블의 ID 범위 전체에서 균일하게 선택됩니다. 샘플링은 배경 마이그레이션의 각 테스트로 균등하게 30분간 실행됩니다.
  • 집계된 쿼리 정보 - 테스트 실행 중에 샘플링된 각 배치에서 실행된 각 쿼리에 대한 집계 데이터가 제공되며, 호출 횟수, 실행 시간 및 변경된 행 수가 함께 제공됩니다.
  • 배치 실행 시간 히스토그램 - 배경 마이그레이션의 각 샘플링된 배치에 대한 실행 시간 히스토그램이 제공됩니다.
  • 쿼리 실행 시간 히스토그램 -이 배경 마이그레이션의 모든 배치에서 실행된 쿼리의 실행 시간 히스토그램이 제공됩니다.

클론 세부 정보 및 아티팩트

댓글의 하단에 몇 가지 추가 정보가 포함되어 있습니다.

  • GitLab.com에 대기 중인 마이그레이션 - 아직 GitLab.com에 배포되지 않은 마이그레이션에 대한 요약이 제공됩니다. 이 정보는 Merge되었지만 아직 배포되지 않은 마이그레이션을 테스트할 때 유용합니다.
  • 클론 세부 정보 - 이 테스트 파이프라인에 대해 생성된 Postgres.ai 씬 클론에 대한 링크가 제공되며, 만료 정보도 제공됩니다. 이를 사용하여 마이그레이션 실행 결과를 더 자세히 살펴볼 수 있습니다. 이는 데이터베이스 유지 보수자에게만 액세스 가능하거나 액세스 요청이 있을 경우에만 사용할 수 있습니다.
  • 아티팩트 - 파이프라인의 아티팩트에 대한 링크가 제공됩니다. 각 마이그레이션에 대한 전체 쿼리 로그(확장자 .log)가 여기에서 사용 가능하며, 데이터베이스 유지 보수자에게만 액세스 가능하거나 액세스 요청이 있을 경우에만 사용할 수 있습니다. 특정 배치 배경 마이그레이션의 샘플링된 배치에 대한 세부 정보도 제공됩니다.

데이터베이스 테스트 파이프라인에 대한 변경 사항 테스트

데이터베이스 테스트 파이프라인에 대한 변경 사항을 테스트하려면 다음이 필요합니다:

  1. GitLab Org에 대한 Merge Request.
  2. 테스트할 변경 사항이 GitLab Ops의 브랜치에 있는 상태여야 합니다.

GitLab Org의 Merge Request을 GitLab Ops의 임의의 브랜치에 대해 테스트하려면 다음 셀프 문서화 스크립트를 사용하세요:

#! /usr/bin/env bash

# 다음은 호출당 기반으로 설정되어야 합니다:
TESTING_TRIGGER_TOKEN='[REDACTED]'              # 프로젝트의 CI 섹션에서 생성된 테스트 트리거 토큰
CI_COMMIT_REF_NAME='55-post-notice-on-failure'  # 원하는 ops의 브랜치
CI_MERGE_REQUEST_IID='117901'                   # 테스트하려는 gitlab.com의 MR ID
SHA="fed6dd8a58d75a0e053a4972765b4fc08c5814a3"  # 테스트하려는 gitlab-org/gitlab 브랜치 헤드의 커밋 SHA

# 다음은 호출 사이에서 변경되어서는 안됩니다:
CI_JOB_URL='https://gitlab.com/gitlab-org/database-team/gitlab-com-database-testing/-/jobs/1590162939'
# 파이프라인이 성공적으로 실행되려면 CI_JOB_URL을 특정한 값으로 설정해야 하는 것 같지 않습니다만, 일반적으로 DB 테스트 파이프라인을 호출하는 상위 작업의 URL일 것입니다.
CI_MERGE_REQUEST_PROJECT_ID='278964'    # gitlab-org/gitlab의 숫자 ID. 변경되어서는 안됩니다.
CI_PROJECT_ID="gitlab-org/gitlab"       # gitlab-org/gitlab을 나타내는 슬러그입니다.

curl --verbose --request POST \
     --form "token=$TESTING_TRIGGER_TOKEN" \
     --form "ref=$CI_COMMIT_REF_NAME" \
     --form "variables[TOP_UPSTREAM_MERGE_REQUEST_IID]=$CI_MERGE_REQUEST_IID" \
     --form "variables[TOP_UPSTREAM_MERGE_REQUEST_PROJECT_ID]=$CI_MERGE_REQUEST_PROJECT_ID" \
     --form "variables[TOP_UPSTREAM_SOURCE_JOB]=$CI_JOB_URL" \
     --form "variables[TOP_UPSTREAM_SOURCE_PROJECT]=$CI_PROJECT_ID" \
     --form "variables[VALIDATION_PIPELINE]=true" \
     --form "variables[GITLAB_COMMIT_SHA]=$SHA" \
     --form "variables[TRIGGER_SOURCE]=$CI_JOB_URL" \
     "https://ops.gitlab.net/api/v4/projects/429/trigger/pipeline"