GitLab Pipeline:保留Allow_failure:true时,阶段失败标记流水线为失败
解决GitLab流水线最终状态标记问题
你可以通过添加一个最终检查阶段来实现需求,不用修改现有8个阶段的allow_failure: true属性。具体做法如下:
1. 调整阶段顺序
在原有8个阶段之后新增一个final_status_check阶段,确保它是最后执行的:
stages: - stage1 - stage2 - stage3 - stage4 - stage5 - stage6 - stage7 - stage8 - final_status_check
2. 添加状态检查Job
在这个新增阶段里创建一个Job,专门检查前面所有阶段的执行状态,只要发现有失败的Job,就让当前Job失败,从而把整个流水线标记为failed:
final_status_check_job: stage: final_status_check script: # 先安装依赖工具(如果runner环境没有jq和curl的话) - apt-get update && apt-get install -y jq curl # 调用GitLab API获取当前流水线的所有Job状态 - RESPONSE=$(curl --header "PRIVATE-TOKEN: $GITLAB_API_TOKEN" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/pipelines/$CI_PIPELINE_ID/jobs") # 过滤出除当前检查Job外的失败Job - | if echo "$RESPONSE" | jq '.[] | select(.name != "final_status_check_job" and .status == "failed")' | grep -q .; then echo "检测到前面有阶段执行失败,标记流水线为失败状态" exit 1 else echo "所有阶段执行完成且无失败" exit 0 fi # 依赖前面8个阶段的所有Job,确保它们都执行完再检查 needs: - job: stage1_job - job: stage2_job - job: stage3_job - job: stage4_job - job: stage5_job - job: stage6_job - job: stage7_job - job: stage8_job # 这个检查Job不能允许失败,否则无法改变流水线最终状态 allow_failure: false
3. 配置API令牌
需要在项目的CI/CD变量中添加GITLAB_API_TOKEN,这个令牌需要拥有read_api权限(可以在GitLab个人设置的「访问令牌」中创建)。
原理说明
原有8个阶段的allow_failure: true保证了某个阶段失败时,流水线仍能继续执行到最后的检查Job。检查Job通过GitLab API获取所有前置Job的状态,一旦发现失败就主动退出失败,而它的allow_failure: false会让整个流水线最终状态变为failed;如果所有前置Job都成功,检查Job也成功,流水线就会显示passed。
内容的提问来源于stack exchange,提问作者Yogesh
相关产品推荐
相关产品推荐

