Как установить и ссылаться на переменную в файле Jenkins

У меня есть декларативный сценарий конвейера для моего проекта с несколькими каналами, в котором я хотел бы прочитать текстовый файл и сохранить результат в виде строковой переменной, доступ к которой будет получен позже. Используя генератор фрагментов, я попытался сделать что-то вроде этого:

filename = readFile 'output.txt'

Для которого filename будет моей строкой.

Я получаю ошибку на выходе консоли Jenkins:

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 30: Expected a step @ line 30, column 5.
            filename = readFile 'output.txt'

Нужно ли использовать шаг withEnv для установки вывода readFile в переменную окружения Jenkins? Если да, то как?

благодаря

Ответ 1

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

Итак, в вашем случае:

pipeline {
    agent any
    stages {
        stage("foo") {
            steps {
                script {
                    env.FILENAME = readFile 'output.txt'
                }
                echo "${env.FILENAME}"
            }
        }
    }
}

Ответ 2

Согласно документации, вы также можете установить глобальные переменные среды, если позже вы захотите использовать значение переменной в других частях вашего скрипта. В вашем случае это будет установка его в корневой конвейер:

pipeline {
  ...
  environment {
    FILENAME = readFile ...
  }
  ...
}

Ответ 3

Мы обошли это, добавляя функции к шагу environment, то есть:

environment {
    ENVIRONMENT_NAME = defineEnvironment() 
}
...
def defineEnvironment() {
    def branchName = "${env.BRANCH_NAME}"
    if (branchName == "master") {
        return 'staging'
    }
    else {
        return 'test'
    }
}

Ответ 4

Полный пример для сценария:

       stage('Build'){
            withEnv(["GOPATH=/ws","PATH=/ws/bin:${env.PATH}"]) {
                sh 'bash build.sh'
            }
        }