scripts - ¿Cómo enumerar todas las propiedades `env` dentro del trabajo de canalización jenkins?
jenkinsfile scripts (12)
Dada una canalización de compilación de jenkins 2.1, jenkins inyecta una variable
env
en el
node{}
.
Por ejemplo, se puede acceder a
BRANCH_NAME
con
node {
echo ${env.BRANCH_NAME}
...
Quiero hacer eco de
todas las
propiedades
env
dentro de la tubería jenkins.
Estoy buscando un código como
node {
for(e in env){
echo e + " is " + ${e}
}
...
que haría eco de algo como
BRANCH_NAME is myBranch2
CHANGE_ID is 44
...
¿Por qué toda esta complicación?
sh ''env''
hace lo que necesitas (bajo * nix)
Aquí hay un script rápido que puede agregar como trabajo de canalización para enumerar todas las variables de entorno:
node {
echo(env.getEnvironment().collect({environmentVariable -> "${environmentVariable.key} = ${environmentVariable.value}"}).join("/n"))
echo(System.getenv().collect({environmentVariable -> "${environmentVariable.key} = ${environmentVariable.value}"}).join("/n"))
}
Esto enumerará las variables del sistema y de Jenkins.
De acuerdo con la documentación de Jenkins para la tubería declarativa :
sh ''printenv''
Para la tubería con guión de Jenkins:
echo sh(script: ''env|sort'', returnStdout: true)
Lo anterior también clasifica sus entornos para mayor comodidad.
Forma multiplataforma de enumerar todas las variables de entorno:
if (isUnix()) {
sh env
}
else {
bat set
}
Las respuestas anteriores ahora son anticuadas debido a la nueva sintaxis de canalización. A continuación se imprimen las variables de entorno.
script {
sh ''env > env.txt''
String[] envs = readFile(''env.txt'').split("/r?/n")
for(String vars: envs){
println(vars)
}
}
Los siguientes trabajos:
@NonCPS
def printParams() {
env.getEnvironment().each { name, value -> println "Name: $name -> Value $value" }
}
printParams()
Tenga en cuenta que lo más probable es que falle en la primera ejecución y requiera que apruebe varios métodos geniales para ejecutarse en el sandbox de jenkins. Esto se hace en "administrar jenkins / aprobación de script en proceso"
La lista que obtuve incluía:
- BUILD_DISPLAY_NAME
- BUILD_ID
- BUILD_NUMBER
- BUILD_TAG
- BUILD_URL
- CAMINO DE CLASE
- HUDSON_HOME
- HUDSON_SERVER_COOKIE
- HUDSON_URL
- JENKINS_HOME
- JENKINS_SERVER_COOKIE
- JENKINS_URL
- JOB_BASE_NAME
- NOMBRE DEL TRABAJO
- JOB_URL
Otra forma de obtener exactamente el resultado mencionado en la pregunta:
envtext= "printenv".execute().text
envtext.split(''/n'').each
{ envvar=it.split("=")
println envvar[0]+" is "+envvar[1]
}
Esto se puede ampliar fácilmente para crear un mapa con un subconjunto de entornos que coincidan con un criterio:
envdict=[:]
envtext= "printenv".execute().text
envtext.split(''/n'').each
{ envvar=it.split("=")
if (envvar[0].startsWith("GERRIT_"))
envdict.put(envvar[0],envvar[1])
}
envdict.each{println it.key+" is "+it.value}
Otra forma más concisa:
node {
echo sh(returnStdout: true, script: ''env'')
// ...
}
cf. https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#code-sh-code-shell-script
Puede lograr el resultado usando
sh
/
bat
step y
readFile
:
node {
sh ''env > env.txt''
readFile(''env.txt'').split("/r?/n").each {
println it
}
}
Desafortunadamente,
env.getEnvironment()
devuelve un mapa muy limitado de variables de entorno.
Supongo que lo necesitabas en forma de script, pero si alguien más solo quiere echar un vistazo a la GUI de Jenkins, esa lista se puede encontrar seleccionando la sección "Variables de entorno" en el menú contextual izquierdo de cada compilación. Seleccionar proyecto = > Seleccione build => Variables de entorno
Utilizo el complemento Blue Ocean y no me gustó que cada entrada de entorno tenga su propio bloque. Quiero un bloque con todas las líneas.
Imprime mal:
sh ''echo `env`''
Imprime mal:
sh ''env > env.txt''
for (String i : readFile(''env.txt'').split("/r?/n")) {
println i
}
Imprime bien:
sh ''env > env.txt''
sh ''cat env.txt''
Se imprime bien: (como lo menciona @mjfroehlich)
echo sh(script: ''env'', returnStdout: true)
si realmente quieres recorrer la lista
env
simplemente haz lo siguiente:
def envs = sh(returnStdout: true, script: ''env'').split(''/n'')
envs.each { name ->
println "Name: $name"
}