はじめに
多くの Jenkins 環境では、ビルドがコンテナベースの環境で実行されます。この LabEx のイメージでは、Jenkins 自体が Docker コンテナ内で動作しています。コントローラーはホストの Docker ソケットをビルドに公開していないため、この実験では、外部イメージをプルすることなく、コンテナベースの実行コンテキストからパイプラインが収集できる実用的な証拠に焦点を当てます。
この実験では、ローカルの Jenkins イメージを調査し、コンテナの証拠を確認するパイプラインジョブを作成し、ビルドを実行して、コンソール出力を検証します。
利用可能なコンテナイメージの調査
このステップでは、VM ホスト上のローカル Docker イメージを調査します。Jenkins コントローラーコンテナはローカルの jenkins/jenkins:latest イメージから起動されており、パイプラインビルドはそのコンテナベースの Jenkins 環境内で実行されます。
利用可能なイメージを一覧表示します:
docker images --format '{{.Repository}}:{{.Tag}}' | sort
実行中の Jenkins コンテナを調査します:
docker ps --filter name=jenkins --format 'container={{.Names}} image={{.Image}} status={{.Status}}'
jenkins/jenkins:latest と、jenkins という名前の実行中のコンテナが表示されるはずです。
コンテナ対応パイプラインの作成
このステップでは、実行環境を確認するパイプラインスクリプトを作成します。ファイル /.dockerenv は、通常 Docker コンテナ内に存在します。また、パイプラインはホスト名、ワークスペース、およびオペレーティングシステムの詳細を出力します。
パイプラインスクリプトを作成します:
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
スクリプトを表示して、ステージとシェルステップを確認します:
nl -ba /home/labex/project/container-agent-pipeline.groovy
パイプラインジョブの作成
このステップでは、container-agent-demo という名前の Jenkins パイプラインジョブを作成します。Python を使用して Groovy スクリプトを XML エスケープし、パイプラインジョブの設定ファイルを作成します。
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
ジョブを Jenkins にコピーしてリロードします:
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
Jenkins がジョブを読み込めることを確認します:
curl -fsS http://localhost:8080/job/container-agent-demo/api/json | grep -o '"name":"container-agent-demo"'
コンテナ対応パイプラインの実行
このステップでは、パイプラインを実行し、Jenkins がビルド #1 を完了するのを待ちます。
ビルドをトリガーします:
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
ビルドが完了するのを待ちます:
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
結果を確認します:
curl -fsS http://localhost:8080/job/container-agent-demo/1/api/json | grep -o '"result":"SUCCESS"'
コンテナ実行の証拠の調査
このステップでは、コンソール出力を調査します。重要な証拠は INSIDE_CONTAINER=true、コンテナのホスト名、および Jenkins のワークスペースパスです。
コンソールの主要な行を表示します:
curl -fsS http://localhost:8080/job/container-agent-demo/1/consoleText | grep -E 'INSIDE_CONTAINER|Container hostname|Workspace|PRETTY_NAME|Finished: SUCCESS'
デスクトップインターフェースから Firefox を開き、http://localhost:8080/job/container-agent-demo/1/console にアクセスします。コンソールページには、コンテナマーカーとワークスペース情報が表示されているはずです。

まとめ
ローカルの Jenkins コンテナイメージを調査し、コンテナ対応のパイプラインジョブを作成して実行し、Jenkins のコンソール出力からコンテナ実行の証拠を検証しました。また、この LabEx 環境が、外部イメージのプルや Docker ソケットのマウントに頼らずに、どのようにコンテナベースの実行を検証しているのかを学びました。