Introducción
Jenkins admite dos estilos de Pipeline. El Pipeline declarativo utiliza un bloque estructurado pipeline { ... }, mientras que el Pipeline basado en scripts (Scripted Pipeline) utiliza código Groovy con llamadas a node, stage y otros pasos. El Pipeline basado en scripts resulta útil cuando un flujo de trabajo requiere un control de flujo de Groovy más directo.
En este laboratorio, creará un trabajo de Pipeline llamado scripted-pipeline-demo, ejecutará un pipeline básico basado en scripts y luego lo actualizará con una condición if y un bloque de limpieza try/finally.
Escribir un Pipeline básico basado en scripts
En este paso, escribirá la primera versión de un Pipeline basado en scripts. El bloque node solicita a Jenkins que asigne un ejecutor y un espacio de trabajo. Dentro de él, stage nombra una parte visible del flujo de trabajo y sh ejecuta un comando de shell.
Cree el archivo /home/labex/project/scripted-pipeline.groovy:
cat > /home/labex/project/scripted-pipeline.groovy <<'GROOVY'
node {
stage('Prepare') {
echo 'Preparing scripted pipeline'
sh 'pwd'
}
stage('Build') {
echo 'Building with scripted syntax'
sh 'echo Compiling scripted pipeline demo'
}
}
GROOVY
Muestre el archivo con números de línea para revisar su estructura:
nl -ba /home/labex/project/scripted-pipeline.groovy
Debería ver un bloque node que contiene las etapas Prepare y Build.
Crear un trabajo de Pipeline a partir del script
En este paso, creará un trabajo de Pipeline de Jenkins que almacena el script de Groovy de forma integrada. Los trabajos de Pipeline de Jenkins se guardan como XML en /var/jenkins_home/jobs. Python se encargará de escapar el script de Groovy en formato XML antes de escribir la configuración del trabajo, de modo que caracteres como comillas y llaves se conserven de forma segura.
Genere la configuración del trabajo de Pipeline:
python3 - <<'PY'
from html import escape
from pathlib import Path
script = Path("/home/labex/project/scripted-pipeline.groovy").read_text()
config = f"""<?xml version='1.1' encoding='UTF-8'?>
<flow-definition plugin="workflow-job">
<actions/>
<description>Run a Jenkins scripted Pipeline example.</description>
<keepDependencies>false</keepDependencies>
<properties/>
<definition class="org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition" plugin="workflow-cps">
<script>{escape(script)}</script>
<sandbox>true</sandbox>
</definition>
<triggers/>
<disabled>false</disabled>
</flow-definition>
"""
Path("/home/labex/project/scripted-pipeline-config.xml").write_text(config)
PY
Copie la configuración del trabajo en Jenkins y recárguelo:
docker exec jenkins mkdir -p /var/jenkins_home/jobs/scripted-pipeline-demo
docker cp /home/labex/project/scripted-pipeline-config.xml jenkins:/var/jenkins_home/jobs/scripted-pipeline-demo/config.xml
/home/labex/project/reload-jenkins.sh
Confirme que Jenkins puede cargar el trabajo de Pipeline:
curl -fsS http://localhost:8080/job/scripted-pipeline-demo/api/json | grep -o '"name":"scripted-pipeline-demo"'
Ejecutar el Pipeline basado en scripts
En este paso, activará el trabajo de Pipeline e inspeccionará el resultado. Jenkins protege las solicitudes POST con un "crumb" (token de seguridad), por lo que el primer comando solicita un crumb y reutiliza el archivo de cookies correspondiente.
Active la primera compilación:
CRUMB=$(curl -fsS -c /tmp/jenkins-scripted-build.cookies 'http://localhost:8080/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)')
curl -fsS -b /tmp/jenkins-scripted-build.cookies -H "$CRUMB" -X POST http://localhost:8080/job/scripted-pipeline-demo/build
Espere hasta que la compilación #1 finalice:
until curl -fsS http://localhost:8080/job/scripted-pipeline-demo/1/api/json >/tmp/scripted-build-1.json 2>/dev/null && grep -q '"building":false' /tmp/scripted-build-1.json; do
echo "Waiting for scripted pipeline build #1..."
sleep 3
done
Compruebe el resultado de la compilación:
curl -fsS http://localhost:8080/job/scripted-pipeline-demo/1/api/json | grep -o '"result":"SUCCESS"'
El resultado exitoso demuestra que Jenkins aceptó la sintaxis del Pipeline basado en scripts y ejecutó los pasos de shell.
Añadir control de flujo de Groovy
En este paso, actualizará el Pipeline basado en scripts con control de flujo de Groovy. El bloque if decide si la etapa Test debe ejecutarse. El bloque try/finally asegura que el mensaje de limpieza se ejecute incluso si una etapa falla.
Reemplace el script del pipeline con una versión más completa:
cat > /home/labex/project/scripted-pipeline.groovy <<'GROOVY'
node {
def runTests = true
try {
stage('Prepare') {
echo 'Preparing scripted pipeline'
sh 'pwd'
}
stage('Build') {
echo 'Building with scripted syntax'
sh 'echo Compiling scripted pipeline demo'
}
if (runTests) {
stage('Test') {
echo 'Tests enabled by Groovy condition'
sh 'echo Running scripted pipeline tests'
}
}
} finally {
echo 'Pipeline cleanup complete'
}
}
GROOVY
Regenere la configuración del trabajo y recargue Jenkins:
python3 - <<'PY'
from html import escape
from pathlib import Path
script = Path("/home/labex/project/scripted-pipeline.groovy").read_text()
config = f"""<?xml version='1.1' encoding='UTF-8'?>
<flow-definition plugin="workflow-job">
<actions/>
<description>Run a Jenkins scripted Pipeline example.</description>
<keepDependencies>false</keepDependencies>
<properties/>
<definition class="org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition" plugin="workflow-cps">
<script>{escape(script)}</script>
<sandbox>true</sandbox>
</definition>
<triggers/>
<disabled>false</disabled>
</flow-definition>
"""
Path("/home/labex/project/scripted-pipeline-config.xml").write_text(config)
PY
docker cp /home/labex/project/scripted-pipeline-config.xml jenkins:/var/jenkins_home/jobs/scripted-pipeline-demo/config.xml
/home/labex/project/reload-jenkins.sh
Confirme que la configuración actualizada del trabajo contiene el texto de la nueva etapa Test:
docker exec jenkins grep -n 'Tests enabled by Groovy condition' /var/jenkins_home/jobs/scripted-pipeline-demo/config.xml
Inspeccionar el registro del Pipeline actualizado
En este paso, ejecutará el Pipeline basado en scripts actualizado e inspeccionará la salida de la consola. El registro debería mostrar el mensaje de la etapa condicional Test y el mensaje de limpieza del bloque finally.
Active la segunda compilación:
CRUMB=$(curl -fsS -c /tmp/jenkins-scripted-build.cookies 'http://localhost:8080/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)')
curl -fsS -b /tmp/jenkins-scripted-build.cookies -H "$CRUMB" -X POST http://localhost:8080/job/scripted-pipeline-demo/build
Espere hasta que la compilación #2 finalice:
until curl -fsS http://localhost:8080/job/scripted-pipeline-demo/2/api/json >/tmp/scripted-build-2.json 2>/dev/null && grep -q '"building":false' /tmp/scripted-build-2.json; do
echo "Waiting for scripted pipeline build #2..."
sleep 3
done
Imprima las líneas importantes de la consola:
curl -fsS http://localhost:8080/job/scripted-pipeline-demo/2/consoleText | grep -E 'Tests enabled|Running scripted pipeline tests|Pipeline cleanup complete|Finished: SUCCESS'
Abra Firefox desde la interfaz de escritorio y visite http://localhost:8080/job/scripted-pipeline-demo/2/console. La página de la consola debería mostrar la salida de la etapa Test y el mensaje de limpieza.

Resumen
Ha escrito un Pipeline de Jenkins basado en scripts utilizando los pasos node, stage, echo y sh, lo ha ejecutado como un trabajo de Pipeline y ha añadido control de flujo de Groovy mediante if y try/finally. Ha verificado ambas versiones del Pipeline a través de los resultados de compilación de Jenkins y la salida de la consola.