GitLab CI 推送到master时测试任务重复运行的问题咨询
重复运行的原因
你当前用的旧版only规则是「满足任意一个条件就跑test」:只要是合并请求管道、或者只要是master分支的推送,就触发测试。当两类场景同时命中同一个推送操作时(比如直接推master的同时,刚好触发了源分支为master的MR更新管道),test就会跑两次,白白消耗免费额度。
修改方案
用GitLab官方现在推荐的rules语法替代旧版only/except,可实现两类触发场景完全互斥,免费套餐原生支持,不需要额外付费。
两个规则的触发条件完全互斥,同一个管道不可能同时满足CI_PIPELINE_SOURCE == "merge_request_event"和CI_PIPELINE_SOURCE == "push",因此不会出现重复运行test的情况。
匹配你「仅在目标为master的MR、或master分支推送时跑测试」的需求,修改后的配置如下:
stages: - test - deploy test: stage: test rules: # 目标分支为master的合并请求管道,执行测试 - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"' # 普通推送至master分支的管道,执行测试 - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "master"' script: - jest --coverage deploy: stage: deploy rules: # 仅普通推送至master分支的管道,执行部署 - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "master"' dependencies: - test script: - make deploy
可选省额度优化
如果不需要在MR合并时重复跑MR侧的测试,仅在合并后的master分支跑测试即可,可以调整test的rules,排除已合并的MR场景:
test: stage: test rules: # 仅打开状态、目标为master的MR执行测试 - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" && $CI_MERGE_REQUEST_STATE == "opened"' # 推送至master的管道执行测试 - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "master"' script: - jest --coverage
内容的提问来源于stack exchange,提问作者clueless
相关产品推荐
相关产品推荐

