소개
많은 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 컨테이너 내부에 존재합니다. 또한 파이프라인은 호스트 이름, 작업 공간 (workspace) 및 운영 체제 세부 정보를 출력합니다.
파이프라인 스크립트를 생성합니다:
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 소켓에 의존하지 않고도 어떻게 컨테이너 기반 실행을 검증하는지 배웠습니다.