Какова связь между окружающей средой и параметрами в параметризованных сборках Jenkinsfile? - PullRequest
0 голосов
/ 17 мая 2018

Я недавно столкнулся с чем-то вроде загадки, работая над некоторыми сборками Jenkins с коллегой.Он использует params.VARIABLE и env.VARIABLE взаимозаменяемо и не имеет проблем с этим.Тем временем я начал получать ошибки нулевого объекта при одном из его вызовов к параметру объекта через окружение в этой строке кода:

if(!deploy_environments.contains(env.ENVIRONMENT_NAME.trim()) || params.INVOKE_PARAMETERS ) {

ENVIRONMENT_NAME вот параметр.Я начал получать эту ошибку:

java.lang.NullPointerException: Cannot invoke method trim() on null object

Эта сборка выполняется как дочерняя для другой сборки.Параметр ENVIRONMENT_NAME передается дочернему элементу из родительской сборки.

Он вообще не видел этой ошибки на другом мастере Jenkins.Когда я изменил ссылку выше с env.ENVIRONMENT_NAME на params.ENVIRONMENT_NAME, проблема исчезла.

Я не смог найти ссылку на params == env в документации Jenkins, поэтому я создал сборку, чтобы попытаться выяснить их взаимосвязь.

pipeline {
    agent {
        label 'jenkins-ecs-slave'
    }
    environment {
        ENV_VARIABLE = 'Environment'
    }
    parameters {
        string(description: 'Parameter', name: 'PARAMETER_VARIABLE', defaultValue: 'Parameter')

    }
    stages {
       stage('Output Parameters'){
          steps {
             script {
                 echo "Environment: ${env.ENV_VARIABLE}"
                 echo "Parameter: ${params.PARAMETER_VARIABLE}"
                 echo "Environment from params: ${params.ENV_VARIABLE}"
                 echo "Parameter from Env: ${env.PARAMETER_VARIABLE}"
                 echo "Inspecific reference ENV_VARIABLE: $ENV_VARIABLE"
                 echo "Inspecific reference PARAMETER_VARIABLE: $PARAMETER_VARIABLE"
                 sh 'echo "Shell environment: $ENV_VARIABLE"'
                 sh 'echo "Shell parameter: $PARAMETER_VARIABLE"'                  
             }
           }
       }
    }
}

Первый раз, когда я запустил это на моем Jenkinsмастер, он включал только первые четыре строки (echo env.ENV, echo param.PARAM, echo env.PARAM, echo param.ENV), он преуспел со следующим выводом:

[Pipeline] {
[Pipeline] withEnv
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Output Parameters)
[Pipeline] script
[Pipeline] {
[Pipeline] echo
Environment: Environment
[Pipeline] echo
Parameter: Parameter
[Pipeline] echo
Environment from params: null
[Pipeline] echo
Parameter from Env: null
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

И я подумал: «Ага!»Задача решена.Они не одинаковы.

Однако эта коробка вскоре замерзла на мне и отказалась ставить в очередь больше сборок.Я еще не закончил отладку, но нет ничего удивительного в том, что этот мастер только что испортил.

Так что я пошел и запустил его на третьем мастере Дженкинса, который у нас есть.Именно в этот момент я добавил дополнительные строки, которые вы видите в сценарии выше, для дальнейшего разъяснения.Когда я в первый раз запустил этот скрипт в этом окне, он завершился ошибкой в ​​«Неопределенной ссылке на строку $ PARAMETER_VARIABLE» со следующим выводом:

[Pipeline] {
[Pipeline] withEnv
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Output Parameters)
[Pipeline] script
[Pipeline] {
[Pipeline] echo
Environment: Environment
[Pipeline] echo
Parameter: Parameter
[Pipeline] echo
Environment from params: null
[Pipeline] echo
Parameter from Env: null
[Pipeline] echo
Inspecific reference ENV_VARIABLE: Environment
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
groovy.lang.MissingPropertyException: No such property: PARAMETER_VARIABLE for class: groovy.lang.Binding

Хорошо, пока все хорошо.Это имеет смысл.Они не одинаковы.Вы можете ссылаться на переменные окружения в echos и shells без конкретной ссылки на объект окружения, но не можете делать то же самое с параметрами.Последовательно, разумно, у меня все хорошо.

Итак, я удалил две строки, выполняя «неспецифическую ссылку», и сценарий завершился следующим выводом:

[Pipeline] {
[Pipeline] withEnv
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Output Parameters)
[Pipeline] script
[Pipeline] {
[Pipeline] echo
Environment: Environment
[Pipeline] echo
Parameter: Parameter
[Pipeline] echo
Environment from params: null
[Pipeline] echo
Parameter from Env: Parameter
[Pipeline] sh
[Environment Testing] Running shell script
+ echo 'Shell environment: Environment'
Shell environment: Environment
[Pipeline] sh
[Environment Testing] Running shell script
+ echo 'Shell parameter: Parameter'
Shell parameter: Parameter
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

А теперьЯ полностью сбит с толку.Что за черт?Я запускал его пару раз, просто чтобы быть уверенным, и получал тот же успешный результат, что и выше, последовательно.

Конечно, ни одна из предыдущих сборок, которые показывали env.PARAM как null, действительно не преуспела в чистой среде (та, которая преуспела, была в среде, которая вскоре была взорвана мной).Так что, может быть, если в конвейере Дженкинса есть ошибка, он замыкает загрузку параметров в среду или что-то в этом роде?Я попытался добавить echo "$I_SHOULD_FAIL" в скрипт, чтобы вызвать ошибку в попытке воспроизвести то, что я видел.Без кости:

[Pipeline] {
[Pipeline] withEnv
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Output Parameters)
[Pipeline] script
[Pipeline] {
[Pipeline] echo
Environment: Environment
[Pipeline] echo
Parameter: Parameter
[Pipeline] echo
Environment from params: null
[Pipeline] echo
Parameter from Env: Parameter
[Pipeline] sh
[Environment Testing] Running shell script
+ echo 'Shell environment: Environment'
Shell environment: Environment
[Pipeline] sh
[Environment Testing] Running shell script
+ echo 'Shell parameter: Parameter'
Shell parameter: Parameter
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
groovy.lang.MissingPropertyException: No such property: I_SHOULD_FAIL for class: groovy.lang.Binding

Так что здесь происходит?Какая связь между environment и parameters в конвейерах Jenkins?Какими должны быть эти отношения и почему они кажутся противоречивыми?

1 Ответ

0 голосов
/ 17 мая 2018

В основном это работает следующим образом

  • env содержит все переменные окружения
  • конвейер Jenkins автоматически создает глобальную переменную длякаждая переменная среды
  • params содержит все параметры сборки
  • Jenkins также автоматически создает переменную среды для каждого параметра сборки (и, как следствие второй точки, глобальную переменную).

Переменные среды могут быть переопределены или не заданы, но params является неизменной картой и не может быть изменена.Лучше всего всегда использовать params, когда вам нужно получить параметр сборки.

...