Einführung
Viele Jenkins-Installationen führen Builds in containerbasierten Umgebungen aus. In diesem LabEx-Image läuft Jenkins selbst in einem Docker-Container. Der Controller stellt den Docker-Socket des Hosts den Builds nicht zur Verfügung, daher konzentriert sich dieses Lab auf die praktischen Nachweise, die eine Pipeline aus einem containerbasierten Ausführungskontext sammeln kann, ohne externe Images abzurufen.
In diesem Lab untersuchen Sie das lokale Jenkins-Image, erstellen einen Pipeline-Job, der auf Container-Nachweise prüft, führen den Build aus und verifizieren die Konsolenausgabe.
Verfügbare Container-Images untersuchen
In diesem Schritt untersuchen Sie die lokalen Docker-Images auf dem VM-Host. Der Jenkins-Controller-Container wurde aus dem lokalen Image jenkins/jenkins:latest gestartet, und der Pipeline-Build wird innerhalb dieser containerbasierten Jenkins-Umgebung ausgeführt.
Listen Sie die verfügbaren Images auf:
docker images --format '{{.Repository}}:{{.Tag}}' | sort
Untersuchen Sie den laufenden Jenkins-Container:
docker ps --filter name=jenkins --format 'container={{.Names}} image={{.Image}} status={{.Status}}'
Sie sollten jenkins/jenkins:latest und einen laufenden Container namens jenkins sehen.
Eine Container-bewusste Pipeline schreiben
In diesem Schritt schreiben Sie ein Pipeline-Skript, das seine Ausführungsumgebung überprüft. Die Datei /.dockerenv ist innerhalb von Docker-Containern üblicherweise vorhanden. Die Pipeline gibt zudem den Hostnamen, den Workspace und Details zum Betriebssystem aus.
Erstellen Sie das Pipeline-Skript:
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
Geben Sie das Skript aus, um die Stage und den Shell-Schritt zu überprüfen:
nl -ba /home/labex/project/container-agent-pipeline.groovy
Den Pipeline-Job erstellen
In diesem Schritt erstellen Sie einen Jenkins-Pipeline-Job namens container-agent-demo. Python wird das Groovy-Skript XML-escapen und eine Pipeline-Job-Konfiguration schreiben.
Generieren Sie die Jenkins-Job-Konfiguration:
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
Kopieren Sie den Job in Jenkins und laden Sie ihn neu:
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
Bestätigen Sie, dass Jenkins den Job laden kann:
curl -fsS http://localhost:8080/job/container-agent-demo/api/json | grep -o '"name":"container-agent-demo"'
Die Container-bewusste Pipeline ausführen
In diesem Schritt führen Sie die Pipeline aus und warten darauf, dass Jenkins den Build #1 abschließt.
Starten Sie den Build:
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
Warten Sie auf den Abschluss des Builds:
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
Bestätigen Sie das Ergebnis:
curl -fsS http://localhost:8080/job/container-agent-demo/1/api/json | grep -o '"result":"SUCCESS"'
Nachweise der Container-Ausführung untersuchen
In diesem Schritt untersuchen Sie die Konsolenausgabe. Die wichtigen Nachweise sind INSIDE_CONTAINER=true, der Hostname des Containers und der Pfad des Jenkins-Workspaces.
Geben Sie die wichtigsten Zeilen der Konsole aus:
curl -fsS http://localhost:8080/job/container-agent-demo/1/consoleText | grep -E 'INSIDE_CONTAINER|Container hostname|Workspace|PRETTY_NAME|Finished: SUCCESS'
Öffnen Sie Firefox über die Desktop-Oberfläche und besuchen Sie http://localhost:8080/job/container-agent-demo/1/console. Die Konsolenseite sollte den Container-Marker und die Workspace-Informationen anzeigen.

Zusammenfassung
Sie haben das lokale Jenkins-Container-Image untersucht, einen Container-bewussten Pipeline-Job erstellt, diesen ausgeführt und die Nachweise der Container-Ausführung in der Jenkins-Konsolenausgabe verifiziert. Sie haben zudem gelernt, warum diese LabEx-Umgebung die containerbasierte Ausführung validiert, ohne auf externe Image-Downloads oder einen gemounteten Docker-Socket angewiesen zu sein.