一尘不染

詹金斯管道如果不起作用

jenkins

我正在创建一个示例詹金斯管道,这是代码。

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但在我的情况下有。

这是怎么了,有人可以建议吗?


阅读 250

收藏
2020-07-25

共1个答案

一尘不染

您的第一个尝试是使用声明性管道,第二个可以使用的是脚本化管道。您需要将步骤括在步骤声明中,并且不能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。超级甜 在詹金斯中使用声明性管道玩得开心!

2020-07-25