如何实现不同GitLab项目间测试数据共享及CI测试阶段导入
GitLab跨项目公共测试数据接入方案
针对集中存储测试数据的专属项目供多项目CI单测调用的场景,以下是按推荐优先级排序的可落地方案:
方案1:通过内置CI作业令牌拉取测试数据项目(优先推荐)
该方案无需额外管理密钥、权限配置灵活,是绝大多数场景的最优选择:
- 先在公共测试数据项目中配置访问权限:进入项目「设置 > CI/CD > 作业令牌权限」,将所有需要调用测试数据的业务项目加入允许访问列表,开启后业务项目的CI作业可以通过内置的
CI_JOB_TOKEN免密拉取该项目内容,无需配置Personal Access Token或Deploy Key。 - 在业务项目的
.gitlab-ci.yml中配置test阶段的数据拉取步骤,示例配置如下:
stages: - test pull_public_test_data: stage: test script: # 浅克隆测试数据项目,仅拉取最新提交减少传输量 - git clone --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@<你的GitLab内网地址>/<测试数据项目组>/<测试数据项目名>.git ./test-data # 若测试数据仓库体积大,可替换为稀疏拉取,仅拉取需要的目录: # - git clone --depth 1 --filter=blob:none --sparse https://gitlab-ci-token:${CI_JOB_TOKEN}@<你的GitLab内网地址>/<测试数据项目路径>.git ./test-data # - cd ./test-data && git sparse-checkout set <需要的具体数据目录> artifacts: paths: - ./test-data expire_in: 1 hour # 测试数据仅为单测临时使用,设置短过期时间节省存储 unit_test: stage: test needs: [pull_public_test_data] # 等数据拉取完成后再跑单测 script: # 直接读取./test-data目录下的文件执行单测即可,替换为你项目的实际单测命令 - pytest ./tests -v
方案优势:权限管控粒度细,测试数据项目维护者可随时调整可访问的项目范围;支持Git LFS存储的大体积测试文件;配置维护成本极低。
方案2:将测试数据项目作为Git子模块引入
该方案适合测试数据版本与业务代码版本强绑定的场景:
- 在业务项目中把公共测试数据项目添加为Git子模块,固定到对应的数据版本commit。
- 在CI配置中开启子模块自动拉取,示例配置如下:
variables: GIT_SUBMODULE_STRATEGY: recursive GIT_SUBMODULE_FORCE_HTTPS: "true" # 强制HTTPS拉取,自动走CI_JOB_TOKEN鉴权 test: stage: test script: # 代码检出阶段会自动拉取子模块内容到对应目录,直接读取执行单测即可 - go test -v ./...
方案优势:可以将业务代码与测试数据版本做绑定,避免测试数据更新导致历史版本的单测意外失败。
方案3:测试数据打包上传至GitLab通用包仓库
该方案适合测试数据为固定版本压缩包、不需要频繁拉取全量Git历史的场景:
- 在公共测试数据项目的CI中配置流水线,每次数据更新后将测试数据打包为zip/tar.gz格式,上传到GitLab内置的通用包仓库,按版本号管理。
- 业务项目CI中直接通过API拉取对应版本的数据包即可,示例命令:
# 拉取指定版本的测试数据压缩包 curl --header "JOB-TOKEN: $CI_JOB_TOKEN" "${CI_API_V4_URL}/projects/<测试数据项目ID>/packages/generic/test-data/v1.2.0/data.tar.gz" -o data.tar.gz # 解压到测试目录 tar -zxf data.tar.gz -C ./test-data
方案优势:拉取速度快,不需要拉取Git仓库的提交历史,适合单测仅需要固定版本数据集的场景。
注意事项
- 禁止将公共测试数据直接拷贝存放到各业务项目仓库,会导致多份数据不一致、业务仓库体积冗余膨胀
- 拉取测试数据时优先使用浅克隆、稀疏拉取等方式,仅拉取当前需要的文件,降低CI传输耗时
- 若测试数据包含敏感信息,务必在测试数据项目中配置精确的访问白名单,禁止开放公开访问权限
- 临时拉取的测试数据工件建议设置1-2小时的短过期时间,避免占用过多GitLab实例存储资源
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

