데이터베이스 마이그레이션 파이프라인
GitLab v19.1자동화된 마이그레이션 테스트 파이프라인을 사용하면 Database Lab을 활용한 프로덕션 유사 환경에서 마이그레이션을 자동으로 테스트할 수 있습니다. 마이그레이션 테스트는 새로운 데이터베이스 마이그레이션을 추가하는 변경 사항에 대해 GitLab 프로젝트에서 활성화됩니다.
자동화된 마이그레이션 테스트 파이프라인을 사용하면 Database Lab을 활용한 프로덕션 유사 환경에서 마이그레이션을 자동으로 테스트할 수 있습니다. 이 파이프라인은 아키텍처 설계 문서를 기반으로 합니다.
마이그레이션 테스트는 새로운 데이터베이스 마이그레이션을 추가하는 변경 사항에 대해 GitLab 프로젝트에서 활성화됩니다.
test Stage 내의 db:gitlabcom-database-testing job을 실행하여 이 job을 수동으로 트리거할 수 있습니다.
리소스 낭비를 방지하기 위해, 머지 리퀘스트가 리뷰 준비가 완료된 경우에만 이 job을 실행하세요.
또한 파이프라인이 test Stage에 표시되려면 해당 머지 리퀘스트에 "database" 라벨이 있어야 합니다.
이 job은 ops GitLab 인스턴스에서 파이프라인을 시작합니다. 보안상의 이유로, 파이프라인에 대한 접근은 데이터베이스 메인테이너로 제한됩니다.
파이프라인이 시작되면, 봇이 머지 리퀘스트에 댓글로 알림을 보냅니다. 파이프라인이 완료되면, 댓글이 테스트 결과로 업데이트됩니다.
댓글에는 main과 ci 데이터베이스 모두에 대한 테스트 정보가 포함됩니다.
테스트된 각 데이터베이스에는 아래에서 설명하는 네 가지 섹션이 있습니다.
요약#
댓글의 첫 번째 섹션에는 다음을 포함한 테스트 결과 요약이 포함됩니다:
-
경고(Warnings) - 예외 또는 오래 실행되는 쿼리와 같은 중요한 문제를 강조 표시합니다.
-
마이그레이션(Migrations) - 각 마이그레이션이 완료되는 데 걸린 시간, 성공 여부, 그리고 데이터베이스 크기 증가량을 표시합니다.
-
런타임 히스토그램(Runtime histogram) - 이 섹션을 확장하면 모든 마이그레이션에 걸친 쿼리 런타임 히스토그램을 볼 수 있습니다.
마이그레이션 세부 정보#
댓글의 다음 섹션에는 각 마이그레이션에 대한 세부 정보가 포함됩니다:
-
세부 사항(Details) - 마이그레이션 유형, 총 실행 시간, 그리고 데이터베이스 크기 변화를 표시합니다.
-
쿼리(Queries) - 마이그레이션 중에 실행된 모든 쿼리와 함께 호출 횟수, 타이밍, 변경된 행 수를 표시합니다.
-
런타임 히스토그램(Runtime histogram) - 마이그레이션에 대한 쿼리 시간 분포를 나타냅니다.
데이터베이스 크기 증가#
경우에 따라 마이그레이션이 크기 증가를 유발하지 않을 것으로 예상되더라도 +8.00 KiB 크기 증가가 표시될 수 있습니다.
마이그레이션을 완료하면 schema_migrations 테이블에 행이 추가되며, 이로 인해 새 디스크 페이지가 생성될 수 있습니다.
새 디스크 페이지가 생성되면 데이터베이스 크기가 정확히 8 KiB만큼 증가합니다.
백그라운드 마이그레이션 세부 정보#
댓글의 다음 섹션에는 각 일괄 백그라운드 마이그레이션에 대한 세부 정보가 포함됩니다:
-
샘플링 정보(Sampling information) - 이 테스트 실행 중에 샘플링된 배치 수입니다. 샘플링된 배치는 테이블의 ID 범위에 걸쳐 균일하게 선택됩니다. 샘플링은 30분 동안 실행되며, 테스트할 각 백그라운드 마이그레이션에 걸쳐 균등하게 나뉩니다.
-
집계된 쿼리 정보(Aggregated query information) - 샘플링된 모든 배치에서 실행된 각 쿼리에 대한 집계 데이터와 함께 호출 횟수, 타이밍, 변경된 행 수를 표시합니다.
-
배치 런타임 히스토그램(Batch runtime histogram) - 백그라운드 마이그레이션에서 샘플링된 각 배치에 대한 타이밍 히스토그램입니다.
-
쿼리 런타임 히스토그램(Query runtime histogram) - 이 백그라운드 마이그레이션의 모든 배치에서 실행된 모든 쿼리에 대한 타이밍 히스토그램입니다.
클론 세부 정보 및 아티팩트#
댓글 하단에는 몇 가지 추가 정보가 포함됩니다:
-
GitLab.com에서 대기 중인 마이그레이션(Migrations pending on GitLab.com) - GitLab.com에 아직 배포되지 않은 마이그레이션의 요약입니다. 이 정보는 머지되었지만 아직 배포되지 않은 마이그레이션을 테스트할 때 유용합니다.
-
클론 세부 정보(Clone details) - 이 테스트 파이프라인을 위해 생성된
Postgres.aithin 클론 링크 및 만료 정보입니다. 마이그레이션 실행 결과를 추가로 탐색하는 데 사용할 수 있습니다. 데이터베이스 메인테이너 또는 접근 요청이 있는 경우에만 접근 가능합니다. -
아티팩트(Artifacts) - 파이프라인 아티팩트 링크입니다. 각 마이그레이션에 대한 전체 쿼리 로그(
.log로 끝나는 파일)를 여기에서 확인할 수 있으며, 데이터베이스 메인테이너 또는 접근 요청이 있는 경우에만 접근 가능합니다. 샘플링된 일괄 백그라운드 마이그레이션 배치에 대한 세부 정보도 여기에서 확인할 수 있습니다.
커밋 상태 확인#
트리거 job은 머지 리퀘스트의 커밋 SHA에 database-testing 커밋 상태도 게시합니다.
이 상태는 머지 리퀘스트 파이프라인 뷰의 별도 external Stage에 표시됩니다.
상태는 세 가지 상태를 거칩니다:
-
pending:db:gitlabcom-database-testingjob이ops.gitlab.net의 다운스트림 파이프라인을 트리거할 때 게시됩니다. -
success: 모든 job이 성공하면 다운스트림 파이프라인이 게시합니다. -
failed: 하나 이상의 job이 실패하면 다운스트림 파이프라인이 게시합니다.
상태가 success로 해결될 때까지 머지 리퀘스트를 머지할 수 없습니다.
데이터베이스 테스트 파이프라인 변경 사항 테스트#
데이터베이스 테스트 파이프라인 자체에 대한 변경 사항을 테스트하려면 다음이 필요합니다:
-
GitLab Org에 대한 머지 리퀘스트
-
테스트할 변경 사항이 GitLab Ops의 브랜치에 있어야 합니다.
다음 자체 문서화된 스크립트를 사용하여 GitLab Ops의 임의 브랜치에 대해 GitLab Org의 머지 리퀘스트를 테스트하세요:
#! /usr/bin/env bash
# The following must be set on a per-invocation basis:
TESTING_TRIGGER_TOKEN='[REDACTED]' # Testing trigger token created in the CI section of the project
CI_COMMIT_REF_NAME='55-post-notice-on-failure' # The branch on ops that you want to run against
CI_MERGE_REQUEST_IID='117901' # Merge request ID of the MR on gitlab.com that you want to test
SHA="fed6dd8a58d75a0e053a4972765b4fc08c5814a3" # The commit SHA of the HEAD of the branch you want to test on gitlab-org/gitlab
# The following should not be changed between invocations:
CI_JOB_URL='https://gitlab.com/gitlab-org/database-team/gitlab-com-database-testing/-/jobs/1590162939'
# It doesn't appear that CI_JOB_URL has to be set to anything in particular for the pipeline to run
# successfully, but this would usually be the URL to the upstream job that invokes the DB testing pipeline.
CI_MERGE_REQUEST_PROJECT_ID='278964' # gitlab-org/gitlab numeric ID. Shouldn't change.
CI_PROJECT_ID="gitlab-org/gitlab" # The slug identifying 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"