Могу ли я проверить, существует ли переменная окружения в 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"
}
Другие вопросы по тегам