Инициализация контроллера Jenkins

Beginner

Введение

Обычно Jenkins запускается как неинициализированный контроллер. Первый администратор разблокирует его с помощью начального пароля, создает постоянную учетную запись администратора и подтверждает готовность Jenkins к работе.

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

Запуск изолированного экземпляра Jenkins

На этом этапе вы запустите новый контроллер Jenkins, не затрагивая основную службу. Контроллер Jenkins хранит свою конфигурацию в директории /var/jenkins_home, поэтому в данной работе используется отдельный том Docker с именем jenkins-init-lab-home.

Команда docker run ниже запускает временный контроллер в фоновом режиме. Опция -d означает работу в отсоединенном режиме (detached mode), --name задает контейнеру постоянное имя, -p 18080:8080 открывает доступ к Jenkins через порт хоста 18080, а -v подключает изолированный том для хранения данных Jenkins.

docker run -d \
  --name jenkins-init-lab \
  -p 18080:8080 \
  -v jenkins-init-lab-home:/var/jenkins_home \
  jenkins/jenkins:latest

Docker выведет ID нового контейнера. Точный ID будет отличаться каждый раз, поэтому подойдет любое длинное шестнадцатеричное значение.

Затем подождите, пока Jenkins начнет отвечать на HTTP-запросы. Цикл ниже опрашивает локальный контроллер по адресу /login, пока тот не вернет HTTP-код состояния. Ответ 200 означает, что страница входа доступна.

until [ "$(curl -s -o /dev/null -w '%{http_code}' http://localhost:18080/login)" = "200" ]; do
  echo "Waiting for the temporary Jenkins controller..."
  sleep 5
done

Вы увидите сообщение об ожидании несколько раз, после чего командная строка вернется в активное состояние. Проверьте контейнер и привязку портов:

docker ps --filter name=jenkins-init-lab --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'

Вывод должен содержать имя контейнера и порт 18080:

NAMES              STATUS          PORTS
jenkins-init-lab   Up ...          0.0.0.0:18080->8080/tcp, ...

Получение начального пароля администратора

На этом этапе вы получите одноразовый пароль, который Jenkins создает для первого администратора. Jenkins хранит этот пароль внутри домашней директории контроллера по пути /var/jenkins_home/secrets/initialAdminPassword.

Используйте docker exec для выполнения команды cat внутри временного контейнера Jenkins, а затем сохраните пароль в директории вашего проекта:

docker exec jenkins-init-lab cat /var/jenkins_home/secrets/initialAdminPassword > /home/labex/project/jenkins-init-password.txt

Команда использует перенаправление > для записи вывода в файл. Это позволяет использовать пароль на следующих этапах, не полагаясь на переменные оболочки.

Выведите только первые несколько символов, чтобы убедиться, что файл не пуст, не раскрывая при этом полный пароль в истории терминала:

cut -c1-8 /home/labex/project/jenkins-init-password.txt

Вы должны увидеть восемь символов пароля, примерно так:

1a2b3c4d

Создание постоянной учетной записи администратора

На этом этапе вы используете начальный пароль для создания полноценного администратора Jenkins с именем lab-admin. Первый пароль предназначен только для настройки. Обычная учетная запись администратора — это то, что команды используют после инициализации контроллера.

Jenkins защищает отправку форм с помощью crumb-токена. Crumb привязан к той же сессии браузера или HTTP-сессии, которая его запросила, поэтому следующая команда также сохраняет cookies Jenkins в файл.

INIT_PASSWORD=$(tr -d '\r\n' < /home/labex/project/jenkins-init-password.txt)
COOKIE_JAR=/home/labex/project/jenkins-init-cookies.txt

curl -fsS -c "${COOKIE_JAR}" -u "admin:${INIT_PASSWORD}" \
  http://localhost:18080/crumbIssuer/api/json \
  > /home/labex/project/jenkins-init-crumb.json

Следующая команда отправляет в Jenkins небольшой Groovy-скрипт. Скрипт создает область безопасности (security realm), добавляет пользователя lab-admin, предоставляет полные права авторизованным пользователям и помечает мастер настройки как завершенный.

CRUMB_FIELD=$(sed -n 's/.*"crumbRequestField":"\([^"]*\)".*/\1/p' /home/labex/project/jenkins-init-crumb.json)
CRUMB_VALUE=$(sed -n 's/.*"crumb":"\([^"]*\)".*/\1/p' /home/labex/project/jenkins-init-crumb.json)

cat > /home/labex/project/initialize-controller.groovy <<'GROOVY'
import jenkins.model.Jenkins
import jenkins.install.InstallState
import hudson.security.HudsonPrivateSecurityRealm
import hudson.security.FullControlOnceLoggedInAuthorizationStrategy

def jenkins = Jenkins.get()
def realm = new HudsonPrivateSecurityRealm(false)
realm.createAccount('lab-admin', 'LabEx-Admin-123')
jenkins.setSecurityRealm(realm)

def strategy = new FullControlOnceLoggedInAuthorizationStrategy()
strategy.setAllowAnonymousRead(false)
jenkins.setAuthorizationStrategy(strategy)

jenkins.setInstallState(InstallState.INITIAL_SETUP_COMPLETED)
jenkins.save()
println('created lab-admin and completed setup')
GROOVY

curl -fsS -b "${COOKIE_JAR}" -u "admin:${INIT_PASSWORD}" \
  -H "${CRUMB_FIELD}: ${CRUMB_VALUE}" \
  --data-urlencode "script@/home/labex/project/initialize-controller.groovy" \
  http://localhost:18080/scriptText \
  > /home/labex/project/jenkins-init-result.txt

Прочитайте файл с результатом:

cat /home/labex/project/jenkins-init-result.txt

Ожидаемое сообщение:

created lab-admin and completed setup

Проверка панели управления инициализированного контроллера

На этом этапе вы убедитесь, что временный контроллер больше не ограничивается экраном разблокировки. Корректно инициализированный контроллер должен авторизовать пользователя lab-admin и вернуть главную страницу Jenkins.

Используйте curl с опцией -u для авторизации. Опция -o записывает HTML в файл, а -w '%{http_code}' выводит только HTTP-код состояния.

curl -s -u 'lab-admin:LabEx-Admin-123' \
  -o /home/labex/project/jenkins-init-dashboard.html \
  -w '%{http_code}\n' \
  http://localhost:18080/

Код состояния должен быть:

200

Теперь выполните поиск характерного текста Jenkins в сохраненной странице панели управления:

grep -o -E 'Dashboard|Welcome to Jenkins|Jenkins' /home/labex/project/jenkins-init-dashboard.html | head

Вы должны увидеть как минимум одну совпадающую строку. Точный HTML-код может меняться в зависимости от версии Jenkins, но страница должна быть идентифицирована как Jenkins.

Остановка и удаление временного контроллера

На этом этапе вы очистите систему от временного контроллера. Это важно, так как основная служба Jenkins используется в других лабораторных работах, а временный контроллер был нужен только для практики первичной инициализации.

Сначала остановите и удалите временный контейнер:

docker rm -f jenkins-init-lab

Затем удалите его изолированный том Jenkins:

docker volume rm jenkins-init-lab-home

Наконец, убедитесь, что временный контроллер удален:

docker ps -a --filter name=jenkins-init-lab --format '{{.Names}}'

Эта команда не должна ничего вывести. Пустой результат означает, что контейнер с таким именем больше не существует.

Резюме

Вы запустили изолированный контроллер Jenkins, получили его одноразовый начальный пароль администратора, создали постоянную учетную запись администратора, подтвердили доступность инициализированной панели управления и удалили временный контроллер. Это основной рабочий процесс первичной инициализации, лежащий в основе настройки любого контроллера Jenkins.