推送到qa分支未触发qa_build却触发dev_build的CI配置问题
条件判断存在两处核心问题
1. 变量适用场景错误
github.base_ref和github.head_ref是仅Pull Request 事件下才会生效的上下文变量,如果你是直接执行git push向qa分支推送代码,触发的是push事件,此时这两个变量均为空值,所有关联的判断逻辑都会失效。
2. 逻辑结果推导
当你向qa分支推送代码时:
qa_build的判断逻辑等价于${{ contains('', 'qa') || contains('', 'qa') }},最终结果为false,因此不会触发dev_build的判断逻辑等价于${{ !(false || false || ...) }},最终结果为true,因此会错误触发
修复方案
如果你需要同时适配Push和Pull Request事件
修改两个job的判断条件,新增push事件专用的github.ref_name变量(取值为当前推送的分支名):
jobs: dev_build: if: ${{ !(contains(github.ref_name, 'master') || contains(github.ref_name, 'main') || contains(github.ref_name, 'qa') || contains(github.base_ref, 'master') || contains(github.base_ref, 'main') || contains(github.base_ref, 'qa') || contains(github.head_ref, 'master') || contains(github.head_ref, 'main') || contains(github.head_ref, 'qa')) }} # 其余配置不变 qa_build: if: ${{ contains(github.ref_name, 'qa') || contains(github.base_ref, 'qa') || contains(github.head_ref, 'qa') }} # 其余配置不变
如果你仅需要处理Push事件
可以直接删除不相关的变量,简化逻辑:
jobs: dev_build: if: ${{ !(contains(github.ref_name, 'master') || contains(github.ref_name, 'main') || contains(github.ref_name, 'qa')) }} # 其余配置不变 qa_build: if: ${{ contains(github.ref_name, 'qa') }} # 其余配置不变
额外优化建议
如果你的分支名就是精准的qa/master/main,没有类似dev-qa这类包含关键词的分支,可以将contains替换为全等判断,避免误匹配:contains(github.ref_name, 'qa') → github.ref_name == 'qa'
内容的提问来源于stack exchange,提问作者Rav
相关产品推荐
相关产品推荐

