node - multibranch pipeline jenkins
Cómo establecer y hacer referencia a una variable en un archivo Jenkins (5)
Tengo un script de canalización declarativo para mi proyecto multibranquio en el que me gustaría leer un archivo de texto y almacenar el resultado como una variable de cadena a la que se accederá en un paso posterior en la tubería. Usando el generador de fragmentos intenté hacer algo como esto:
filename = readFile ''output.txt''
Para qué filename
sería mi cadena.
Me sale un error en la salida de la consola Jenkins:
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 30: Expected a step @ line 30, column 5.
filename = readFile ''output.txt''
¿Debo usar un paso withEnv
para configurar la salida de readFile
a una variable de entorno Jenkins? ¿Si es así, cómo?
Gracias
El error se debe a que solo se le permite usar pasos de canalización dentro de la directiva de steps
. Una solución que conozco es usar el paso de script
y envolver el guión de canalización arbitrario dentro de él y guardar el resultado en la variable de entorno para que pueda usarse más adelante.
Así que en tu caso:
pipeline {
agent any
stages {
stage("foo") {
steps {
script {
env.FILENAME = readFile ''output.txt''
}
echo "${env.FILENAME}"
}
}
}
}
No puedo comentar todavía, pero solo una sugerencia: use las cláusulas try / catch para evitar que se rompa la tubería (si está seguro de que el archivo existe, ignórelo)
pipeline {
agent any
stages {
stage("foo") {
steps {
script {
try {
env.FILENAME = readFile ''output.txt''
echo "${env.FILENAME}"
}
catch(Exception e) {
//do something i.e echo ''File not found''
}
}
}
}
Otra sugerencia (esto fue comentado por @hao, y creo que vale la pena compartirlo): es posible que desee recortar como este readFile (''output.txt''). Trim ()
Resolvimos esto agregando funciones al paso del environment
, es decir:
environment {
ENVIRONMENT_NAME = defineEnvironment()
}
...
def defineEnvironment() {
def branchName = "${env.BRANCH_NAME}"
if (branchName == "master") {
return ''staging''
}
else {
return ''test''
}
}
Un ejemplo completo para pipepline con guión:
stage(''Build''){
withEnv(["GOPATH=/ws","PATH=/ws/bin:${env.PATH}"]) {
sh ''bash build.sh''
}
}
De acuerdo con la documentación , también puede establecer variables de entorno globales si luego desea usar el valor de la variable en otras partes de su script. En su caso, lo estaría configurando en la tubería raíz:
pipeline {
...
environment {
FILENAME = readFile ...
}
...
}