Jenkins 当 not allOf 似乎不起作用时

问题描述 投票:0回答:1

我手里有一个管道,我想做的是创建一个条件管道来根据某些变更集构建某些目录。它正在工作,而且,当在

*apps/**
*packages/**
路径以外的目录或文件中完成更改时,我应该触发所有部署。此外,空变更集也不应该触发其他部署。尽管有需要,当我为空变更集运行管道时,我的所有其他部署都将使用下面的代码为空变更集触发。我猜我的
when { not { allOf { }}}
块不起作用。因为即使对于空变更集,我的条件也不会被跳过。它不应该起作用吗?还是我错过了一些东西。

stage('Get Change Size') {
    steps {
       script {
          changeCount = currentBuild.changeSets.size()
          echo "There are " + changeCount +  "changed files"
                }
            }       
        }
stage('Root Directory Change Condition') {
    when { 
       not {
         allOf {
            changeset "*apps/**" 
            changeset "*packages/**"
            expression { changeCount == 0 }
        }
    }
}
        steps {
           script {  
              deployAll=true
              echo "Value is" + deployAll + "for deployAll parameter"
                }
            }
        }

任何帮助将不胜感激。

谢谢你。

jenkins continuous-integration jenkins-pipeline jenkins-groovy
1个回答
0
投票

您目前的状况是错误的,无法达到您想要的效果。
这样想,如果

changeCount == 0
那么肯定
changeset "*apps/**"
false,因为没有任何变化,因此
allOf
指令是 false
not
会将最终条件转换为 true 并且该步骤将被执行,尽管您不希望它执行。

要解决此问题,应将条件更改为您想要的确切逻辑:
仅当存在不在

*apps/**
中的更改或存在不在
*packages/**
中的更改且changeCount 应大于 0 时才运行该阶段。
比如:

stage('Root Directory Change Condition') {
    when { 
       allOf {      # This is actually the default behavior and can be omitted 
          anyOf {   # Use negative lookahead regex pattern to create a changeset filter that excludes certain paths
             changeset pattern: '^(?!.*apps\/).*', comparator: "REGEXP"
             changeset pattern: '^(?!.*packages\/).*', comparator: "REGEXP"
          }
          expression { changeCount > 0 } " Make sure there are any changes
        }
    }
}

这个条件实际上意味着:必须有任意数量的更改,此外,更改必须位于

*apps/**
*packages/**
文件夹之外的其他位置 - 这正是您想要的条件。

© www.soinside.com 2019 - 2024. All rights reserved.