Запуск конвейеров (Pipelines) на контейнерных агентах

Beginner

Введение

Многие инсталляции Jenkins выполняют сборки в средах на базе контейнеров. В этом образе LabEx сам Jenkins работает внутри Docker-контейнера. Контроллер не предоставляет сборкам доступ к Docker-сокету хоста, поэтому данная лабораторная работа посвящена практическим доказательствам, которые Pipeline может собрать в контексте выполнения на базе контейнера без необходимости загрузки внешних образов.

В этой лабораторной работе вы изучите локальный образ Jenkins, создадите задание Pipeline, которое проверяет наличие признаков выполнения в контейнере, запустите сборку и проверите вывод консоли.

Изучение доступных образов контейнеров

На этом этапе вы изучите локальные Docker-образы на хосте виртуальной машины. Контейнер контроллера Jenkins был запущен из локального образа jenkins/jenkins:latest, и сборка Pipeline будет выполняться внутри этой среды Jenkins на базе контейнера.

Выведите список доступных образов:

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

Изучите работающий контейнер Jenkins:

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

Вы должны увидеть jenkins/jenkins:latest и работающий контейнер с именем jenkins.

Написание Pipeline с поддержкой контейнеров

На этом этапе вы напишете скрипт Pipeline, который проверяет среду своего выполнения. Файл /.dockerenv обычно присутствует внутри Docker-контейнеров. Pipeline также выводит имя хоста, рабочую область (workspace) и сведения об операционной системе.

Создайте скрипт 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

Выведите содержимое скрипта, чтобы проверить этап (stage) и шаг оболочки (shell step):

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

Создание задания Pipeline

На этом этапе вы создадите задание Jenkins Pipeline с именем container-agent-demo. Python выполнит XML-экранирование скрипта Groovy и запишет конфигурацию задания Pipeline.

Сгенерируйте конфигурацию задания 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"'

Запуск Pipeline с поддержкой контейнеров

На этом этапе вы запустите Pipeline и дождетесь завершения сборки #1 в Jenkins.

Запустите сборку:

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 Pipeline с поддержкой контейнеров

Резюме

Вы изучили локальный образ контейнера Jenkins, создали задание Pipeline с поддержкой контейнеров, запустили его и проверили доказательства выполнения в контейнере по выводу консоли Jenkins. Вы также узнали, почему эта среда LabEx позволяет проверять выполнение на базе контейнеров без необходимости загрузки внешних образов или монтирования Docker-сокета.