GitLab流水线因推送dbt生成文档陷入循环,如何修复?
问题描述
我尝试将dbt生成的文档推送至GitLab仓库,当前该流水线功能执行正常,但会自动创建新任务并陷入循环执行,请问该如何修复这一问题?
对应的GitLab CI配置如下:
dbt_build: stage: build image: xemuliam/dbt script: - dbt --version - dbt docs generate - apt-get update - apt-get install -y git - git config user.email "email" - git config user.name "username" - git remote set-url origin https://username:$git_pass@gitlab.com/userlink/dbt.git - git checkout main - git add . - git commit -m "chnages" - git push origin main
问题原因
循环的核心原因是:当代码推送到main分支后,GitLab会自动触发新的流水线,而新流水线又会重复执行dbt_build任务,再次推送代码,形成闭环循环。
修复方案
以下几种方式可解决该问题,按需选择:
1. 仅在有文件变更时执行提交推送
当前脚本不管是否有文档变更,都会强制执行提交操作,即使是空提交也会触发流水线。可以在提交前检查是否有实际变更:
dbt_build: stage: build image: xemuliam/dbt script: - dbt --version - dbt docs generate - apt-get update - apt-get install -y git - git config user.email "email" - git config user.name "username" - git remote set-url origin https://username:$git_pass@gitlab.com/userlink/dbt.git - git checkout main - git add . # 检查缓存区是否有变更,无变更则跳过提交推送 - | if git diff --cached --quiet; then echo "No document changes to commit, skip push" else git commit -m "Update dbt documentation" git push origin main fi
2. 在提交信息中添加跳过流水线标记
GitLab支持在commit message中加入特定标记,让本次提交不触发新流水线。修改commit命令即可:
# 替换原有commit行 - git commit -m "Update dbt documentation [skip ci]"
[ci skip]也是GitLab识别的有效标记,任选其一即可。
3. 限制任务仅在特定条件下运行
修改CI配置,让dbt_build仅在手动触发或非推送事件触发的流水线中运行:
dbt_build: stage: build image: xemuliam/dbt # 仅允许手动触发该任务 when: manual script: # 原有脚本内容保持不变 - dbt --version - dbt docs generate ...
也可以通过规则排除推送触发的流水线:
dbt_build: stage: build image: xemuliam/dbt rules: # 仅当流水线不是由分支推送触发时运行 - if: '$CI_PIPELINE_SOURCE != "push"' script: # 原有脚本内容保持不变 ...
内容的提问来源于stack exchange,提问作者Saubhagya Kushwaha
相关产品推荐
相关产品推荐

