Help us learn about your current experience with the documentation. Take the survey.
数据库迁移管道
通过自动化迁移测试管道, 我们可以在生产环境类似的环境中(使用Database Lab)自动测试迁移。 该管道基于架构设计文档。
在GitLab 项目中,
对于添加新数据库迁移的更改会启用迁移测试。
在 test 阶段手动运行 db:gitlabcom-database-testing 作业来触发此测试。
为避免浪费资源,仅在您的 MR 准备好审查时运行此作业。
此外,确保 MR 具有 “database” 标签,以便管道出现在测试阶段。
该作业在ops GitLab 实例上启动管道。 出于安全考虑,对管道的访问权限仅限于数据库管理员。
当管道启动时,机器人会在合并请求中通过评论通知您。 当测试完成时,评论会更新为测试结果。
该评论包含 main 和 ci 数据库的测试信息。
每个测试的数据库都有以下四个部分。
摘要
评论的第一部分包含测试结果的摘要,包括:
- 警告 - 突出显示关键问题,如异常或长时间运行的查询。
- 迁移 - 每个迁移的完成时间、是否成功以及数据库大小的增量。
- 运行时间直方图 - 展开此部分查看所有迁移的查询运行时间直方图。
迁移详情
评论的下一部分包含每个迁移的详细信息,包括:
- 详情 - 迁移类型、总持续时间和数据库大小变化。
- 查询 - 迁移期间执行的每个查询,以及调用次数、计时和更改的行数。
- 运行时间直方图 - 显示该迁移查询时间的分布。
数据库大小增加
偶尔,即使迁移预计不会导致大小增加,也会显示 +8.00 KiB 的大小增加。
完成任何迁移都会在 schema_migrations 表中添加一行,这可能需要创建新的磁盘页面。
如果创建了新的磁盘页面,数据库大小将正好增加 8 KiB。
后台迁移详情
评论的下一部分包含每个批量后台迁移的详细信息,包括:
- 采样信息 - 此测试运行期间采样的批次数。 采样的批次在表的 ID 范围内均匀选择。采样运行 30 分钟, 在每个要测试的后台迁移中平均分配。
- 聚合查询信息 - 关于在所有采样批次中执行的每个查询的聚合数据, 包括调用次数、计时和更改的行数。
- 批次运行时间直方图 - 来自该后台迁移的每个采样批次的计时直方图。
- 查询运行时间直方图 - 在该后台迁移的任何批次中执行的所有查询的计时直方图。
克隆详情和工件
评论底部包含一些额外信息:
- GitLab.com 上待处理的迁移 - 尚未部署到 GitLab.com 的迁移摘要。 当测试已合并但尚未部署的迁移时,此信息很有用。
- 克隆详情 - 为此测试管道创建的
Postgres.ai薄克隆的链接, 以及其过期信息。可用于进一步探索运行迁移的结果。 仅数据库管理员或通过访问请求可访问。 - 工件 - 管道工件的链接。每个迁移的完整查询日志(以
.log结尾)都可在那里获取, 仅数据库管理员或通过访问请求可访问。特定批量后台迁移采样批次的信息也可获取。
测试数据库测试管道的更改
要测试对数据库测试管道本身的更改,您需要:
- 针对 GitLab Org 的合并请求。
- 要测试的更改必须存在于 GitLab Ops 上的分支中。
使用此自记录脚本来测试 GitLab Org 上的合并请求与 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 上测试的分支 HEAD 的提交 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 的 slug。
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"