我正在创建一个示例詹金斯管道,这是代码。
pipeline { agent any stages { stage('test') { steps { sh 'echo hello' } } stage('test1') { steps { sh 'echo $TEST' } } stage('test3') { if (env.BRANCH_NAME == 'master') { echo 'I only execute on the master branch' } else { echo 'I execute elsewhere' } } } }
该管道失败,并显示以下错误日志
Started by user admin org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: WorkflowScript: 15: Not a valid stage section definition: "if (env.BRANCH_NAME == 'master') { echo 'I only execute on the master branch' } else { echo 'I execute elsewhere' }". Some extra configuration is required. @ line 15, column 9. stage('test3') { ^ WorkflowScript: 15: Nothing to execute within stage "test3" @ line 15, column 9. stage('test3') { ^
但是,当我从此url执行以下示例时,它将成功执行并打印else部分。
node { stage('Example') { if (env.BRANCH_NAME == 'master') { echo 'I only execute on the master branch' } else { echo 'I execute elsewhere' } } }
我可以看到的唯一区别是在工作示例中没有,stages但在我的情况下有。
stages
这是怎么了,有人可以建议吗?
您的第一个尝试是使用声明性管道,第二个可以使用的是脚本化管道。您需要将步骤括在步骤声明中,并且不能if用作声明式的顶层步骤,因此需要将其包装在script步骤中。这是一个有效的声明性版本:
if
script
pipeline { agent any stages { stage('test') { steps { sh 'echo hello' } } stage('test1') { steps { sh 'echo $TEST' } } stage('test3') { steps { script { if (env.BRANCH_NAME == 'master') { echo 'I only execute on the master branch' } else { echo 'I execute elsewhere' } } } } } }
您可以简化此过程,并可以通过使用“ when”来避免if语句(只要您不需要else)。请参阅https://jenkins.io/doc/book/pipeline/syntax/上的 “指令时” 。您还可以使用jenkins rest api验证jenkinsfiles。超级甜 在詹金斯中使用声明性管道玩得开心!