Ejecución de Pipelines en agentes de contenedor

Beginner

Introducción

Muchas instalaciones de Jenkins ejecutan compilaciones en entornos basados en contenedores. En esta imagen de LabEx, Jenkins se ejecuta dentro de un contenedor Docker. El controlador no expone el socket de Docker del host a las compilaciones, por lo que este laboratorio se centra en las evidencias prácticas que un Pipeline puede recopilar desde un contexto de ejecución basado en contenedores sin necesidad de extraer imágenes externas.

En este laboratorio, inspeccionará la imagen local de Jenkins, creará un trabajo de Pipeline que verifique la existencia de evidencias del contenedor, ejecutará la compilación y verificará la salida de la consola.

Inspeccionar las imágenes de contenedor disponibles

En este paso, inspeccionará las imágenes de Docker locales en el host de la máquina virtual. El contenedor del controlador de Jenkins se inició desde la imagen local jenkins/jenkins:latest, y la compilación del Pipeline se ejecutará dentro de ese entorno de Jenkins basado en contenedores.

Enumere las imágenes disponibles:

docker images --format '{{.Repository}}:{{.Tag}}' | sort

Inspeccione el contenedor de Jenkins en ejecución:

docker ps --filter name=jenkins --format 'container={{.Names}} image={{.Image}} status={{.Status}}'

Debería ver jenkins/jenkins:latest y un contenedor en ejecución llamado jenkins.

Escribir un Pipeline consciente del contenedor

En este paso, escribirá un script de Pipeline que verifique su entorno de ejecución. El archivo /.dockerenv suele estar presente dentro de los contenedores Docker. El Pipeline también imprimirá el nombre de host, el espacio de trabajo y los detalles del sistema operativo.

Cree el script del Pipeline:

cat > /home/labex/project/container-agent-pipeline.groovy <<'GROOVY'
node {
    stage('Container Context') {
        echo 'Checking container-backed Jenkins execution context'
        sh '''
set -e
echo "Container marker:"
test -f /.dockerenv && echo "INSIDE_CONTAINER=true"
echo "Container hostname: $(hostname)"
echo "Workspace: $WORKSPACE"
grep '^PRETTY_NAME=' /etc/os-release
'''
    }
}
GROOVY

Imprima el script para revisar la etapa y el paso de shell:

nl -ba /home/labex/project/container-agent-pipeline.groovy

Crear el trabajo de Pipeline

En este paso, creará un trabajo de Jenkins Pipeline llamado container-agent-demo. Python escapará el script Groovy a formato XML y escribirá la configuración del trabajo de Pipeline.

Genere la configuración del trabajo de Jenkins:

python3 - <<'PY'
from html import escape
from pathlib import Path

script = Path("/home/labex/project/container-agent-pipeline.groovy").read_text()
config = f"""<?xml version='1.1' encoding='UTF-8'?>
<flow-definition plugin="workflow-job">
  <actions/>
  <description>Capture container execution evidence from a Pipeline build.</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/container-agent-demo-config.xml").write_text(config)
PY

Copie el trabajo en Jenkins y recargue:

docker exec jenkins mkdir -p /var/jenkins_home/jobs/container-agent-demo
docker cp /home/labex/project/container-agent-demo-config.xml jenkins:/var/jenkins_home/jobs/container-agent-demo/config.xml
CRUMB=$(curl -fsS -c /tmp/jenkins-container-reload.cookies 'http://localhost:8080/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)')
curl -fsS -b /tmp/jenkins-container-reload.cookies -H "$CRUMB" -X POST http://localhost:8080/reload >/dev/null || true
sleep 5

Confirme que Jenkins puede cargar el trabajo:

curl -fsS http://localhost:8080/job/container-agent-demo/api/json | grep -o '"name":"container-agent-demo"'

Ejecutar el Pipeline consciente del contenedor

En este paso, ejecutará el Pipeline y esperará a que Jenkins finalice la compilación #1.

Dispare la compilación:

CRUMB=$(curl -fsS -c /tmp/jenkins-container-build.cookies 'http://localhost:8080/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)')
curl -fsS -b /tmp/jenkins-container-build.cookies -H "$CRUMB" -X POST http://localhost:8080/job/container-agent-demo/build

Espere a que la compilación finalice:

until curl -fsS http://localhost:8080/job/container-agent-demo/1/api/json >/tmp/container-agent-build-1.json 2>/dev/null && grep -q '"building":false' /tmp/container-agent-build-1.json; do
  echo "Waiting for container-aware pipeline build #1..."
  sleep 3
done

Confirme el resultado:

curl -fsS http://localhost:8080/job/container-agent-demo/1/api/json | grep -o '"result":"SUCCESS"'

Inspeccionar las evidencias de ejecución del contenedor

En este paso, inspeccionará la salida de la consola. La evidencia importante es INSIDE_CONTAINER=true, el nombre de host del contenedor y la ruta del espacio de trabajo de Jenkins.

Imprima las líneas clave de la consola:

curl -fsS http://localhost:8080/job/container-agent-demo/1/consoleText | grep -E 'INSIDE_CONTAINER|Container hostname|Workspace|PRETTY_NAME|Finished: SUCCESS'

Abra Firefox desde la interfaz de escritorio y visite http://localhost:8080/job/container-agent-demo/1/console. La página de la consola debería mostrar el marcador del contenedor y la información del espacio de trabajo.

Salida de la consola del Pipeline consciente del contenedor de Jenkins

Resumen

Inspeccionó la imagen del contenedor de Jenkins local, creó un trabajo de Pipeline consciente del contenedor, lo ejecutó y verificó las evidencias de ejecución del contenedor desde la salida de la consola de Jenkins. También aprendió por qué este entorno de LabEx valida la ejecución basada en contenedores sin depender de extracciones de imágenes externas o de un socket de Docker montado.