詹金斯管道如果不工作

时间:2017-04-24 12:21:55

标签: jenkins groovy

我正在创建一个示例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') {
           ^

但是当我执行以下示例from this url时,它会成功执行并打印else部分。

node {
    stage('Example') {
        if (env.BRANCH_NAME == 'master') {
            echo 'I only execute on the master branch'
        } else {
            echo 'I execute elsewhere'
        }
    }
}

我能看到的唯一区别是,在工作示例中没有stages但在我的情况下它有。{/ p>

这里有什么问题,有人可以建议吗?

4 个答案:

答案 0 :(得分:72)

您的第一次尝试是使用声明性管道,第二次尝试使用脚本化管道。您需要在步骤声明中包含步骤,并且您不能将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'
                    }
                }
            }
        }
    }
}

你可以通过使用"当"来简化这个并且可能避免if语句(只要你不需要其他语句)。参见"何时指令"在https://jenkins.io/doc/book/pipeline/syntax/。你也可以使用jenkins rest api验证jenkinsfiles。它非常甜蜜。在jenkins中使用声明性管道获得乐趣!

答案 1 :(得分:19)

它需要一些重新排列,但when可以很好地替换上面的条件。以下是使用声明性语法编写的上述示例。请注意,test3阶段现在是两个不同的阶段。一个在主分支上运行,另一个在其他任何分支上运行。

stage ('Test 3: Master') {
    when { branch 'master' }
    steps { 
        echo 'I only execute on the master branch.' 
    }
}

stage ('Test 3: Dev') {
    when { not { branch 'master' } }
    steps {
        echo 'I execute on non-master branches.'
    }
}

答案 2 :(得分:1)

如果您想创建一个条件来仅根据表达式执行一个阶段,您可以使用关键字 when

stage ('test3'){
    when { expression { return env.BRANCH_NAME == 'master'} }
    steps {
           echo 'I only execute on the master branch.'
          }
    }
}

使用 expression 关键字可以添加任何条件。

例如如果 stage 依赖于工作区中生成的文件。

stage ('File Dependent stage'){
 when { expression { return fileExists ('myfile') } }
    steps {
           echo "file exists"
          }
    }
}

答案 3 :(得分:-2)

        if ( params.build_deploy == '1' ) {
            println "build_deploy 是 ${params.build_deploy}"
              jobB = build job: 'k8s-core-user_deploy', propagate: false, wait: true, parameters: [
                         string(name:'environment', value: "${params.environment}"),
                         string(name:'branch_name', value: "${params.branch_name}"),
                         string(name:'service_name', value: "${params.service_name}"),                      
                     ]
            println jobB.getResult()
        }