Ich bin neu in Jenkins Pipeline, definiere eine deklarative Syntax-Pipeline und weiß nicht, ob ich mein Problem lösen kann, weil ich keine Lösung finde.
In diesem Beispiel muss ich eine Variable an ein anpassbares Plugin übergeben (in der alten Version verwende ich eine ENV_VAR-Datei oder injiziere sie aus einer Datei mit Injection-Plugin). Diese Variable stammt aus einem Skript.
Dies ist mein perfektes Szenario (aber es funktioniert nicht in der Umgebung {}):
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'
}
}
}
}
Ich habe andere Möglichkeiten ausprobiert, um zu testen, wie Env vars in einem anderen Post funktionieren. Beispiel:
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" gibt jedoch null zurück.
Auch das gleiche Beispiel habe ich mit: - VERSION = python3.5 get_version.py
- VERSION = python3.5 get_version.py
> props.file ausprobiert (und versuchen, es einzuspritzen, aber nicht gefunden wie)
Wenn dies nicht möglich ist, mache ich es in der ansprechbaren Rolle.
UPDATE
Es gibt ein weiteres "Problem" in Ansible Plugin. Um Variablen in zusätzlichen Variablen zu verwenden, müssen doppelte Anführungszeichen anstelle von einfachen Anführungszeichen verwendet werden.
ansiblePlaybook credentialsId: 'example-credential', extras: "-e version=${VERSION}", inventory: 'development', playbook: 'deploy.yml'
Sie können Variablen erstellen, bevor der Pipeline-Block beginnt. Sie können sh
stdout zurückgeben, um diese Variablen zuzuweisen. Sie haben nicht die gleiche Flexibilität, um Umgebungsvariablen in der Zeilengruppe environment
zuzuweisen. Ersetzen Sie also in python3.5 get_version.py
, wo ich echo 0.0.1
im Skript hier habe (und stellen Sie sicher, dass Ihr Python-Skript nur die Version an stdout zurückgibt):
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}"
}
}
}
}
Die Ausgabe der obigen Pipeline ist:
awesomeVersion: 0.0.1
In Jenkins 2.76 konnte ich die Lösung von @burnettk vereinfachen:
pipeline {
agent { label 'docker' }
environment {
awesomeVersion = sh(returnStdout: true, script: 'echo 0.0.1')
}
stages {
stage('output_version') {
steps {
echo "awesomeVersion: ${awesomeVersion}"
}
}
}
}
Mit dem Plugin "Pipeline-Dienstprogrammschritte" können Sie allgemeine Variablen definieren, die für alle Stufen in einer Eigenschaftendatei verfügbar sind. Lassen Sie zum Beispiel props.txt
als:
version=1.0
fix=alfa
und mischen Sie Skript und deklarative Jenkins-Pipeline wie folgt:
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}
}
}
}
Sie können auch alle Ihre Variablen in eine Datei sichern und dann die Syntax '-e @file' verwenden. Dies ist sehr nützlich, wenn Sie viele Variablen auffüllen müssen.
steps {
echo "hello World!!"
sh """
var1: ${params.var1}
var2: ${params.var2}
" > vars
"""
ansiblePlaybook inventory: _inventory, playbook: 'test-playbook.yml', sudoUser: null, extras: '-e @vars'
}