Проблема при переносе сценария Jenkinsfile в декларативную среду enE {} => environment {} - PullRequest
0 голосов
/ 20 мая 2019

У меня проблема с переносом сценария в декларативный конвейер. Я имел обыкновение иметь в сценарии: // Scripted

def myEnv = [:]

stage ('Prepare my env') { [...] myEnv = ... }

stage ('Fancy stuff') {
    node() {
        withEnv(myEnv) {
        // here use what is defined in myEnv
        }
    }    
     stage ('Fancy stuff2') {
    node() {
        withEnv(myEnv) {
        // here use what is defined in myEnv
        } }    

}

и теперь в декларативном виде я бы хотел

// декларативного

def myEnv = [:]
 pipeline {

agent none

stage('Prepare my env') {
    steps {
        script {
            [...]
            myEnv = ...
        }
    }
}

stages {
    environment { myEnv }
    stage('Fancy stuff') {
        [...]
    }
    stage('Fancy stuff2') {
        [...]
    }
} }

когда я пытаюсь запустить это, происходит сбой с Env

org.codehaus.groovy.control.MultipleCompilationErrorsException: сбой запуска: WorkflowScript: xx: «myEnv» не является допустимой средой выражение. Используйте пары «ключ = значение» с допустимыми ключами Java / оболочки.

Достаточно справедливо. Что я должен сделать, чтобы иметь возможность использовать декларативную среду {}, чтобы не использовать withEnv (myEnv) каждый на каждом последующем шаге?

Ответы [ 2 ]

0 голосов
/ 20 мая 2019

Ваша проблема связана с типом вашей переменной myEnv. Вы определяете это как карту, когда делаете def myEnv = [:].

Таким образом, он работает с withEnv, что принимает карту в качестве параметра , но не работает с environment {...}, принимает только операторы "ключ = значение" .

Решение зависит от того, как вы добавляете переменные среды, содержащиеся в myEnv.

Самый простой способ - использовать директиву environment, перечислив все ключи / значения, содержащиеся в вашей прежней переменной myEnv:

pipeline{
    agent none
    environment {
        test1 = 'test-1'
        test2 = 'test-2'
    }
    stages{
        stage('Fancy stuff'){
            steps{
                echo "${test1}"
            }
        }
        stage('Fancy stuff2'){
            steps{
                echo "${test2}"
            }
        }
    }
}

Но вы также делаете это в сценарии :

pipeline{
    agent none
    stages{
        stage('Prepare my env') {
            steps {
                script {
                    def test = []
                    for (int i = 1; i < 3; ++i) {
                        test[i] = 'test-' + i.toString()
                    }
                    test1 = test[1]
                    test2 = test[2]
                }
            }
        }
        stage('Fancy stuff'){
            steps{
                echo "${test1}"
            }
        }
        stage('Fancy stuff2'){
            steps{
                echo "${test2}"
            }
        }
    }
}
0 голосов
/ 20 мая 2019

Похоже, что часть, которую вы пропустили, - это использование environment предложения.

Вместо

environment { myEnv }

Должно быть

environment { myEnvVal = myEnv }

Так же, как упоминает метод ошибки, это должна быть пара ключ = значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...