Je suis nouveau dans le pipeline Jenkins, je définis un pipeline de syntaxe déclarative et je ne sais pas si je peux résoudre mon problème, car je ne trouve pas de solution.
Dans cet exemple, je dois passer une variable au plugin ansible (dans l’ancienne version, j’utilisais ENV_VAR ou si je l’injectais à partir d’un fichier avec inject plugin, cette variable provient d’un script.
Ceci est mon décor parfait (mais cela ne fonctionne pas car environnement {}):
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'
}
}
}
}
J'ai essayé d'autres méthodes pour tester le fonctionnement de env vars dans d'autres publications, par exemple:
pipeline {
agent { node { label 'jenkins-node'}}
stages {
stage('PREPARE VARS') {
steps {
script {
env['VERSION'] = sh(script: "python3.5 get_version.py")
}
echo env.VERSION
}
}
}
}
mais "echo env.VERSION" renvoie null.
Aussi essayé le même exemple avec: - VERSION = python3.5 get_version.py
- VERSION = python3.5 get_version.py
> props.file (et essayez de l'injecter, mais n'a pas trouvé comment)
Si ce n'est pas possible, je le ferai dans le rôle ansible.
METTRE À JOUR
Il y a un autre "problème" dans Ansible Plugin, pour utiliser vars dans des vars supplémentaires, il doit avoir des guillemets doubles au lieu de simples.
ansiblePlaybook credentialsId: 'example-credential', extras: "-e version=${VERSION}", inventory: 'development', playbook: 'deploy.yml'
Vous pouvez créer des variables avant le début du bloc de pipeline. Vous pouvez avoir sh
return stdout à affecter à ces variables. Vous ne disposez pas de la même souplesse pour affecter des variables d'environnement dans la strophe environment
. Donc remplacez dans python3.5 get_version.py
où j'ai echo 0.0.1
dans le script ici (et assurez-vous que votre script python renvoie simplement la version à 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}"
}
}
}
}
La sortie du pipeline ci-dessus est:
awesomeVersion: 0.0.1
Dans Jenkins 2.76, j’ai pu simplifier la solution de @burnettk pour:
pipeline {
agent { label 'docker' }
environment {
awesomeVersion = sh(returnStdout: true, script: 'echo 0.0.1')
}
stages {
stage('output_version') {
steps {
echo "awesomeVersion: ${awesomeVersion}"
}
}
}
}
À l'aide du plug-in "Pipeline Utility Steps", vous pouvez définir des vars généraux disponibles pour toutes les étapes à partir d'un fichier de propriétés. Par exemple, laissez props.txt
comme:
version=1.0
fix=alfa
et mélangez le script et le pipeline déclaratif Jenkins en tant que:
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}
}
}
}
Vous pouvez également vider tous vos vars dans un fichier, puis utiliser la syntaxe '-e @file'. Ceci est très utile si vous avez beaucoup de vars à peupler.
steps {
echo "hello World!!"
sh """
var1: ${params.var1}
var2: ${params.var2}
" > vars
"""
ansiblePlaybook inventory: _inventory, playbook: 'test-playbook.yml', sudoUser: null, extras: '-e @vars'
}