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

时间:2017-01-11 12:33:06

标签: jenkins jenkins-pipeline

继续我的问题How to trigger parameterized build on successful build in 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

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

1 个答案:

答案 0 :(得分:2)

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

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变量是构建参数,它将是一个字符串。我不确定,但我认为这是因为它是作为环境变量注入的,它也是字符串(即使它是类型为BooleanParameter。我想这只是一个UI事物所以它将显示为复选框)。 你可以通过回复DeleteOnSuccess.class来检查。这将告诉你它的类

 if(DeleteOnSuccess) { ... }

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