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.

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.