Введение
Обычно 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.