Jenkins: установка и настройка на Ubuntu 20.04

Установка 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.

В панели управления платформой переходим в раздел «Облачная платформа» — «Серверы», и нажимаем кнопку «Создать сервер».

создание сервера в панели Selectel

На следующем экране нужно выбрать параметры создаваемой ВМ. Выберем ОС — Ubuntu 20.04, произвольную конфигурацию — 1 vCPU, 1 ГБ оперативной памяти и 5 ГБ диска. В разделе «Сеть» выберем или создадим подсеть с публичным IP-адресом, чтобы к машине можно было подключаться из интернета. Также обратите внимание на раздел «Доступ»: нужно либо записать пароль root-пользователя, либо выбрать SSH-ключ.

выбор конфигурации

Через несколько минут виртуальная машина будет создана, и нам нужно скопировать ее IP-адрес:

копируем 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:

настройка jenkins через веб-интерфейс

Если интерфейс не появился, то необходимо открыть порт 8080 и проверить статус работы сервиса Jenkins.

Для продолжения настройки нам потребуется ввести пароль администратора, который хранится в файл /var/lib/jenkins/secrets/initialAdminPassword.

Возвращаемся в командную строку Ubuntu и просматриваем его с помощью команды cat:


    $ cat /var/lib/jenkins/secrets/initialAdminPassword

Копируем пароль, вставляем его в поле ввода и нажимаем «Продолжить».

На следующем шаге нам необходимо выбрать режим установки плагинов, которые будут установленные вместе с Jenkins. Выбираем Install suggested plugins:

выбираем режим установки плагинов

После установки всех плагинов создаем профиль администратора:

создаем профиль администратора

Имя пользователя и пароль запоминаем для дальнейшей работы.


На следующем экране Jenkins попросит проверить и подтвердить публичный адрес сервера.

подтверждаем публичный адрес сервера

Нажимаем «Продолжить». На экране появится сообщение, свидетельствующее о готовности Jenkins к работе:

jenkins готов к работе

На этом основная настройка закончена. Нажимаем на кнопку Start using Jenkins и переходим в рабочую панель Jenkins.

Шаг 7. Настройка Maven в Jenkins

Jenkins не всегда распознает установленный в системе Maven, поэтому его нужно указать вручную.

Выбираем «Настроить Jenkins» в левом меню:

настройка maven в jenkins

Переходим в «Конфигурация глобальных инструментов»:

конфигурация глобальных инструментов

В появившемся окне ищем раздел Maven и нажимаем на кнопку «Добавить». Снимаем флажок Install automatically, и открывается два поля для ввода.

вводим имя и путь

Вводим произвольное имя и путь до установочной папки Maven home, полученный нами на 5-ом шаге во время проверки версии.


Сохраняем настройки, и чтобы изменения вступили в силу, перезапускаем Jenkins:


    $ systemctl restart jenkins 

Шаг 8. Создание автоматической сборки

После перезагрузки открываем снова веб-интерфейс Jenkins и заходим под учетной записью администратора, которую мы создавали на этапе настройки:

заходим под учетной записью администратора

В появившемся окне в левом меню нажимаем на пункт «Создать Item».

Вводим название проекта, выбираем «Создать задачу со свободной конфигурацией» и нажимаем «» внизу страницы.

создаем задачу со свободной конфигурацией

На вкладке General находим раздел «Управление исходным кодом» и выбираем Git. Система предлагает ввести нам URL Git репозитория. Вводим его:

Если репозиторий приватный, то система выдаст ошибку о том, что нет доступ к репозиторию.

Добавляем логин и пароль в подразделе Credentials. Выбираем из выпадающего списка Jenkins:

выбираем Jenkins из выпадающего списка

В появившемся окне вводим Username и Password:

вводим логин и пароль

Добавляем и выбираем из выпадающего списка созданные Сredentials:

выбираем созданные С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

 выбираем выполнить команду shell

На этом настройка сборки закончена, нажимаем «Сохранить» и переходим к запуску.

Шаг 9. Запуск сборки

Для запуска сборки в меню выбираем «Собрать сейчас». После этого в левом нижнем углу в разделе «История сборок» появится индикатор процесса сборки с датой и временем запуска:

запуск сборки

Во время сборки Jetty будет выполнять последовательно следующие задачи:

  1. Загрузка из Git репозитория последней версии исходного кода проекта.
  2. Запуск сборки загруженного Maven проекта.
  3. Размещение результатов сборки в папке workspace.
  4. Копирование war-файла в папку webapps веб-сервера Jetty.
  5. Перезапуск 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 незаменимым инструментом при построении процесса разработки.