Как назначить переменную env в середине задания Дженкинса

#java #jenkins #groovy #jenkins-pipeline

#java #дженкинс #groovy #дженкинс-конвейер

Вопрос:

У меня есть файл Jenkins, содержащий конвейер. Я установил параметр, который может быть необязательным для передачи, а также задается значение по умолчанию, если параметр не задан:

 parameters {
    string(name: 'MY_VAR', defaultValue: 'foo', description: 'my var that can be optional')
}
 

В середине этапов я хотел бы переопределить (только несколько раз и только в том случае, если передаются некоторые другие конкретные параметры) этот ‘my_var’ с некоторым другим значением.

Пока это работает:

         stage('Build') {
            steps {
                env.MY_VAR="foobar"
            }
        }
 

но я хотел бы прочитать эту переменную из файла, поэтому я хотел бы сделать что-то вроде:

         stage('Build') {
            steps {
                // Of course none of following work
                env.MY_VAR=$(cat /tmp/my-file)
               
                //or
                sh "new_var=$(cat /tmp/my-file)"
                env.MY_VAR=$new_var 
            }
        }
 

Как я могу этого добиться?

Ответ №1:

Я полагаю, вам нужно использовать блок сценариев. Определение переменных в блоке скрипта позволит вам использовать их во всем конвейере, а не только на отдельном этапе.

 stage ('Build') {
  steps {
    script {
      env.MY_VAR=sh returnStdout: true, script: """ cat /tmp/my-file """
      echo "${env.MY_VAR}"
    }
  }
}
 

Ответ №2:

На самом деле вы можете использовать любую из библиотек groovy внутри инструкции script. Например, вы можете использовать класс File для чтения текстовых файлов:

 
pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                script {
                    def filePath = "/tmp/my-file"
                    env.VAR = new File(filePath).text
                }
            }
        }
        stage('Test') {
            steps {
                echo env.VAR
            }
        }
    }
}
 

Комментарии:

1. это выглядит чистым ответом и, вероятно, сработало бы, но в моей настройке jenkins я получил следующую ошибку: RejectedAccessException: Scripts not permitted to use new java.io.File java.lang.String . У меня нет доступа к настройкам Jenkins, но это тоже выглядит чистым решением.