Сценарий Jenkins: невозможно распечатать переменные внутри оболочки и установить значения переменных в оболочке - PullRequest
2 голосов
/ 28 февраля 2020

Дженкинс сценарий конвейера. Две проблемы:

  1. У меня есть глобальная переменная var, к значению которой я пытаюсь получить доступ внутри оболочки. Но он ничего не печатает
  2. Значение переменной, которое я устанавливаю на одном из этапов, используя shell-скрипт, для доступа на следующем этапе, но ничего не печатает в оболочке.

Что я скучаю? (См. Скрипт ниже)

node {    
    var=10
    stage('HelloWorld') {
        sh '''
              echo "Hello World. Var=$var"  ===> Prints nothing for var
              var=20'''

    }
    stage('git clone') {
        echo "Cloning git. Var = $var"  ==> Prints 20, and not 10
        sh '''
          echo "Var in second stage is = $var"   ===> Doesnt print anything here. I need 20.
        '''
    }
}

Ответы [ 2 ]

2 голосов
/ 28 февраля 2020

С помощью withEnv мы можем определить & затем получить доступ к глобальным переменным и на уровне этапа, если вы используете декларативный конвейер. Для сценариев мы можем использовать временный файл для доступа между этапами, как показано ниже, что дает желаемый результат.

node {    
    withEnv(['var=10']){
    stage('HelloWorld') {
        sh '''
              echo "Hello World. Var=$var" # This will print 10 from Global scope declared & defined with withEnv
              var=20
              # Hold that value in a file
              echo 20 > ${WORKSPACE}/some.file 
        '''

    }
    stage('git clone') {
        echo "Cloning git. Var = $var"  // This will print 10 as well!
        sh '''
          v=$(<${WORKSPACE}/some.file)
          echo "Var in second stage is = $v"   # Get variable value from prior stage
          rm -f ${WORKSPACE}/some.file
        '''
    }

    }
}
2 голосов
/ 28 февраля 2020

1. Передайте переменную groovy в оболочку

Ваш образец не работает, потому что вы используете строковый литерал с одинарными кавычками. Из Groovy manual (выделено мое):

Любое выражение Groovy может быть интерполировано во все строковые литералы, кроме single и тройные одинарные кавычки строки.

Попробуйте это:

sh "echo 'Hello World. Var=$var'"

Или это:

sh """
    echo 'Hello World. Var=$var'
    echo 'More stuff'
"""        

2. Установка переменной Groovy из оболочки

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

Вернуть одно целое число

Передать true для параметра returnStatus и установить код выхода из сценарий оболочки, который будет возвращаемым значением шага sh.

var = sh script: 'exit 42', returnStatus: true
echo "$var"   // prints 42

Вернуть одну строку

Pass true для параметра returnStdout и использовать echo из сценарий оболочки для вывода строковых данных.

var = sh script: "echo 'the answer is 42'", returnStdout: true
echo "$var"   // prints "the answer is 42"  

возврат структурированных данных

передача true для параметра returnStdout и использование echo из сценария оболочки для вывода строковых данных в JSON формат.

Анализ JSON данных в коде Groovy с использованием JsonSlurper. Теперь у вас есть обычный Groovy объект, который вы можете запросить.

def jsonStr = sh returnStdout: true, script: """
    echo '{
        "answer": 42,
        "question": "what is 6 times 7"
    }'
"""

def jsonData = new groovy.json.JsonSlurper().parseText( jsonStr ) 
echo "answer: $jsonData.answer"
echo "question: $jsonData.question"
...