GitLab CI/CD子模块主分支提交触发任务失效问题问询
解决子模块合并后自动更新主项目子模块引用的问题
问题根源
你写的测试任务没执行,核心原因有两个:
- 子模块MR合并到main时,默认触发的是
merge_request_event类型的流水线,此时$CI_COMMIT_BRANCH变量不会被设为main(MR流水线基于虚拟合并分支运行,而非直接在main分支上) - 如果子模块项目的现有CI规则仅包含
merge_request_event,那么合并后push到main分支的操作不会触发任何流水线,自然也跑不到你的测试任务
修正触发规则
要让任务在子模块main分支有新提交(包括MR合并后的自动push)时触发,调整rules即可:
update_submodules: stage: .post script: - echo "Finished updating submodules - dummy " rules: - if: $CI_COMMIT_BRANCH == 'main' && $CI_PIPELINE_SOURCE == 'push' when: always
- 加上
$CI_PIPELINE_SOURCE == 'push',确保只有直接push到main分支的流水线才触发(包括MR合并后的系统自动push) - 同时要确认子模块项目的CI配置没有禁用push事件的流水线触发(默认是开启的,若之前没修改过无需额外操作)
GitLab完全支持该场景,完整实现方案如下
1. 子模块CI任务配置
任务需要在子模块main分支有push时触发,完成克隆主项目、更新子模块引用、提交推送的操作:
update_main_project_submodule: stage: deploy script: # 配置Git提交身份 - git config --global user.name "GitLab CI Bot" - git config --global user.email "ci-bot@your-domain.com" # 克隆主项目(用令牌授权) - git clone https://oauth2:$PROJECT_ACCESS_TOKEN@gitlab.example.com/your-group/main_project.git - cd main_project # 更新对应子模块到当前提交 - git submodule update --remote modules/subproject1 # 提交并推送 - git add modules/subproject1 - git commit -m "Update subproject1 to commit $CI_COMMIT_SHA" - git push rules: - if: $CI_COMMIT_BRANCH == 'main' && $CI_PIPELINE_SOURCE == 'push'
2. 权限配置
- 在主项目的「设置」→「访问令牌」中创建一个项目令牌,勾选
write_repository权限 - 将该令牌作为
$PROJECT_ACCESS_TOKEN变量,配置到子模块项目的「CI/CD」→「变量」中 - 若子模块和主项目同属一个GitLab组,也可以用
CI_JOB_TOKEN替代令牌,只需在主项目的「设置」→「CI/CD」→「流水线」中开启「允许来自受信任项目的CI作业访问」
3. 额外优化
- 可以添加拉取最新代码的步骤,避免冲突:在
git add前执行git pull origin main - 若有多个子模块,可以通过变量动态指定要更新的子模块路径,复用任务配置
内容的提问来源于stack exchange,提问作者ATK
相关产品推荐
相关产品推荐

