Я недавно столкнулся с чем-то вроде загадки, работая над некоторыми сборками 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?Какими должны быть эти отношения и почему они кажутся противоречивыми?