You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 19:33:22