Ik ben nieuw in de Jenkins-pijplijn; Ik definieer een declaratieve syntaxispijplijn en ik weet niet of ik mijn probleem kan oplossen, omdat ik geen oplossing heb gevonden.
In dit voorbeeld moet ik een variabele doorgeven aan een ansible-plug-in (in de oude versie gebruik ik een ENV_VAR of injecteer ik deze vanuit een bestand met inject-plug-in) die variabele komt uit een script.
Dit is mijn perfecte scenario (maar het werkt niet vanwege de omgeving{}):
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'
}
}
}
}
Ik heb andere manieren geprobeerd om te testen hoe env-vars werken in een andere post, bijvoorbeeld:
pipeline {
agent { node { label 'jenkins-node'}}
stages {
stage('PREPARE VARS') {
steps {
script {
env['VERSION'] = sh(script: "python3.5 get_version.py")
}
echo env.VERSION
}
}
}
}
maar “echo env.VERSION” retourneert null.
Ook hetzelfde voorbeeld geprobeerd met:
– VERSION=python3.5 get_version.py
– VERSION=python3.5 get_version.py
> props.file (en probeer het te injecteren, maar heb niet gevonden hoe)
Als dit niet mogelijk is, doe ik het in de ansible-rol.
UPDATE
Er is nog een “probleem” in de Ansible-plug-in, om vars in extra vars te gebruiken, moeten dubbele aanhalingstekens worden gebruikt in plaats van enkele.
ansiblePlaybook credentialsId: 'example-credential', extras: "-e version=${VERSION}", inventory: 'development', playbook: 'deploy.yml'
Antwoord 1, autoriteit 100%
U kunt variabelen maken voordat het pijplijnblok begint. U kunt sh
stdout laten retourneren om aan deze variabelen toe te wijzen. Je hebt niet dezelfde flexibiliteit om omgevingsvariabelen toe te wijzen in de environment
strofe. Dus vervang in python3.5 get_version.py
waar ik echo 0.0.1
in het script hier heb (en zorg ervoor dat je python-script de versie gewoon terugstuurt naar stdout):
def awesomeVersion = 'UNKNOWN'
pipeline {
agent { label 'docker' }
stages {
stage('build') {
steps {
script {
awesomeVersion = sh(returnStdout: true, script: 'echo 0.0.1').trim()
}
}
}
stage('output_version') {
steps {
echo "awesomeVersion: ${awesomeVersion}"
}
}
}
}
De uitvoer van de bovenstaande pijplijn is:
awesomeVersion: 0.0.1
Antwoord 2, autoriteit 22%
In Jenkins 2.76 kon ik de oplossing van @burnettk vereenvoudigen tot:
pipeline {
agent { label 'docker' }
environment {
awesomeVersion = sh(returnStdout: true, script: 'echo 0.0.1')
}
stages {
stage('output_version') {
steps {
echo "awesomeVersion: ${awesomeVersion}"
}
}
}
}
Antwoord 3, autoriteit 4%
Met behulp van de plug-in “pipeline utility steps” kunt u vanuit een eigenschappenbestand algemene vars definiëren die beschikbaar zijn voor alle fasen. Laat bijvoorbeeld props.txt
als:
version=1.0
fix=alfa
en mix script en declaratieve Jenkins-pijplijn als:
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}
}
}
}
Antwoord 4, autoriteit 2%
Een mogelijke variatie op het hoofdantwoord is om een variabele aan te bieden met een andere pijplijn in plaats van een sh-script.
voorbeeld (stel de variabele pijplijn in): mijn-set-env-variabelen pijplijn
script
{
env.my_dev_version = "0.0.4-SNAPSHOT"
env.my_qa_version = "0.0.4-SNAPSHOT"
env.my_pp_version = "0.0.2"
env.my_prd_version = "0.0.2"
echo " My versions [DEV:${env.my_dev_version}] [QA:${env.my_qa_version}] [PP:${env.my_pp_version}] [PRD:${env.my_prd_version}]"
}
(gebruik deze variabelen) in een andere pijplijn my-set-env-variables-test
script
{
env.dev_version = "NOT DEFINED DEV"
env.qa_version = "NOT DEFINED QA"
env.pp_version = "NOT DEFINED PP"
env.prd_version = "NOT DEFINED PRD"
}
stage('inject variables') {
echo "PRE DEV version = ${env.dev_version}"
script
{
// call set variable job
def variables = build job: 'my-set-env-variables'
def vars = variables.getBuildVariables()
//println "found variables" + vars
env.dev_version = vars.my_dev_version
env.qa_version = vars.my_qa_version
env.pp_version = vars.my_pp_version
env.prd_version = vars.my_prd_version
}
}
stage('next job') {
echo "NEXT JOB DEV version = ${env.dev_version}"
echo "NEXT JOB QA version = ${env.qa_version}"
echo "NEXT JOB PP version = ${env.pp_version}"
echo "NEXT JOB PRD version = ${env.prd_version}"
}
Antwoord 5
Je kunt ook al je vars in een bestand dumpen en dan de ‘-e @file’-syntaxis gebruiken. Dit is erg handig als je veel vars moet invullen.
steps {
echo "hello World!!"
sh """
var1: ${params.var1}
var2: ${params.var2}
" > vars
"""
ansiblePlaybook inventory: _inventory, playbook: 'test-playbook.yml', sudoUser: null, extras: '-e @vars'
}