如何避免GitLab定时流水线在默认分支运行test_job?
问题原因
当默认分支(master)的定时流水线运行时,test_job的规则中if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH会先被匹配到——GitLab流水线规则是按顺序匹配,只要有一条规则满足就停止后续判断。虽然你添加了if: $CI_PIPELINE_SOURCE == "schedule" when: never,但这条规则在默认分支规则之后,所以不会被触发,导致test_job依然执行。
解决方案
有两种可行的调整方式,任选其一即可:
方案1:调整test_job的规则顺序,将排除定时调度的规则放在最前面
把when: never的定时调度规则移到所有规则的最顶部,这样当流水线源是schedule时,会优先匹配到这条规则并跳过作业:
test_job: variables: WHICH_ENVIRONMENT: dev0 WHICH_TAG: '@V3' stage: test script: - echo "$WHICH_ENVIRONMENT" - echo "$WHICH_TAG" - ./gradlew clean test "-Dkarate.env=$WHICH_ENVIRONMENT" "-Dkarate.options=--tags $WHICH_TAG" rules: # 优先排除定时调度场景 - if: $CI_PIPELINE_SOURCE == "schedule" when: never - if: $CI_PIPELINE_SOURCE == "web" && $PARALLEL == "false" - if: $CI_PIPELINE_SOURCE == "merge_request_event" - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
方案2:修改默认分支的规则,排除定时调度场景
在CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH的条件中,增加流水线源不是schedule的判断,让默认分支的规则仅在非定时调度时生效:
test_job: variables: WHICH_ENVIRONMENT: dev0 WHICH_TAG: '@V3' stage: test script: - echo "$WHICH_ENVIRONMENT" - echo "$WHICH_TAG" - ./gradlew clean test "-Dkarate.env=$WHICH_ENVIRONMENT" "-Dkarate.options=--tags $WHICH_TAG" rules: - if: $CI_PIPELINE_SOURCE == "web" && $PARALLEL == "false" - if: $CI_PIPELINE_SOURCE == "merge_request_event" # 默认分支规则仅在非定时调度时生效 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "schedule" - if: $CI_PIPELINE_SOURCE == "schedule" when: never
验证效果
调整后,当master分支的定时流水线运行时:
- 方案1中,第一条规则匹配到
schedule,直接跳过test_job; - 方案2中,默认分支的规则因为
CI_PIPELINE_SOURCE == "schedule"不满足,不会触发,后续的schedule规则也会跳过作业; - 同时
test_job_parallel的规则($CI_PIPELINE_SOURCE == "schedule") && $PARALLEL == "true"会正常匹配,仅执行该作业。
内容的提问来源于stack exchange,提问作者sivaji
相关产品推荐
相关产品推荐

