Полное руководство по настройке деплоя из gitlab в Jenkins и на продакшен сервер
- 13 апреля, 2023
- 9:15 дп
- Нет комментариев
ГАЙД ПО JENKINS
Перед началом работу нужно убедиться, что установлены следующие плагины:
Так же на slave серверах должно быть установлено java jdk, jre
Этап 1. Подключение агента
Первое что нужно сделать – подключить агент. Этот агент будет сервер на который мы хотим делать деплой.
1. Настройка доступов
Нужно настроить доступы к серверам. Идем на МАСТЕР-сервер и заходим под пользователем Jenkins:
su Jenkins
Далее генерируем ключи ssh:
ssh-keygen -t ed25519
Мастер-сервер
Заходим на SLAVE-сервер и создаем там нового пользователя Jenkins:
useradd -m -s /bin/bash Jenkins
В /home должна появиться папка jenkins
Slave-сервер
Добавим пароль к пользователю Jenkins:
sudo passwd jenkins
Теперь нужно «настроить» ключи, для этого нужно в папке Jenkins создать папку .ssh:
cd /home/jenkins
mkdir .ssh
Перейдем в папку .ssh и создам файл authorized_keys
cd .ssh/ && touch authorized_keys
И положим наш публичный ключ с МАСТЕРА в этот файл
Мастер-сервер
Slave-сервер
Добавим пользователя Jenkins в группу sudo:
usermod -aG sudo Jenkins
Настройка пользователя завершена
2. Подключение агента
Теперь подключаем агента, для этого идем на наш МАСТЕР и заходим в Jenkins
Далее идем по Manage Jenkins -> Manage Nodes and Clouds -> New node
Даем название агента:
Заполняем строки:
Remote root directory: /home/Jenkins
Label: ВАША_МЕТКА <- Обязательно заполнить
Настроим способ запуска:
В поле Host вводим адрес SLAVE сервер и далее нам нужно добавить наши креды для этго нажимаем на Add->Jenkins
Появится окно добавления кредов:
Выбираем следующиее:
1) Kind -> SSH Username with private key
2) ID тут вводим как хоти назвать данный кред
3) Username вводим нашего пользователя, который создавали на SLAVE т.е jenkins
4) Private key вводим наш приватный ключ с МАСТЕРА
Сохраняем и выбираем наш кред:
Выбираем политику верификации -> Manually trusted key Verification Strategy
Сохраняем и смотрим подключился ли агент
Агент доступен, в логах агента видим успешное подключение
Отлично, вы подключили агента, теперь нужно настроить автодеплой на этот сервер
Этап 2. Настройка деплоя
Настроим креды для Gitlab:
Manage Jenkins -> Configure System
1) Спускаемся вниз до Gitlab
2) Впишем название подключения
A name for the connection -> Gitlab
3) Впишем URL
Gitlab host URL -> https://gitlab.com/
Добавим токен Gitlab
Где взять токен?
Идем в наш Gitlab и переходим в репозиторий с кодом
Далее Setting -> Access Token
Даем название токену, даты окончания, роль выбираем Developer, даем полные права, сохраняем токен и копируем его значение.
Возвращаемся в Jenkins и добавляем токен как кред:
Kind -> Gitlab API Token
После всех действий тестируем подключение, должно быть Success
Перейдем на настройке самого Pipeline
Для этого на домашней странице нажимаем “Add item”
Выбираем Freestyle Job он самый первый будет
И попадаем в настройки Pipeline
Выбираем Gitlab Connection наше подключение -> Gitlab
Выбираем «Ограничить лейблы сборщиков, которые могут исполнять данную задачу»
Вводим нашу метку, который мы давали SLAVE агенту. Удалите в конце пробел, это поле чувствительно к регистру
Открываем вкладку «Расширенные»(Advanced) и выбираем
«Использовать другую директорию»
ВАЖНО: этот пункт отвечает в какую папку на SLAVE будет собираться проект для теста я укажу /home/Jenkins/app, но тут можно указать деплой прямо в /var/lib/www/…. т.е куда смотрит конфиг веб-сервера. Менять по своему усмотрению
Переходим в следующему пункту «Управление исходном кодом»
Заполняем:
1) Repository URL
Путь к нашему репозиторию, в моем случае:
https://gitlab.com/omroners/laravel
Даем название токену, даты окончания, роль выбираем Developer, даем полные права, сохраняем токен и копируем его значение.
2) Добавим креды от нашего Gitlab в форме Username and Login
Вводим Username и Password от своего Gitlab пользователя Сохраняем и выбираем наши креды
3) Branches to build
Тут выбираем нашу ветку для сборки(какая у вас ветка для деплоя), в моем случае у меня одна единственная ветка main, поэтому я могу оставить это поле пустым и оно будет брать любую доступную
4) Выбираем «Просмоторщик репозитория» -> Gitlab
Переходим к следующему пункту «Триггеры сборки»
Остановимся тут по подробнее, Jenkins предлагает различные варианты запуска проект, его можно запускать вручную, запускать периодически, или через url, настроить Webhook для Gitlab.
Я буду настраивать Webhook т.к это самое лучшее решение. Что он даст? Нам не нужно будет постоянно запускать наш билд, он будет автоматически подхватывать изменения с Gitlab
В панели дженкинс /job/имя проекта/configure
Выберем пункт Build when a change is pushed to GitLab. GitLab webhook URL: http://85.192.40.214:8080/project/Deploy
Перед нами откроется выбор политики работы Webhook, тут настройте по своему усмотрению, для своего случая я выберу Push Event, он будет запускать сборки когда в Gitlab произойдет событие Push. Есть различные варианты: когда будет открыт запрос на Merge Request, когда принят Merge Request, когда закрыт Merge Request
Когда определились с политикой, нужно интегрировать Webhook.
Для этого идем в Gitlab репозиторий проекта и выбирает Settings ->
Integration и ищем Jenkins
Заполняем триггеры срабатывания
И вводим URL до нашего Pipeline его можно посмотреть тут
Вводим имя проекта, логин и пароль от Jenkins
Проверим подключение
Отлично. Webhook подключен
Теперь нужно определиться когда выполнять миграцию php artisan migrate. Тут можно сделать как ДО процесса сборки, так и ПОСЛЕ деплоя.
Я выберу сразу оба, чтобы показать как это будет работать.
Для этого выберем в «Среда сборки» Run buildstep before SCM runs
Добавим шаг выполнить команду shell
Добавим еще выполнение команд после сборки проекта
«Шаги сборки»
Отлично. Мы закончили настройку нашего Pipeline, теперь запустим его и посмотрим что будет на сервере SLAVE
Выбираем Build Now
Наша сборка завершилась, но у меня закрылась с ошибкой т.к у меня в репозитории нету vendors, зато наш проект скопировался на сервер
Теперь проверим как работает наш автодеплой и триггеры, для этого я изменю в репозитории файл README и сделаю Push
До изменения
Как видим Jenkins автоматически начал сборку проекта после того как я внес изменения в репозиторий
Подхватилось только то изменение которые было внесено
Зайдем в логи сборки и увидим следующие: в нашем модуле который выполняет команды ПЕРЕД сборкой проекта выполнился php artisan migrate
Далее выполнился деплой с репозитория
И после была команда сделать опять php artisan migrate, но т.к она была сделана ранее то ничего не смигрировалось
Наша сборка закрылась успешно
Мы полностью настроили Jenkins, подключили агента, и настроили авто деплой тех файлов, которые изменяются в репозитории