继续我的问题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
如果我将上述内容包装在节点中,则参数值将丢失。如果我把删除阶段放在主节点中,那么我会占用两个执行器,我试图避免它,因为它会导致一些死锁条件。
答案 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()
,或者根据字符true
:DeleteOnSuccess == "true"
对其进行检查来解决此问题。
扩展方法的优势在于它还允许值"1"
和"True"
为true