read - Jenkinsfile Declarative Pipeline que define las env vars dinámicas
jenkins set environment variables (4)
Soy nuevo en la tubería de Jenkins, estoy definiendo una canalización de sintaxis declarativa y no sé si puedo resolver mi problema, porque no encuentro una solución.
En este ejemplo, necesito pasar una variable a un complemento de ansible (en la versión anterior uso un ENV_VAR o inyectándolo desde un archivo con un complemento de inyección, esa variable proviene de un script
Este es mi escenario perfecto (pero no funciona porque el entorno {}):
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''
}
}
}
}
Probé otras formas de probar cómo funcionan las variables env en otras publicaciones, por ejemplo:
pipeline {
agent { node { label ''jenkins-node''}}
stages {
stage(''PREPARE VARS'') {
steps {
script {
env[''VERSION''] = sh(script: "python3.5 get_version.py")
}
echo env.VERSION
}
}
}
}
pero "echo env.VERSION" devuelve null.
También probé el mismo ejemplo con: - VERSION = python3.5 get_version.py
- VERSION = python3.5 get_version.py
> props.file (y trate de inyectarlo, pero no encontré cómo)
Si esto no es posible, lo haré en el rol de ansible.
ACTUALIZAR
Hay otro "problema" en Ansible Plugin, para usar vars en vars adicionales, debe tener comillas dobles en lugar de simples.
ansiblePlaybook credentialsId: ''example-credential'', extras: "-e version=${VERSION}", inventory: ''development'', playbook: ''deploy.yml''
En Jenkins 2.76 pude simplificar la solución de @burnettk a:
pipeline {
agent { label ''docker'' }
environment {
awesomeVersion = sh(returnStdout: true, script: ''echo 0.0.1'')
}
stages {
stage(''output_version'') {
steps {
echo "awesomeVersion: ${awesomeVersion}"
}
}
}
}
Puede crear variables antes de que comience el bloque de canalización. Puede tener sh
retorno stdout para asignar a estas variables. No tiene la misma flexibilidad para asignar variables de entorno en la stanza de environment
. Así que sustitúyalo en python3.5 get_version.py
donde tengo echo 0.0.1
en el script aquí (y asegúrese de que su script de python solo devuelva la versión a 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 salida de la tubería anterior es:
awesomeVersion: 0.0.1
También puede volcar todas sus vars en un archivo y luego usar la sintaxis ''-e @file''. Esto es muy útil si tiene muchas variables para poblar.
steps {
echo "hello World!!"
sh """
var1: ${params.var1}
var2: ${params.var2}
" > vars
"""
ansiblePlaybook inventory: _inventory, playbook: ''test-playbook.yml'', sudoUser: null, extras: ''-e @vars''
}
Utilizando el complemento "pasos de la utilidad de canalización", puede definir vars generales disponibles para todas las etapas desde un archivo de propiedades. Por ejemplo, vamos a props.txt
como:
version=1.0
fix=alfa
y mezclar el script y el pipeline declarativo de Jenkins como:
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}
}
}
}