데이터베이스 마이그레이션 파이프라인
GitLab v19.4요약
자동화된 마이그레이션 테스트 파이프라인을 사용하면 (Database Lab을 활용해) 프로덕션에 가까운 환경에서 마이그레이션을 자동으로 테스트할 수 있습니다. 마이그레이션 테스트는 새 데이터베이스 마이그레이션을 추가하는 변경 사항에 대해 GitLab 프로젝트에서 활성화되어 있습니다.
자동화된 마이그레이션 테스트 파이프라인을 사용하면 (Database Lab을 활용해) 프로덕션에 가까운 환경에서 마이그레이션을 자동으로 테스트할 수 있습니다. 이 파이프라인은 아키텍처 설계 문서를 기반으로 합니다.
마이그레이션 테스트는 새 데이터베이스 마이그레이션을 추가하는 변경 사항에 대해
GitLab 프로젝트에서 활성화되어 있습니다. test Stage의
db:gitlabcom-database-testing job을 실행하여 이 job을 수동으로 트리거합니다. 리소스 낭비를 막기 위해
MR 이 리뷰 준비가 되었을 때만 이 job을 실행합니다. 또한 파이프라인이 test Stage에 나타나려면 MR에 "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 - 해당 백그라운드 마이그레이션의 모든 배치에서 실행된 전체 쿼리의 소요 시간 히스토그램입니다.
클론 세부 정보 및 아티팩트#
코멘트 하단에는 다음과 같은 추가 정보가 포함됩니다.
- Migrations pending on GitLab.com - 아직 GitLab.com에 배포되지 않은 마이그레이션 요약입니다. 병합되었지만 아직 배포되지 않은 마이그레이션을 테스트할 때 유용합니다.
- Clone details - 이 테스트 파이프라인을 위해 생성된
Postgres.ai씬 클론 링크와 만료 정보입니다. 마이그레이션 실행 결과를 더 살펴보는 데 사용할 수 있습니다. 데이터베이스 유지 관리자이거나 접근 요청을 거친 경우에만 접근할 수 있습니다. - 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"