Загрузить файл с переменными среды 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.
например:
- предположим, у вас есть заводной файл в '$JENKINS_HOME/.envvars "называется" stacktest-постановка.груви'.
-
внутри этого файла вы определяете 2 переменные среды, которые хотите загрузить
env.DB_URL="hello" env.DB_URL2="hello2"
-
затем вы можете загрузить это с помощью
load "$JENKINS_HOME/.envvars/stacktest-staging.groovy"
затем вы можете использовать их в последующие шаги Эхо / оболочки.
например, вот короткий трубопровод скрипт:
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
}
}
}