Вступление
Jenkins - это сервер автоматизации с открытым исходным кодом, предназначенный для автоматизации повторяющихся технических задач, связанных с непрерывной интеграцией и поставкой программного обеспечения. Обладая надежной экосистемой плагинов и широкой поддержкой, Jenkins может обрабатывать разнообразные рабочие нагрузки для создания, тестирования и развертывания приложений.
В предыдущих руководствах мы https://www.digitalocean.com/community/tutorials/how-to-install-jenkins-on-ubuntu-16-04 установили Jenkins на сервере Ubuntu 16.04] и https: // www. digitalocean.com/community/tutorials/how-to-configure-jenkins-with-ssl-using-an-nginx-reverse-proxy[configure Jenkins с SSL с использованием обратного прокси-сервера Nginx]. В этом руководстве мы покажем, как настроить Jenkins для автоматического тестирования приложения, когда изменения помещаются в репозиторий.
В этом уроке мы будем интегрировать Jenkins с GitHub, чтобы Jenkins получал уведомление, когда новый код помещается в репозиторий. Когда Jenkins получает уведомление, он извлекает код и затем тестирует его в контейнерах Docker, чтобы изолировать среду тестирования от хост-машины Jenkins. Мы будем использовать пример приложения Node.js, чтобы показать, как определить процесс CI / CD для проекта.
Предпосылки
Чтобы следовать этому руководству, вам понадобится сервер Ubuntu 16.04 с ОЗУ не менее 1 ГБ, настроенный для безопасной установки Jenkins. Для правильной защиты веб-интерфейса вам необходимо назначить доменное имя серверу Jenkins. Следуйте этим инструкциям, чтобы узнать, как настроить Jenkins в ожидаемом формате:
Чтобы лучше контролировать нашу среду тестирования, мы будем запускать тесты нашего приложения в контейнерах Docker. После запуска Jenkins установите Docker на сервер, выполнив шаги один и два данного руководства:
После того, как вы завершили приведенные выше руководства, вы можете продолжить чтение этой статьи.
Добавьте пользователя Jenkins в группу Docker
После выполнения предварительных условий на вашем сервере будут установлены как Jenkins, так и Docker. Однако по умолчанию пользователь Linux, ответственный за запуск процесса Jenkins, не может получить доступ к Docker.
Чтобы это исправить, нам нужно добавить пользователя + jenkins
в группу` + docker` с помощью команды + usermod
:
sudo usermod -aG docker jenkins
Вы можете перечислить членов группы + docker
, чтобы подтвердить, что пользователь` + jenkins` был успешно добавлен:
grep docker /etc/group
Outputdocker:x:999:sammy,jenkins
Чтобы Jenkins использовал свое новое членство, вам нужно перезапустить процесс:
sudo systemctl restart jenkins
С помощью некоторых плагинов по умолчанию, которые мы включили во время установки, Jenkins теперь может использовать Docker для запуска задач сборки и тестирования.
Создать токен личного доступа в GitHub
Чтобы Jenkins мог просматривать ваши проекты на GitHub, вам необходимо создать токен личного доступа в нашей учетной записи GitHub.
Начните с посещения GitHub и войдите в свой аккаунт, если вы этого еще не сделали. После этого нажмите на свой значок пользователя в верхнем правом углу и выберите * Настройки * из выпадающего меню:
изображение: https: //assets.digitalocean.com/articles/jenkins_usage_1604/github_settings_item.png [элемент настроек GitHub]
На следующей странице найдите раздел * Настройки разработчика * в левом меню и нажмите * Токены личного доступа *:
изображение: https: //assets.digitalocean.com/articles/jenkins_usage_1604/developer_settings.png [ссылка на токены личного доступа GitHub]
Нажмите кнопку * Создать новый токен * на следующей странице:
изображение: https: //assets.digitalocean.com/articles/jenkins_usage_1604/new_token_button.png [GitHub сгенерировать новую кнопку токена]
Вы попадете на страницу, где вы сможете определить область действия вашего нового токена.
В поле * Описание токена * добавьте описание, которое позволит вам распознать его позже:
изображение: https: //assets.digitalocean.com/articles/jenkins_usage_1604/token_description.png [описание токена GitHub]
В разделе * Выберите области действия * установите флажки * repo: status *, * repo: public_repo * и * admin: org_hook *. Это позволит Jenkins обновлять статусы коммитов и создавать веб-хуки для проекта. Если вы используете частный репозиторий, вам нужно выбрать общее разрешение * repo * вместо подпунктов репо:
изображение: https: //assets.digitalocean.com/articles/jenkins_usage_1604/token_scope3.png [область действия токена GitHub]
Когда вы закончите, нажмите * Создать токен * внизу.
Вы будете перенаправлены обратно на страницу индекса токенов личного доступа, и ваш новый токен отобразится:
изображение: https: //assets.digitalocean.com/articles/jenkins_usage_1604/view_token.png [GitHub просмотреть новый токен]
Скопируйте токен сейчас, чтобы мы могли ссылаться на него позже. Как указывается в сообщении, невозможно получить токен после того, как вы покинете эту страницу.
Теперь, когда у вас есть личный токен доступа для вашей учетной записи GitHub, мы можем настроить Jenkins для просмотра репозитория вашего проекта.
Добавьте токен личного доступа GitHub в Jenkins
Теперь, когда у нас есть токен, нам нужно добавить его на наш сервер Jenkins, чтобы он мог автоматически настраивать веб-хуки. Войдите в свой веб-интерфейс Jenkins, используя учетную запись администратора, которую вы настроили во время установки.
На главной панели инструментов нажмите * Credentials * в меню слева:
изображение: https: //assets.digitalocean.com/articles/jenkins_usage_1604/credentials_item.png [элемент учетных данных Jenkins]
На следующей странице щелкните стрелку рядом с * (global) * в области действия * Jenkins *. В появившемся окне нажмите * Добавить учетные данные *:
изображение: https: //assets.digitalocean.com/articles/jenkins_usage_1604/add_credentials.png [кнопка добавления учетных данных Jenkins]
Вы попадете в форму для добавления новых учетных данных.
В раскрывающемся меню * Вид * выберите * Секретный текст *. В поле * Secret * вставьте свой личный токен доступа GitHub. Заполните поле * Описание *, чтобы позже вы смогли идентифицировать эту запись. Вы можете оставить Scope как Global и поле ID пустым:
изображение: https: //assets.digitalocean.com/articles/jenkins_usage_1604/credentials_form.png [форма учетных данных Jenkins]
Нажмите кнопку * OK *, когда вы закончите.
Теперь вы сможете ссылаться на эти учетные данные из других частей Jenkins для помощи в настройке.
Настройка доступа Jenkins к GitHub
Вернувшись в основную панель управления Jenkins, нажмите * Manage Jenkins * в меню слева:
изображение: https: //assets.digitalocean.com/articles/jenkins_usage_1604/credentials_item.png [элемент учетных данных Jenkins]
В списке ссылок на следующей странице нажмите * Настроить систему *:
изображение: https: //assets.digitalocean.com/articles/jenkins_usage_1604/configure_system_link.png [Jenkins настроить системную ссылку]
Прокрутите параметры на следующей странице, пока не найдете раздел * GitHub *. Нажмите кнопку * Добавить GitHub Server * и выберите * GitHub Server *:
изображение: https: //assets.digitalocean.com/articles/jenkins_usage_1604/add_github_server.png [Jenkins добавить сервер GitHub]
Раздел расширится, чтобы запросить дополнительную информацию. В раскрывающемся меню * Credentials * выберите свой личный токен доступа GitHub, который вы добавили в предыдущем разделе:
изображение: https: //assets.digitalocean.com/articles/jenkins_usage_1604/select_credentials.png [Дженкинс выбирает учетные данные GitHub]
Нажмите кнопку * Проверить соединение *. Jenkins выполнит тестовый вызов API для вашей учетной записи и проверит подключение:
изображение: https: //assets.digitalocean.com/articles/jenkins_usage_1604/test_creds.png [Дженкинс проверяет учетные данные GitHub]
Когда вы закончите, нажмите кнопку * Сохранить *, чтобы внести изменения.
Настройте демонстрационное приложение в своей учетной записи GitHub
Чтобы продемонстрировать, как использовать Jenkins для тестирования приложения, мы будем использовать простую программу helhel world », созданную с помощью https://hapijs.com/[Hapi. УД. Поскольку мы настраиваем Jenkins для реагирования на изменения в репозитории, вам необходимо иметь собственную копию демонстрационного кода.
Посетите project хранилище и нажмите кнопку * Fork * в верхнем правом углу, чтобы сделать копию хранилища в своей учетной записи:
изображение: https: //assets.digitalocean.com/articles/jenkins_usage_1604/fork_example_project.png [пример проекта Fork]
Копия хранилища будет добавлена в ваш аккаунт.
Репозиторий содержит файл + package.json +
, который определяет зависимости времени выполнения и разработки, а также способ запуска включенного набора тестов. Зависимости можно установить, запустив + npm install +
, а тесты можно запустить с помощью + npm test +
.
Мы также добавили "+ Jenkinsfile +" в репозиторий. Дженкинс читает этот файл, чтобы определить действия, выполняемые с репозиторием для сборки, тестирования или развертывания. Он написан с использованием декларативной версии Jenkins Pipeline DSL.
+ Jenkinsfile +
, включенный в репозиторий + hello-hapi +
, выглядит следующим образом:
Jenkinsfile
#!/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'
}
}
}
}
+ Pipe +
содержит полное определение, которое будет оценивать Jenkins. Внутри у нас есть раздел + agent
, который указывает, где будут выполняться действия в конвейере. Чтобы изолировать нашу среду от хост-системы, мы будем тестировать в контейнерах Docker, указанных агентом + docker +
.
Поскольку Hapi.js является основой для Node.js, мы будем использовать образ Docker + node +
в качестве нашей базы. Мы указываем пользователя + root +
в контейнере, чтобы пользователь мог одновременно записывать как в присоединенный том, содержащий извлеченный код, так и в том, в который сценарий записывает свой вывод.
Далее файл определяет два этапа, которые являются просто логическим разделением работы. Мы назвали первый «Build», а второй «Test». На этапе сборки выводится диагностическое сообщение, а затем запускается + npm install +
для получения необходимых зависимостей. Шаг теста печатает другое сообщение и затем запускает тесты, как определено в файле + package.json +
.
Теперь, когда у вас есть хранилище с допустимым + Jenkinsfile +
, мы можем настроить Jenkins для просмотра этого хранилища и запуска файла при внесении изменений.
Создать новый конвейер в Дженкинс
Затем мы можем настроить Jenkins для использования личного маркера доступа GitHub для просмотра нашего хранилища.
Вернувшись в основную панель управления Jenkins, нажмите * New Item * в меню слева:
изображение: https: //assets.digitalocean.com/articles/jenkins_usage_1604/credentials_item.png [боковое меню Дженкинса]
Введите имя для нового конвейера в поле * Введите имя элемента *. Затем выберите * Pipeline * в качестве типа элемента:
изображение: https: //assets.digitalocean.com/articles/jenkins_usage_1604/item_type.png [тип конвейера Jenkins]
Нажмите кнопку * OK * внизу, чтобы двигаться дальше.
На следующем экране установите флажок * GitHub project *. В появившемся поле * Project url * введите URL-адрес хранилища GitHub вашего проекта.
изображение: https: //assets.digitalocean.com/articles/jenkins_usage_1604/add_github_project.png [Jenkins добавить проект GitHub]
Затем, в разделе * Build Triggers *, установите флажок * GitHub hook для опроса GITScm *:
изображение: https: //assets.digitalocean.com/articles/jenkins_usage_1604/github_hook_box.png [поле подключения Jenkins GitHub]
В разделе * Pipeline * мы должны указать Jenkins запустить конвейер, определенный в + Jenkinsfile +
в нашем репозитории. Измените тип * Definition * на * Конвейерный скрипт из SCM *.
В появившемся новом разделе выберите * Git * в меню * SCM *. В появившемся поле * Repository URL * введите URL-адрес своего форка репозитория:
изображение: https: //assets.digitalocean.com/articles/jenkins_usage_1604/add_pipeline_repo2.png [Jenkins GitHub добавить конвейерное хранилище]
Когда вы закончите, нажмите кнопку * Сохранить * внизу страницы.
Выполнение начальной сборки и настройка веб-крючков
На момент написания этой статьи (июнь 2017 г.) Jenkins не настраивал автоматически веб-подключения, когда вы определяете конвейер для хранилища в интерфейсе.
Для того, чтобы Дженкинс мог настроить соответствующие хуки, нам нужно выполнить ручную сборку в первый раз.
На главной странице вашего конвейера нажмите * Build Now * в меню слева:
изображение: https: //assets.digitalocean.com/articles/jenkins_usage_1604/build_pipeline_now.png [Дженкинс создает конвейер сейчас]
Новая сборка будет запланирована. В поле * Build History * в левом нижнем углу через мгновение должна появиться новая сборка. Кроме того, * Stage View * начнет рисоваться в основной области интерфейса. Это будет отслеживать ход вашего тестирования по завершении различных этапов:
изображение: https: //assets.digitalocean.com/articles/jenkins_usage_1604/build_progress.png [прогресс сборки Jenkins]
В поле * История сборки * щелкните номер, связанный со сборкой, чтобы перейти на страницу сведений о сборке. Отсюда вы можете нажать кнопку * Console Output * в меню слева, чтобы увидеть подробности выполненных шагов:
изображение: https: //assets.digitalocean.com/articles/jenkins_usage_1604/console_output.png [вывод на консоль Jenkins]
По окончании щелкните элемент * Back to Project * в левом меню, чтобы вернуться к основному виду конвейера.
Теперь, когда мы создали проект один раз, мы можем попросить Дженкинса создать веб-хуки для нашего проекта. Нажмите * Configure * в левом меню конвейера:
изображение: https: //assets.digitalocean.com/articles/jenkins_usage_1604/configure_menu_item.png [элемент конфигурации Jenkins]
На этом экране не требуется никаких изменений, просто нажмите кнопку * Сохранить * внизу. Теперь, когда у Jenkins есть информация о проекте из начального процесса сборки, он зарегистрирует webhook в нашем проекте GitHub, когда вы сохраните страницу.
Вы можете убедиться в этом, зайдя в свой репозиторий GitHub и нажав кнопку * Настройки *. На следующей странице нажмите * Webhooks * в боковом меню. Вы должны увидеть веб-крючок вашего сервера Jenkins в главном интерфейсе:
изображение: https: //assets.digitalocean.com/articles/jenkins_usage_1604/view_webhooks.png [Дженкинс просмотр веб-хукс]
Теперь, когда вы внесете новые изменения в свой репозиторий, Jenkins будет уведомлен. Затем он извлечет новый код и повторно протестирует его, используя ту же процедуру.
Чтобы приблизиться к этому, на нашей странице репозитория на GitHub вы можете нажать кнопку * Создать новый файл * слева от зеленой кнопки * Клонировать или загрузить *:
изображение: https: //assets.digitalocean.com/articles/jenkins_usage_1604/create_new_file_button.png [кнопка создания нового файла Дженкинса]
На следующей странице выберите имя файла и некоторое фиктивное содержимое:
изображение: https: //assets.digitalocean.com/articles/jenkins_usage_1604/new_file_contents.png [содержимое нового файла Jenkins]
Нажмите кнопку * Commit new file * внизу, когда вы закончите.
Если вы вернетесь к своему интерфейсу Jenkins, вы увидите, что новая сборка запускается автоматически:
изображение: https: //assets.digitalocean.com/articles/jenkins_usage_1604/new_build_started.png [Новая сборка Jenkins началась]
Вы можете запустить дополнительные сборки, сделав коммиты в локальную копию репозитория и отправив его обратно в GitHub.
Заключение
В этом руководстве мы настроили Jenkins для наблюдения за проектом GitHub и автоматического тестирования любых новых изменений, которые были зафиксированы. Дженкинс извлекает код из хранилища, а затем выполняет процедуры сборки и тестирования из изолированных контейнеров Docker. Полученный код можно развернуть или сохранить, добавив дополнительные инструкции к тому же + Jenkinsfile +
.