Gitlab CI多模块版本自增任务执行后仅存最后一个提交如何解决
问题原因
- 任务初始代码版本一致:GitLab CI的多个任务默认基于流水线触发时的同一commit拉取代码,三个模块的递增任务启动时都使用了相同的初始代码,无法感知其他任务的提交变更。
- 代码拉取时机错误:当前脚本是先修改代码提交到本地,再执行pull --rebase拉取远端最新代码,即使拉取到了其他任务的提交,若多个任务同时执行,后执行推送的任务携带的
-f强制推送参数,会直接用自身本地的commit链覆盖远端的commit链,前面任务的提交会被直接覆盖。 - 串行规则未完全生效:虽然配置了
resource_group: incrementing,但如果GitLab Runner开启了并发、或资源组调度有延迟,仍然可能出现任务并行执行的情况,无法保证严格串行。
解决方案
- 调整脚本执行顺序,修改代码前先拉取最新代码
把git pull --rebase操作放到script段落最开头,确保每次修改都基于当前远端最新代码,避免基于旧版本修改:
script: # 第一步先拉取最新远端代码 - git pull https://myname:$CI_INCREMENTION_PWD@gitlab.com/url/to/my/repo/api.git HEAD:$CI_COMMIT_REF_NAME --prune --rebase # 原有版本号提取、修改、mvn命令等后续逻辑保持不变 - NUMBER=$(grep \<\/version $MODULE/pom.xml | head -n 1 | cut -d '>' -f2 | cut -d '<' -f1) # ... 其余原有逻辑保持不变
- 移除
git push的-f强制推送参数
强制推送是提交丢失的直接原因,去掉后如果推送失败,说明本地代码不是基于最新远端版本,任务会直接报错,可配置任务失败重试避免该问题,不会再出现提交被覆盖的情况。修改后的推送命令如下:
- git push https://myname:$CI_INCREMENTION_PWD@gitlab.com/url/to/my/repo/api.git HEAD:$CI_COMMIT_REF_NAME -u
- 强制版本递增任务串行执行
除了resource_group配置外,还可以将所有版本递增任务放到同一个独立stage中,配置该stage全局并发数为1,在.gitlab-ci.yml顶部添加如下配置:
stages: # 其他原有stage ... - increment version variables: # 限制同一时间该stage仅执行1个任务 CI_SERIAL: 1
- 可选优化:统一单任务处理所有模块版本递增
不需要拆分多个模块专属任务,可在单个任务中先用git diff判断本次提交变更的模块,依次修改对应模块的版本号后统一提交推送,从根源上避免多任务提交冲突问题。
内容的提问来源于stack exchange,提问作者ssmolinski9
相关产品推荐
相关产品推荐

