我手里有一个管道,我想做的是创建一个条件管道来根据某些变更集构建某些目录。它正在工作,而且,当在
*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"
}
}
}
任何帮助将不胜感激。
谢谢你。
您目前的状况是错误的,无法达到您想要的效果。
这样想,如果
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/**
文件夹之外的其他位置 - 这正是您想要的条件。