Загрузить файл с переменными среды Jenkins Pipeline

Я делаю простой трубопровод:

Сборка - > Постановка - > Производство

мне нужны разные переменные среды для постановки и производства, поэтому я пытаюсь источник переменные.

sh 'source $JENKINS_HOME/.envvars/stacktest-staging.sh' 

но он возвращает не нашел

[Stack Test] Running shell script
+ source /var/jenkins_home/.envvars/stacktest-staging.sh
/var/jenkins_home/workspace/Stack Test@tmp/durable-bcbe1515/script.sh: 2: /var/jenkins_home/workspace/Stack Test@tmp/durable-bcbe1515/script.sh: source: not found

путь правильный, потому что я запускаю ту же команду, когда я регистрируюсь через ssh, и он отлично работает.

вот трубопровод идея:

node {
    stage name: 'Build'
    // git and gradle build OK
    echo 'My build stage'

    stage name: 'Staging'
    sh 'source $JENKINS_HOME/.envvars/stacktest-staging.sh' // PROBLEM HERE
    echo '$DB_URL' // Expects http://production_url/my_db
    sh 'gradle flywayMigrate' // To staging
    input message: "Does Staging server look good?"    

    stage name: 'Production'
    sh 'source $JENKINS_HOME/.envvars/stacktest-production.sh'
    echo '$DB_URL' // Expects http://production_url/my_db
    sh 'gradle flywayMigrate' // To production
    sh './deploy.sh'
}

Что делать?

  • я думал о том, чтобы не использовать конвейер (но я не смогу использовать свой Jenkinsfile).
  • или сделать различные задания для постановки и производства, используя плагин EnvInject (но я теряю свой вид сцены)
  • или сделать withEnv (но код становится большим, потому что сегодня я работаю с 12 env vars)

2 ответов


один из способов загрузки переменных среды из файла-загрузить файл Groovy.

например:

  1. предположим, у вас есть заводной файл в '$JENKINS_HOME/.envvars "называется" stacktest-постановка.груви'.
  2. внутри этого файла вы определяете 2 переменные среды, которые хотите загрузить

    env.DB_URL="hello"
    env.DB_URL2="hello2"
    
  3. затем вы можете загрузить это с помощью

    load "$JENKINS_HOME/.envvars/stacktest-staging.groovy"
    
  4. затем вы можете использовать их в последующие шаги Эхо / оболочки.

например, вот короткий трубопровод скрипт:

node {
   load "$JENKINS_HOME/.envvars/stacktest-staging.groovy"
   echo "${env.DB_URL}"
   echo "${env.DB_URL2}"
}

из комментариев к принято отвечать

Не используйте глобальный "env", но используйте конструкцию "withEnv", например см.: проблема №9: Не устанавливайте env vars с глобальным env в топ-10 лучших практик Jenkins Pipeline plugin

в следующем примере: VAR1-простая строка java (без расширения переменной groovy), VAR2-строка groovy (поэтому переменная 'someGroovyVar' расширена).

переданный скрипт является простой строкой java, поэтому $VAR1 и $VAR2 передаются буквально в оболочку, а echo обращаются к переменным среды VAR1 и VAR2.

stage('build') {
    def someGroovyVar = 'Hello world'
    withEnv(['VAR1=VALUE ONE',
             "VAR2=${someGroovyVar}"
            ]) {
        def result = sh(script: 'echo $VAR1; echo $VAR2', returnStdout: true)
        echo result
    }
}

для секретов / паролей вы можете использовать плагин привязки учетных данных

пример:

Примечание: CREDENTIALS_ID1-зарегистрированный секрет имени пользователя / пароля в настройках Jenkins.

stage('Push') {
    withCredentials([usernamePassword(
                         credentialsId: 'CREDENTIALS_ID1',
                         passwordVariable: 'PASSWORD',
                         usernameVariable: 'USER')]) {
        echo "User name: $USER"
        echo "Password:  $PASSWORD"
    }
}

вывод журнала консоли jenkisn скрывает реальные значения:

[Pipeline] echo
User name: ****
[Pipeline] echo
Password:  ****

Дженкинс и учетные данные-большая проблема, наверное, видите:плагин учетных данных

для полноты: большую часть времени нам нужны секреты в переменных среды, поскольку мы используем их из сценариев оболочки, поэтому мы объединяем withCredentials и withEnv следующим образом:

stage('Push') {
    withCredentials([usernamePassword(
                         credentialsId: 'CREDENTIALS_ID1',
                         passwordVariable: 'PASSWORD',
                         usernameVariable: 'USER')]) {
        withEnv(["ENV_USERNAME=${USER}",
                 "ENV_PASSWORD=${PASSWORD}"
            ]) {
                def result = sh(script: 'echo $ENV_USERNAME', returnStdout: true)
                echo result

        }
    }
}