Декларативный трубопровод Jenkinsfile, определяющий динамические env vars
Я новичок в трубопроводе Дженкинса; Я определяю декларативный синтаксический конвейер и не знаю, смогу ли я решить мою проблему, потому что я не нашел решения.
В этом примере мне нужно передать переменную в ansible плагин (в старой версии я использую ENV_VAR или вставлять его из файла с помощью плагина inject), эта переменная происходит из скрипта.
Это мой идеальный сценарий (но он не работает, потому что среда {}):
pipeline {
agent { node { label 'jenkins-node'}}
stages {
stage('Deploy') {
environment {
ANSIBLE_CONFIG = '${WORKSPACE}/chimera-ci/ansible/ansible.cfg'
VERSION = sh("python3.5 docker/get_version.py")
}
steps {
ansiblePlaybook credentialsId: 'example-credential', extras: '-e version=${VERSION}', inventory: 'development', playbook: 'deploy.yml'
}
}
}
}
Я попробовал другие способы проверить работу env vars в другом посте, например:
pipeline {
agent { node { label 'jenkins-node'}}
stages {
stage('PREPARE VARS') {
steps {
script {
env['VERSION'] = sh(script: "python3.5 get_version.py")
}
echo env.VERSION
}
}
}
}
но "echo env.VERSION" возвращает ноль.
Также попробовал тот же пример с: - VERSION = python3.5 get_version.py
- VERSION = python3.5 get_version.py
> props.file (и попытаться внедрить его, но не нашел как)
Если это невозможно, я сделаю это в роли.
ОБНОВИТЬ
В Ansible Plugin есть еще одна "проблема": чтобы использовать переменные в дополнительных переменных, они должны иметь двойные кавычки вместо одинарных.
ansiblePlaybook credentialsId: 'example-credential', extras: "-e version=${VERSION}", inventory: 'development', playbook: 'deploy.yml'
Ответы
Ответ 1
Вы можете создавать переменные перед запуском блока конвейера. Вы можете иметь sh
return stdout для назначения этим переменным. У вас нет такой же гибкости для назначения переменных среды в строфе environment
. Поэтому замените в python3.5 get_version.py
, где у меня есть echo 0.0.1
в script здесь (и убедитесь, что ваш python script просто возвращает версию в stdout):
def awesomeVersion = 'UNKNOWN'
pipeline {
agent { label 'docker' }
stages {
stage('build') {
steps {
script {
awesomeVersion = sh(returnStdout: true, script: 'echo 0.0.1')
}
}
}
stage('output_version') {
steps {
echo "awesomeVersion: ${awesomeVersion}"
}
}
}
}
Выходной сигнал вышеуказанного конвейера:
awesomeVersion: 0.0.1
Ответ 2
В Jenkins 2.76 мне удалось упростить решение от @burnettk до:
pipeline {
agent { label 'docker' }
environment {
awesomeVersion = sh(returnStdout: true, script: 'echo 0.0.1')
}
stages {
stage('output_version') {
steps {
echo "awesomeVersion: ${awesomeVersion}"
}
}
}
}
Ответ 3
Используя плагин "шаги утилиты" трубопровод ", вы можете определить общие вары, доступные на всех этапах из файла свойств. Например, пусть props.txt
как:
version=1.0
fix=alfa
и смешать скрипт и декларативный трубопровод Дженкинса как:
def props
def VERSION
def FIX
def RELEASE
node {
props = readProperties file:'props.txt'
VERSION = props['version']
FIX = props['fix']
RELEASE = VERSION + "_" + FIX
}
pipeline {
stages {
stage('Build') {
echo ${RELEASE}
}
}
}
Ответ 4
Вы также можете сбрасывать все ваши vars в файл, а затем использовать синтаксис "-e @file". Это очень полезно, если у вас много наростов для заполнения.
steps {
echo "hello World!!"
sh """
var1: ${params.var1}
var2: ${params.var2}
" > vars
"""
ansiblePlaybook inventory: _inventory, playbook: 'test-playbook.yml', sudoUser: null, extras: '-e @vars'
}