如何通过GitLab其他项目CI验证build_scripts合并请求?
我有多个分散在不同GitLab仓库(repo1、repo2……)的项目,这些项目都通过另一个仓库build_scripts里的构建脚本进行构建。build_scripts包含YML文件、Shell脚本等资源,用来给每个项目生成包含build和test阶段的GitLab流水线。
每个项目的.gitlab-ci.yml配置如下:
include: - project: 'build_scripts' ref: master file: '/general-pipeline.yml'
general-pipeline.yml定义的流水线里,build阶段包含多个针对不同OS/架构的构建任务,test阶段依赖build阶段,会为当前流水线的每个构建运行测试套件。现在创建repo1、repo2等项目的合并请求时,GitLab会从build_scripts/general-pipeline.yml生成流水线验证该合并请求。
现在我要修改build_scripts并创建合并请求,能不能在合并到master分支之前,用build_scripts的新修改来构建各个项目,以此验证这个合并请求?也就是希望在build_scripts仓库的每个合并请求上,指定它的特定分支来运行repo1、repo2等项目的CI。
方法1:临时修改目标项目的分支引用手动验证
- 直接在repo1、repo2等项目的
.gitlab-ci.yml里,把ref改成build_scripts的MR分支名,手动触发流水线:
include: - project: 'build_scripts' ref: feature/my-build-script-change # 替换成你的MR分支名 file: '/general-pipeline.yml'
- 验证完之后改回
master就行。这个方法适合小范围验证,但手动操作麻烦,频繁修改的话不推荐。
方法2:在build_scripts的MR流水线中自动触发跨项目CI
借助GitLab的CI变量和API,让build_scripts的MR流水线自动触发其他项目的流水线,并强制使用当前MR分支的构建脚本:
- 在
build_scripts的.gitlab-ci.yml里加一个验证阶段:
cross-project-validation: stage: test script: - | # 触发repo1的流水线,传参指定用当前MR分支的build_scripts curl --request POST \ --header "PRIVATE-TOKEN: $CI_JOB_TOKEN" \ --form "ref=master" \ --form "variables[BUILD_SCRIPTS_REF]=$CI_COMMIT_BRANCH" \ "$CI_API_V4_URL/projects/$(echo repo1 | sed 's/\//%2F/g')/pipeline" # 复制上面的代码块,替换成repo2、repo3等其他项目 only: - merge_requests
- 在repo1、repo2等项目的
.gitlab-ci.yml里,改成根据变量动态切换引用:
include: - project: 'build_scripts' ref: ${BUILD_SCRIPTS_REF:-master} # 有变量就用变量指定的分支,默认用master file: '/general-pipeline.yml'
- 注意:要给
build_scripts仓库的CI_JOB_TOKEN开权限,在目标项目的设置里,给build_scripts添加"流水线"触发权限。
方法3:用多项目流水线直接集成验证
如果想让build_scripts的MR流水线和目标项目的CI更紧密联动,可以配置多项目流水线,直接在MR里触发目标项目的执行:
在build_scripts的.gitlab-ci.yml中添加:
trigger-repo1: stage: test trigger: project: repo1 branch: master variables: BUILD_SCRIPTS_REF: $CI_COMMIT_BRANCH only: - merge_requests trigger-repo2: stage: test trigger: project: repo2 branch: master variables: BUILD_SCRIPTS_REF: $CI_COMMIT_BRANCH only: - merge_requests
- 同样需要目标项目的
.gitlab-ci.yml支持变量切换引用,并且配置好相应的权限。
方法4:预发布分支批量验证
在build_scripts里创建和MR对应的预发布分支,让所有目标项目临时引用这个分支做批量验证,确认没问题后再合并到master。
内容的提问来源于stack exchange,提问作者Rom098

