Jenkins中when not allOf逻辑异常:空变更集误触发全量部署求助
问题分析与解决方案
你的问题出在when条件的逻辑判断上,原逻辑完全不符合需求,导致空变更集触发了全量部署。
需求拆解
要触发全量部署,必须同时满足两个条件:
- 变更集非空(排除空变更的情况)
- 所有变更都不在
*apps/**和*packages/**路径下(即变更完全在这两个目录之外)
原逻辑错误原因
原代码中not { allOf { ... } }的逻辑等价于「只要changeset "*apps/**"、changeset "*packages/**"、changeCount == 0这三个条件有一个不满足,就进入stage」。当是空变更集时:
changeset "*apps/**"和changeset "*packages/**"都为falsechangeCount == 0为true
所以allOf整体是false,not之后变成true,导致空变更集也进入了全量部署的stage。
修正后的代码
stage('Get Change Size') { steps { script { // 用isEmpty()判断是否为空变更集更直观,和size()==0效果一致 changeCount = currentBuild.changeSets.size() echo "There are ${changeCount} changed sets" } } } stage('Root Directory Change Condition') { when { allOf { // 条件1:变更集非空 expression { changeCount > 0 } // 条件2:没有任何变更在apps或packages目录下 not { anyOf { changeset "*apps/**" changeset "*packages/**" } } } } steps { script { deployAll = true echo "Value is ${deployAll} for deployAll parameter" } } }
逻辑说明
allOf确保两个条件必须同时满足才进入stageexpression { changeCount > 0 }排除空变更集的情况not { anyOf { ... } }确保不存在任何在*apps/**或*packages/**路径下的变更,也就是所有变更都在这两个目录之外
这样就能严格符合你的需求:只有当变更在指定目录外且变更集非空时,才触发全量部署,空变更集不会触发。
内容的提问来源于stack exchange,提问作者Oguzhan Aygun
相关产品推荐
相关产品推荐

