Подтвердить что ты не робот

Трубопровод Дженкинса, если еще не работает

Я создаю образец 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 но в моем случае это имеет место.

Что здесь не так, может ли кто-нибудь предложить?

4b9b3361

Ответ 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'
                    }
                }
            }
        }
    }
}

Вы можете упростить это и потенциально избежать оператора if (если вам не нужно другое), используя "когда". Смотрите "когда директива" на https://jenkins.io/doc/book/pipeline/syntax/. Вы также можете проверить jenkinsfiles, используя api jenkins rest. это супер мило. веселитесь с декларативными конвейерами в jenkins!

Ответ 2

Это требует немного переупорядочения, но 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.'
    }
}