Могу ли я проверить, существует ли переменная окружения в Jenkinsfile
Я использую многоотраслевой конвейер для моего проекта.
Поведение Jenkinsfile должно меняться в зависимости от триггера. Существует два события, которые запускают конвейер 1. Событие Push 2. Запрос Pull.
Я пытаюсь проверить переменную среды "CHANGE_ID" ("CHANGE_ID" будет доступен только для запроса извлечения). Ссылка
Таким образом, если конвейер запускается событием Push и если проверяется переменная CHANGE_ID, то генерируется исключение (код работает нормально, если конвейер запускается по запросу Pull).
Код:
stage('groovyTest'){
node('mynode1') {
if (CHANGE_ID!=NULL){
echo "This is Pull request"
}else{
echo "This is Push request"
}
}
}
Ошибка:
groovy.lang.MissingPropertyException: No such property: CHANGE_ID for class: groovy.lang.Binding
at groovy.lang.Binding.getVariable(Binding.java:63)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetProperty(SandboxInterceptor.java:224)
at org.kohsuke.groovy.sandbox.impl.Checker$4.call(Checker.java:241)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.java:238)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.java:221)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.java:221)
at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.getProperty(SandboxInvoker.java:28)
at com.cloudbees.groovy.cps.impl.PropertyAccessBlock.rawGet(PropertyAccessBlock.java:20)
at WorkflowScript.run(WorkflowScript:5)
at ___cps.transform___(Native Method)
Как я могу проверить, существует ли переменная CHANGE_ID в Jenkinsfile?
4 ответа
Вы можете проверить это перед использованием:
if (env.CHANGE_ID) {
...
Из документа
Переменные среды, доступные из Scripted Pipeline, например:
env.PATH
или жеenv.BUILD_ID
, Обратитесь к встроенному справочнику по глобальным переменным для получения полного и актуального списка переменных среды, доступных в Pipeline.
Вот как это будет выглядеть для декларативного конвейера:
pipeline {
// ...
stages {
// ...
stage('Build') {
when {
allOf {
expression { env.CHANGE_ID != null }
expression { env.CHANGE_TARGET != null }
}
}
steps {
echo "Building PR #${env.CHANGE_ID}"
}
}
}
}
Чтобы запустить сцену только тогда, когда не строится пиар:
when { expression { env.CHANGE_ID == null } }
Вы также можете использовать changeRequest()
функция в предложении when для проверки PR:
when {
anyOf {
changeRequest() // if pull request
branch 'master'
branch 'release/*'
}
}
кое-что, что нужно знать (или хотя бы догадаться) заранее:
- Среда выполнения Jenkins Groovy использует объект(?) для управления текущими переменными среды - это означает, что не гарантируется, что какие-либо
env
член также будет присутствовать в системе «привязки» - некоторые члены, такие как WORKSPACE, могут присутствовать только при работе в контексте, охватываемом узлом/агентом/ws.
- некоторые/все(?) участники присутствуют в то же время, что и
- пытаюсь получить доступ к несуществующему участнику для
env.<name>
приведет к нулю, в то время как для того же случая доступ<name>
вызовет ошибку. - существуют специальные члены, которые не смогут найти их через привязку или аналогичные системы классов.
поэтому я бы рекомендовал реализовать код, который выглядит примерно так:
if (env.WORKSPACE != null) {
println "WORKSPACE=${WORKSPACE}" // or ${env.WORKSPACE}
// checking for an empty string value is now a simple story.
} else {
println "WORKSPACE is null"
}