私はJenkinsパイプラインは初めてです。宣言的な構文パイプラインを定義していますが、解決策が見つからなかったため、問題を解決できるかどうかわかりません。
この例では、変数を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変数がどのように機能するかをテストする他の方法を試しました。
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」はnullを返します。
また、同じ例を試してみました:-VERSION = python3.5 get_version.py
-VERSION = python3.5 get_version.py
> props.file(それを注入しようとしましたが、どのように見つかりませんでした)
これが不可能な場合は、ansibleロールで実行します。
UPDATE
Ansible Pluginには別の「問題」があります。追加の変数で変数を使用するには、単一ではなく二重引用符が必要です。
ansiblePlaybook credentialsId: 'example-credential', extras: "-e version=${VERSION}", inventory: 'development', playbook: 'deploy.yml'
パイプラインブロックが開始する前に変数を作成できます。 sh
にstdoutを返させて、これらの変数に割り当てることができます。 environment
スタンザの環境変数に割り当てるのと同じ柔軟性はありません。ここでスクリプトのpython3.5 get_version.py
があるecho 0.0.1
で置き換えます(そして、pythonスクリプトが単にバージョンを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
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}"
}
}
}
}
「パイプラインユーティリティステップ」プラグインを使用して、プロパティファイルからすべてのステージで使用可能な一般的な変数を定義できます。たとえば、props.txt
を次のようにします。
version=1.0
fix=alfa
スクリプトと宣言型Jenkinsパイプラインを次のように組み合わせます。
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}
}
}
}
すべての変数をファイルにダンプしてから、「-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'
}