如何根据 Jenkins 管道中的参数有条件地运行下游作业?



继我的问题之后 如何在 Jenkins 中成功构建时触发参数化构建?

我想调用下游项目,但前提是布尔参数设置为 true。这可能吗?我的管道如下所示:

node {
try {
echo "ConfigFilePath: ${ConfigFilePath}"
echo "Delete VM on Successful Build: ${DeleteOnSuccess}"
stage('checkout') {
deleteDir()
git 'http://my.git.lab/repo.git'
}   
stage('deploy') {
bat 'powershell -nologo -file BuildMyVM.ps1 -ConfigFilePath "%ConfigFilePath%" -Verbose'                
}
}
stage('test') {
// functional tests go here
}    
} 
catch (e) {
// exception code
} finally {
// finally code
}
} //node
stage('delete') {
if(DeleteOnSuccess)
{
bat 'SET /p VM_NAME=<DeleteVM.txt'
echo "Deleting VM_NAME: %VM_NAME%"
def job = build job: 'remove-vm', parameters: [[$class: 'StringParameterValue', name: 'VM_NAME', value: '${VM_NAME}']]
}
}   

我在删除阶段收到此错误

Required context class hudson.FilePath is missing. Perhaps you forgot to surround the code with a step that provides this, such as: node

如果我将上述内容包装在节点中,则参数值将丢失。如果我将删除阶段放在主节点中,那么我会占用两个执行器,我试图避免这样做,因为它会导致一些死锁条件。

问题是脚本的运行实际上需要一个节点来运行,因此在您的情况下,错误的原因是您尝试在node上下文之外运行bat命令

node {
...
}
stage('delete') {
if(DeleteOnSuccess)
{
bat 'SET /p VM_NAME=<DeleteVM.txt' // <- this is actually causing the error
echo "Deleting VM_NAME: %VM_NAME%"
def job = build job: 'remove-vm', parameters: [[$class:    'StringParameterValue', name: 'VM_NAME', value: '${VM_NAME}']]
}
}   

您可以通过将此部分也包装在节点中来解决此问题,方法是将其放在第一个node中或添加一个新节点,具体取决于您想要的内容

除此之外,如果DeleteOnSuccess变量是构建参数,它将是一个字符串。我不确定,但我认为这是因为它是作为环境变量注入的,它也是字符串(即使它是布尔参数类型。我想这只是一个 UI 的东西,所以它会显示为复选框)。 您可以通过回显DeleteOnSuccess.class来检查这一点。这会告诉你它的类

if(DeleteOnSuccess) { ... }

将始终运行条件块。您可以通过使用toBoolean()扩展方法将其转换为bool来解决此问题,或者像您一样根据字符串trueDeleteOnSuccess == "true"进行检查。 扩展方法的优点是它还允许值"1""True"true

最新更新