Настройка непрерывной интеграции в Jenkins в Ubuntu 16.04

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

Для начала ознакомьтесь с этими руководствами:

В этом мануале вы научитесь интегрировать Jenkins и GitHub для получения уведомлений при появлении нового кода в репозитории. Получив уведомление, Jenkins проверит код и протестирует его в изолированном контейнере Docker. Также вы узнаете, как создать процесс CI/CD. В руководстве для примера используется приложение Node.js.

Требования

  • Сервер Ubuntu 16.04 (1 Гб RAM минимум).
  • Предварительно установленный сервер Jenkins.
  • Контейнеры Docker.

Настроить среду вам помогут эти материалы:

1: Добавление пользователя Jenkins в группу Docker

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

Чтобы это исправить, добавьте пользователя jenkins в группу docker с помощью команды usermod.

sudo usermod -aG docker jenkins

Убедитесь, что в группе docker появился пользователь jenkins.

grep docker /etc/group
docker:x:999:8host,jenkins

Перезапустите процесс Jenkins.

sudo systemctl restart jenkins

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

2: Создание токена персонального доступа в GitHub

Для того, чтобы сервер Jenkins мог просматривать проекты GitHub, вам нужно создать токен доступа в учетной записи GitHub.

Откройте свой аккаунт GitHub.

В выпадающем меню слева найдите Settings.

На следующей странице выберите Developer settings → Personal access tokens.

Нажмите Generate new token.

На экране появится страница, на которой можно определить предназначение токена. В поле Token description добавьте описание токена.

В разделе Select scopes проверьте флажки repo:status, repo:public_repo и admin:org_hook. Они позволят Jenkins обновлять статусы коммитов и создавать вебхуки (webhooks) проекта. Если вы используете частный репозиторий, вам нужно будет выбрать общий флажок repo вместо его опций.

Чтобы сгенерировать токен, нажмите Generate token.

Вы будете перенаправлены обратно на главную страницу, где отобразится новый токен.

Скопируйте токен, чтобы позже ссылаться на него. Как сказано на странице, восстановить токен после закрытия этой страницы нельзя.

Примечание: Способа повторно отобразить токен после закрытия этой страницы нет, это связано с безопасностью. Если вы потеряете токен, удалите текущий токен из своей учетной записи GitHub, а затем создайте новый.

3: Добавление токена GitHub в Jenkins

Теперь у вас есть токен доступа. Добавьте его на сервер Jenkins, чтобы он мог автоматически создавать вебхуки.

Откройте интерфейс Jenkins как администратор.

Кликните Credentials в меню слева.

На следующей странице нажмите стрелочку вниз рядом с (global) в строке Jenkins. В появившемся окне нажмите Add credentials.

Заполните форму учетными данными.

В выпадающем меню Kind выберите Secret text. В поле Secret вставьте токен GitHub. В Description введите описание, чтобы опознать эту запись в дальнейшем. В Scope можно оставить Global, а поле ID можно не заполнять.

Кликните OK.

Теперь вы сможете ссылаться на эти учетные данные из других компонентов Jenkins.

4: Настройка доступа Jenkins к GitHub

Вернитесь в главную панель инструментов Jenkins, нажмите Manage Jenkins в меню слева.

В списке ссылок кликните Configure System.

Прокрутите следующую страницу, найдите раздел GitHub. Нажмите кнопку Add GitHub Server и выберите GitHub Server.

Раздел расширится и запросит дополнительную информацию. В раскрывающемся меню Credentials выберите свой токен доступа GitHub, который вы добавили в предыдущем разделе.

Нажмите Test connection. Jenkins отправит тестовый вызов API вашему аккаунту и подтвердит связь.

Чтобы сохранить настройки, нажмите Save.

5: Настройка приложения в аккаунте GitHub.

Для примера используем приложение «Hello World», созданное в Hapi.js. Чтобы сервер Jenkins мог реагировать на уведомления, вам нужно иметь свою копию тестового кода.

Откройте репозиторий проекта. Нажмите Fork в правом верхнем углу, чтобы скопировать код на ваш аккаунт.

Репозиторий содержит файл package.json, который определяет зависимости времени выполнения и разработки, а также как запускает набор тестов. Зависимости можно установить с помощью npm install, а тесты можно – с помощью npm test.

Также в репозиторий добавлен Jenkinsfile. Jenkins читает этот файл, чтобы определить действия, которые нужно выполнить для создания репозитория, тестирования или развертывания. Файл написан на основе Jenkins Pipeline DSL.

Jenkinsfile, включающий hello-hapi, выглядит так:

#!/usr/bin/env groovy
pipeline {
agent {
docker {
image 'node'
args '-u root'
}
}
stages {
stage('Build') {
steps {
echo 'Building...'
sh 'npm install'
}
}
stage('Test') {
steps {
echo 'Testing...'
sh 'npm test'
}
}
}
}

Блок pipeline содержит все определение для Jenkins. В этом блоке есть раздел agent, в котором описаны действия конвейера. Чтобы изолировать окружение от хост-системы, приложение будет тестироваться в контейнере Docker, который определен агентом docker.

Поскольку Hapi.js – это фреймворк Node.js, используйте Docker-образ node. В контейнере укажите root. Это позволит пользователю одновременно записывать данные в прикрепленный том, содержащий извлеченный код, и в том, в котором сценарий хранит свой вывод.

Затем файл определяет два этапа работы. Первый этап называется Build, а второй Test. Этап Build создает сообщение диагностика, а затем запускает npm install для установки требуемых зависимостей. Шаг Test создает другое сообщение, а затем запускает тесты, как определено в файле package.json.

Теперь у вас есть репозиторий с файлом Jenkinsfile.

6: Создание нового конвейера Jenkins

Теперь нужно настроить Jenkins для использования токена доступа GitHub.

Вернитесь в панель управления Jenkins и выберите New Item в меню слева.

Введите имя нового конвейера в поле Enter an item name. Установите Pipeline как тип элемента.

Нажмите OK.

На следующем экране поставьте флажок GitHub project. В поле Project url введите URL репозитория проекта на GitHub.

Примечание: Укажите путь к форку приложения Hello Hapi, чтобы у Jenkinsбыли права на создание вебхуков.

В разделе Build Triggers поставьте флажок GitHub hook trigger for GITScm polling.

В разделе Pipeline нужно настроить запуск конвейера, определенного в Jenkinsfile. Измените тип Definition на Pipeline script from SCM.

В появившемся разделе выберите Git в меню SCM. В поле Repository URL введите URL на форк репозитория.

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

Нажмите кнопку Save в нижней части страницы.

7: Начальная сборка и настройка вебхуков

На момент написания данного мануала Jenkins не настраивает вебхуки автоматически при определении конвейера.

Чтобы помочь Jenkins настроить соответствующие хуки,  первую сборку нужно выполнить вручную.

На главной странице конвейера нажмите Build Now.

Будет запланирована новая сборка. В окне Build History в нижнем левом углу появится новая сборка. Кроме того, Stage View переместится в центр страницы и будет отслеживать ход тестового прогона на различных этапах.

В окне Build History кликните по номеру, связанному со сборкой, чтобы получить подробные данные о ней. Нажмите кнопку Console Output в меню слева, чтобы просмотреть подробную информацию о выполненных этапах.

Нажмите Back to Project, чтобы вернуться к главной странице конвейера.

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

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

Чтобы проверить это, перейдите в репозиторий GitHub и нажмите кнопку Settings. На следующей странице нажмите Webhooks в боковом меню. Вы должны увидеть вебхук сервера Jenkins в главном интерфейсе.

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

Чтобы проверить это, нажмите Create new file на странице репозитория GitHub.

На следующей странице выберите имя файла и добавьте фиктивное содержимое.

Нажмите кнопку Commit new file.

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

Вы можете запускать дополнительные сборки, добавляя коммиты в локальную копию репозитория и передавая их в GitHub.

Заключение

Теперь Jenkins отслеживает проект GitHub и автоматически тестирует новый код. Jenkins извлекает код из репозитория, а затем запускает процедуру сборки и тестирования в изолированных контейнерах Docker. Полученный код можно развернуть или сохранить, добавив дополнительные параметры в Jenkinsfile.

Tags: , ,