컨테이너 에이전트에서 파이프라인 실행하기

Beginner

소개

많은 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 컨테이너 이미지를 검사하고, 컨테이너 인식 파이프라인 작업을 생성 및 실행하여 Jenkins 콘솔 출력에서 컨테이너 실행 증거를 확인했습니다. 또한 이 LabEx 환경이 외부 이미지 가져오기나 마운트된 Docker 소켓에 의존하지 않고도 어떻게 컨테이너 기반 실행을 검증하는지 배웠습니다.