Установка Jenkins на Ubuntu 20.04 и его настройка для автоматизации разработки
Рассмотрим, как установить Jenkins, и на примере веб-приложения на Java покажем, как автоматизировать процесс сборки и поставки его на веб-сервер Jetty.
Введение
Jenkins является одним из популярных инструментов, позволяющий реализовывать подход непрерывной интеграции (Continuous Integration, CI) и непрерывной поставки (Continuous Delivery, CD) программного обеспечения.
CI существенно облегчает интеграцию разрозненных копии проекта с основной ветвью разработки, позволяет настраивать автоматическую сборку проекта и запускать тесты.
CD обеспечивает в автоматическом режиме поставку и развертывание результатов сборки на целевых серверах.
В этой статье мы рассмотрим, как установить Jenkins, и на примере веб-приложения на Java покажем, как автоматизировать процесс сборки и поставки его на веб-сервер Jetty.
Исходный код веб-приложения лежит в git-репозитории, а в качестве инструмента сборки используется Maven.
Требования
- Сервер Ubuntu 20.04 ;
- Пользователь с root-правами или доступ через sudo.
Шаг 1. Подготовка инфраструктуры
Мы будем устанавливать Jenkins на облачную виртуальную машину, развернутую на платформе Selectel.
В панели управления платформой переходим в раздел «Облачная платформа» — «Серверы», и нажимаем кнопку «Создать сервер».
На следующем экране нужно выбрать параметры создаваемой ВМ. Выберем ОС — Ubuntu 20.04, произвольную конфигурацию — 1 vCPU, 1 ГБ оперативной памяти и 5 ГБ диска. В разделе «Сеть» выберем или создадим подсеть с публичным IP-адресом, чтобы к машине можно было подключаться из интернета. Также обратите внимание на раздел «Доступ»: нужно либо записать пароль root-пользователя, либо выбрать SSH-ключ.
Через несколько минут виртуальная машина будет создана, и нам нужно скопировать ее IP-адрес:
Чтобы подключиться к машине, выполните команду, указав IP-адрес вашего сервера:
ssh root@<IP-адрес>
Если при создании машины вы выбрали SSH-ключ, то подключиться можно без пароля:
ssh -i <приватный_ключ> root@<IP-адрес>
Шаг 2. Установка JDK
Для работы Jenkins и Maven нужно установить Java, причем для Maven нужен именно JDK. Установим его:
apt-get update
apt-get install -y openjdk-11-jdk
По завершении установки выполняем проверку:
java -version
Вывод:
openjdk version "11.0.13" 2021-10-19
OpenJDK Runtime Environment (build 11.0.13+8-Ubuntu-0ubuntu1.20.04)
OpenJDK 64-Bit Server VM (build 11.0.13+8-Ubuntu-0ubuntu1.20.04, mixed mode, sharing)
Шаг 3. Установка Jenkins
Выполняем в командной строке Ubuntu следующие команды:
curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo tee \
/usr/share/keyrings/jenkins-keyring.asc > /dev/null
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
/etc/apt/sources.list.d/jenkins.list > /dev/null
$ apt-get update
$ apt-get install -y jenkins
После установки система автоматически запустит сервис Jenkins. Проверяем его статус с помощью команды:
$ systemctl status jenkins
Вывод:
● jenkins.service - LSB: Start Jenkins at boot time
Loaded: loaded (/etc/init.d/jenkins; generated)
Active: active (exited) since Wed 2021-12-22 05:09:54 UTC; 23s ago
Docs: man:systemd-sysv-generator(8)
Tasks: 0 (limit: 1105)
Memory: 0B
CGroup: /system.slice/jenkins.service
Как видим, сервис запущен и находится в активном статусе. Если сервис неактивен, то необходимо проверить, свободен ли порт 8080 и хватает оперативной памяти (Jenkins требует минимум 256 МБ).
Шаг 4. Установка Git
Git нам понадобится для того, чтобы клонировать репозиторий с исходным кодом на нашу машину.
Выполняем команду:
$ apt-get install -y git
Проверяем установленную версию:
$ git --version
Вывод:
git version 2.25.1
Шаг 5. Установка Maven
Устанавливаем Maven:
$ apt-get install -y maven
Проверяем успешность установки:
$ mvn --version
Вывод:
Maven home: /usr/share/maven
Java version: 11.0.13, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Default locale: en, platform encoding: UTF-8
OS name: "linux", version: "5.4.0-91-generic", arch: "amd64", family: "unix"
Здесь необходимо запомнить значение Maven home. В нашем случае это /usr/share/maven. Этот путь будет нужен в дальнейшем для настройки Jenkins.
Шаг 6. Настройка Jenkins
Все необходимые установки сделаны, и можно перейти к настройке Jenkins.
Управление Jenkins осуществляется через веб-интерфейс, по умолчанию доступный на порту 8080. Открываем в браузере страницу http://[IP-адрес сервера]:8080:
Если интерфейс не появился, то необходимо открыть порт 8080 и проверить статус работы сервиса Jenkins.
Для продолжения настройки нам потребуется ввести пароль администратора, который хранится в файл /var/lib/jenkins/secrets/initialAdminPassword.
Возвращаемся в командную строку Ubuntu и просматриваем его с помощью команды cat:
$ cat /var/lib/jenkins/secrets/initialAdminPassword
Копируем пароль, вставляем его в поле ввода и нажимаем «Продолжить».
На следующем шаге нам необходимо выбрать режим установки плагинов, которые будут установленные вместе с Jenkins. Выбираем Install suggested plugins:
После установки всех плагинов создаем профиль администратора:
Имя пользователя и пароль запоминаем для дальнейшей работы.
На следующем экране Jenkins попросит проверить и подтвердить публичный адрес сервера.
Нажимаем «Продолжить». На экране появится сообщение, свидетельствующее о готовности Jenkins к работе:
На этом основная настройка закончена. Нажимаем на кнопку Start using Jenkins и переходим в рабочую панель Jenkins.
Шаг 7. Настройка Maven в Jenkins
Jenkins не всегда распознает установленный в системе Maven, поэтому его нужно указать вручную.
Выбираем «Настроить Jenkins» в левом меню:
Переходим в «Конфигурация глобальных инструментов»:
В появившемся окне ищем раздел Maven и нажимаем на кнопку «Добавить». Снимаем флажок Install automatically, и открывается два поля для ввода.
Вводим произвольное имя и путь до установочной папки Maven home, полученный нами на 5-ом шаге во время проверки версии.
Сохраняем настройки, и чтобы изменения вступили в силу, перезапускаем Jenkins:
$ systemctl restart jenkins
Шаг 8. Создание автоматической сборки
После перезагрузки открываем снова веб-интерфейс Jenkins и заходим под учетной записью администратора, которую мы создавали на этапе настройки:
В появившемся окне в левом меню нажимаем на пункт «Создать Item».
Вводим название проекта, выбираем «Создать задачу со свободной конфигурацией» и нажимаем «OК» внизу страницы.
На вкладке General находим раздел «Управление исходным кодом» и выбираем Git. Система предлагает ввести нам URL Git репозитория. Вводим его:
Если репозиторий приватный, то система выдаст ошибку о том, что нет доступ к репозиторию.
Добавляем логин и пароль в подразделе Credentials. Выбираем из выпадающего списка Jenkins:
В появившемся окне вводим Username и Password:
Добавляем и выбираем из выпадающего списка созданные Сredentials:
Ошибка доступа больше не выводится:
После того как мы указали репозиторий, из которого необходимо получать исходный код, переходим к настройке сборки.
Находим раздел «Сборка», нажимаем «Добавить шаг сборки» и выбираем из выпадающего списка «Вызвать цели Maven верхнего уровня».
Выбираем нашу настройку Maven и в поле «Цели» вставляем команду для сборки maven-проекта:
clean install -P production
Результат сборки будет сохраняться в директории /var/lib/jenkins/workspace/Lolipop/target/, где Lolipop — название нашего проекта.
В данном примере результатом сборки будет готовый к развертыванию war-файл.
В качестве примера рассмотрим, каким образом автоматизировать процесс развертывания war-файла на веб-сервер Jetty, который работает на этой же машине.
О Jetty и его установке можно более подробно прочитать здесь.
Добавим еще один шаг сборки, который будет копировать war-файл в папку webapps Jetty и перезапускать его. На этот раз выбираем из выпадающего списка «Выполнить команду shell».
yes | cp -rf '/var/lib/jenkins/workspace/Lolipop/target/api.war' /opt/jetty/webapps/
systemctl restart jetty
На этом настройка сборки закончена, нажимаем «Сохранить» и переходим к запуску.
Шаг 9. Запуск сборки
Для запуска сборки в меню выбираем «Собрать сейчас». После этого в левом нижнем углу в разделе «История сборок» появится индикатор процесса сборки с датой и временем запуска:
Во время сборки Jetty будет выполнять последовательно следующие задачи:
- Загрузка из Git репозитория последней версии исходного кода проекта.
- Запуск сборки загруженного Maven проекта.
- Размещение результатов сборки в папке workspace.
- Копирование war-файла в папку webapps веб-сервера Jetty.
- Перезапуск Jetty.
Если сборка завершилась с ошибкой, то маркер будет красного цвета, а если успешно, то зеленого.
Нажав на номер сборки и перейдя в левом меню в раздел Console Output, можно отследить отладочный вывод сборки:
Автоматическая сборка и доставка на веб-сервер настроена. Теперь мы можем запускать ее в нужный момент с помощью кнопки «Собрать сейчас».
Если у вас несколько серверов выкладки с разными конфигурациями, вы можете настроить сборку под каждую выкладку.
Шаг 10. Как изменить порт подключения Jenkins
В ряде случаев порт 8080 занят или его необходимо освободить под другие сервисы. В рассмотренном примере Jetty по умолчанию запускается на порту 8080.
Чтобы Jenkins подключался к другому порту, в файле /etc/default/jenkins нужно изменить значение переменной HTTP_PORT на желаемый порт и перезапустить сервис Jenkins.
# port for HTTP connector (default 8080; disable with -1)
HTTP_PORT=8081
Обратите внимание, что этот способ не сработает, если вы хотите запустить Jenkins на одном из привилегированных портов, например, на 80. Jenkins запускается не от root-пользователя, а значит у него нет прав слушать порты до 1024.
Лучший способ это сделать — оставить Jenkins работать на порту 8080 и настроить переадресацию трафика с помощью iptables.
Заключение
Jenkins поддерживает технологии для работы с разными системами контроля версий, включая Git, CVS, Subversion, Clearcase и Mercurial, может собирать проекты на Ant, Maven и Gradle, а также исполнять команды Windows, shell-скрипты и отправлять уведомления о состоянии сборки в автоматическом режиме.
Благодаря такому разнообразному инструментарию Jenkins можно применять на проектах с разными технологиями и любой сложности.
Jenkins также поддерживает триггеры сборки, которые могут вызывать сборку по определенному расписанию или событию.
Все эти преимущества делают Jenkins незаменимым инструментом при построении процесса разработки.