Хранение списка значений в переменной среды в декларативном конвейере Дженкинса - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть следующий конвейер, но я не знаю, почему он не работает в первой строке кода:

pipeline {
    agent any
    environment {
        def mypods = []
    }
    stages {
        stage('Getting pods') {
            steps {
                script {
                   withKubeConfig(caCertificate: '.....', credentialsId: '.....', serverUrl: '.....') {
                       env.mypods = sh "kubectl get pod | grep Running | awk '{print \$1}'"
                    }
                }
            }
        }
        stage('Print pods') {
            steps {
                script {
                    mypods.each {
                        println "Item: $it"
                    }
                }
            }
        }
    }
}

Мне нужно использовать список, потому что команда kubectl get pods возвращает списокстручков, поэтому я должен сохранить и использовать их на этапах.Как я могу создать список по декларативному конвейеру?Заранее спасибо.

Это ошибка:

Running in Durability level: MAX_SURVIVABILITY
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 4: Environment variable values must either be single quoted, double quoted, or function calls. @ line 4, column 22.
           def mypods = []
                        ^

WorkflowScript: 3: No variables specified for environment @ line 3, column 5.
       environment {
       ^

2 errors

    at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)
    at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1085)
    at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:603)
    at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:581)
    at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:558)
    at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
    at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
    at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)
    at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
    at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.doParse(CpsGroovyShell.java:131)
    at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:125)
    at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:560)
    at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:521)
    at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:320)
    at hudson.model.ResourceController.execute(ResourceController.java:97)
    at hudson.model.Executor.run(Executor.java:429)
Finished: FAILURE

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Декларативный конвейер имеет некоторые ограничения, если речь идет о его синтаксисе.Вы видите эту ошибку, потому что в блоке environment вы можете назначить только два типа выражений:

  • строки (одинарные или двойные кавычки)
  • значения возвращаются из вызовов функций

Однако вы должны знать, что переменные среды хранят только строковые значения, поэтому, если вы возвращаете массив (или любой другой тип из) из вызова функции, он будет автоматическипреобразован в представление toString().

pipeline {
    agent any 

    environment {
        MYPODS = getPods()
    }

    stages {
        stage("Test") {
            steps {
                script {
                    println "My pods = ${env.MYPODS}"
                }
            }
        }
    }
}

def getPods() {
    return ['pod1', 'pod2']
}

Вывод на консоль:

[Pipeline] node
[Pipeline] {
[Pipeline] withEnv
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Test)
[Pipeline] script (hide)
[Pipeline] {
[Pipeline] echo
<java.lang.String@ed6c7b35 value=[pod1, pod2] hash=-311657675>
[Pipeline] echo
MYPODS = [pod1, pod2]
[Pipeline] echo
Item: [
[Pipeline] echo
Item: p
[Pipeline] echo
Item: o
[Pipeline] echo
Item: d
[Pipeline] echo
Item: 1
[Pipeline] echo
Item: ,
[Pipeline] echo
Item:  
[Pipeline] echo
Item: p
[Pipeline] echo
Item: o
[Pipeline] echo
Item: d
[Pipeline] echo
Item: 2
[Pipeline] echo
Item: ]
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

Решение

Если вы хотите сохранить список строковых значений, вы можете определитьэто как одна строка значений, разделенных символом ,.В этом случае вы можете просто разбить его на список значений.Рассмотрим следующий пример:

pipeline {
    agent any 

    environment {
        MYPODS = 'pod1,pod2,pod3'
    }

    stages {
        stage("Test") {
            steps {
                script {
                    MYPODS.tokenize(',').each {
                        println "Item: ${it}"
                    }
                }
            }
        }
    }
}

Вывод:

[Pipeline] node
[Pipeline] {
[Pipeline] withEnv
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Test)
[Pipeline] script
[Pipeline] {
[Pipeline] echo
Item: pod1
[Pipeline] echo
Item: pod2
[Pipeline] echo
Item: pod3
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
0 голосов
/ 13 февраля 2019

ваша среда должна быть после агента

pipeline {

agent any
environment {
    def mypods = []
}
stages {
    stage('Getting pods') {
        steps {
            script {
               withKubeConfig(caCertificate: '.....', credentialsId: '.....', serverUrl: '.....') {
                    env.mypods = sh "kubectl get pod | grep Running | awk '{print \$1}'"
                }
            }
        }
    }
    stage('Print pods') {
        steps {
            script {
                mypods.each {
                    println "Item: $it"
                }
            }
        }
    }
}

}

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