Exécution de pipelines sur des agents conteneurisés

Beginner

Introduction

De nombreuses installations Jenkins exécutent des builds dans des environnements basés sur des conteneurs. Dans cette image LabEx, Jenkins lui-même s'exécute dans un conteneur Docker. Le contrôleur n'expose pas le socket Docker de l'hôte aux builds ; ce laboratoire se concentre donc sur les preuves concrètes qu'un pipeline peut collecter à partir d'un contexte d'exécution conteneurisé, sans avoir à extraire d'images externes.

Dans ce laboratoire, vous inspecterez l'image Jenkins locale, créerez un job de pipeline qui vérifie les preuves de conteneurisation, lancerez la build et vérifierez la sortie de la console.

Inspection des images de conteneurs disponibles

Dans cette étape, vous allez inspecter les images Docker locales sur l'hôte de la machine virtuelle. Le conteneur du contrôleur Jenkins a été démarré à partir de l'image locale jenkins/jenkins:latest, et la build du pipeline s'exécutera à l'intérieur de cet environnement Jenkins conteneurisé.

Listez les images disponibles :

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

Inspectez le conteneur Jenkins en cours d'exécution :

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

Vous devriez voir jenkins/jenkins:latest et un conteneur en cours d'exécution nommé jenkins.

Rédaction d'un pipeline conscient du conteneur

Dans cette étape, vous allez écrire un script de pipeline qui vérifie son environnement d'exécution. Le fichier /.dockerenv est généralement présent à l'intérieur des conteneurs Docker. Le pipeline affiche également le nom d'hôte, l'espace de travail et les détails du système d'exploitation.

Créez le script du 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

Affichez le script pour examiner l'étape et la commande shell :

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

Création du job de pipeline

Dans cette étape, vous allez créer un job de pipeline Jenkins nommé container-agent-demo. Python se chargera d'échapper les caractères XML du script Groovy et d'écrire la configuration du job de pipeline.

Générez la configuration du job 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

Copiez le job dans Jenkins et rechargez la configuration :

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

Confirmez que Jenkins peut charger le job :

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

Exécution du pipeline conscient du conteneur

Dans cette étape, vous allez exécuter le pipeline et attendre que Jenkins termine la build #1.

Déclenchez la 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

Attendez la fin de la build :

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

Confirmez le résultat :

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

Inspection des preuves d'exécution dans le conteneur

Dans cette étape, vous allez inspecter la sortie de la console. Les preuves importantes sont INSIDE_CONTAINER=true, le nom d'hôte du conteneur et le chemin de l'espace de travail Jenkins.

Affichez les lignes clés de la console :

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

Ouvrez Firefox depuis l'interface de bureau et visitez http://localhost:8080/job/container-agent-demo/1/console. La page de la console devrait afficher le marqueur de conteneur et les informations sur l'espace de travail.

Sortie de la console du pipeline Jenkins conscient du conteneur

Résumé

Vous avez inspecté l'image du conteneur Jenkins local, créé un job de pipeline conscient du conteneur, l'avez exécuté et avez vérifié les preuves d'exécution dans le conteneur à partir de la sortie de la console Jenkins. Vous avez également appris pourquoi cet environnement LabEx valide l'exécution basée sur des conteneurs sans dépendre d'extractions d'images externes ou d'un socket Docker monté.