Jenkins: особливості архітектури та використання
Автоматизація є ключовим елементом для пришвидшення циклів доставки продукту та покращення якості коду. Серед інструментів автоматизації багато спеціалістів надають перевагу Jenkins. Розберімо, що таке Jenkins, як його компоненти працюють разом і навіщо його використовувати DevOps-інженеру.
Що таке Jenkins
Jenkins — один з ключових інструментів CI/CD, який дозволяє автоматизувати різні етапи життєвого циклу розробки. Він працює як центральний хаб і керує такими завданнями, як створення, тестування та розгортання програми. Цей безоплатний open-source інструмент може інтегруватися з багатьма інструментами DevOps і має понад тисячу плагінів для розширення можливостей та кастомізації.
Jenkins має такі переваги:
- адаптивність та гнучкість, оскільки Jenkins побудований на Java і працює на різних платформах;
- потужна система плагінів, що дозволяють Jenkins інтегруватися з великою кількістю інструментів, як, наприклад, Git, Maven і Docker;
- масштабованість, тому що Jenkins може працювати з великомасштабними проєктами, розподіляючи збірки між кількома агентами. Ці агенти можуть бути окремими машинами або віртуальними середовищами, які розвантажують обчислювальну потужність, необхідну для складних білдів;
- відкритий код з доступом до безлічі ресурсів та підтримки, а також постійний розвиток інструменту.
Для чого айтівці використовують Jenkins
Популярність інструмента Jenkins пов’язана з тим, що він здатен відстежувати та контролювати повторювані дії, які необхідні протягом розробки проєкту. Наприклад, Jenkins може постійно тестувати білди та попереджати про будь-які помилки на ранній стадії. Основні варіанти використання Jenkins — це:
- розгортання коду на продакшені
Якщо всі тести пройдені успішно, Jenkins може автоматично опублікувати код на середовищах stage і prod. Зміни в коді внесені і готові до об’єднання з основним кодом, але цей процес ще не відбувся. Потім код розподіляється у середовище препродакшену або навіть у продакшен.
- автоматизація завдань
Якщо розробник працює в декількох середовищах, йому потрібно встановити або оновити елемент у кожному з них. Якщо інсталяція або оновлення вимагає багато дій, то їхнє впровадження вручну може призвести до помилок.
Замість цього у Jenkins можна прописати всі кроки, необхідні для завершення процесу. Це дія, яку необхідно зробити лише один раз, отже вона займе менше часу, і ти зможеш завершити інсталяцію або оновлення без помилок.
- полегшення CI-процесів
Перш ніж зарелізити зміни до ПЗ, вони повинні пройти через низку складних процесів. Пайплайн Jenkins забезпечує послідовність та зв’язок багатьох подій і завдань для забезпечення безперервної інтеграції. Цей інструмент має набір плагінів, які спрощують інтеграцію та впровадження CI/CD-конвеєрів. Головною особливістю пайплайну Jenkins є те, що кожне завдання або робота залежить від іншого завдання.
- спрощення траблшутингу
Коли Jenkins виконує певні завдання, він виводить дані з консолі з параметрів stdout і stderr. Це робить пошук та усунення ймовірних несправностей за допомогою Jenkins надзвичайно простим та швидким.
Архітектура Jenkins
Jenkins працює наступним чином.
Крок 1. Розробники вносять зміни у вихідний код, який знаходиться в репозиторії, далі сервер Jenkins CI перевіряє репозиторій через регулярні проміжки часу та витягує будь-який новий доступний код.
Крок 2. Сервер збирає код у файл, що буде виконуватися. У разі виникнення проблем розробникам надсилається сповіщення.
Крок 3. Jenkins розгортає білд на тестовому сервері. Якщо тест неуспішний, розробники отримують сповіщення.
Крок 4. Якщо у коді немає помилок, перевірена програма розгортається на продакшені.
Файли можуть містити різний код і бути дуже великими, тому з’являється потреба у кількох білдах. Однак один сервер Jenkins не може обробляти декілька файлів і білдів одночасно, тому для таких проєктів необхідна розподілена архітектура Jenkins.
Ключові компоненти Jenkins — це Master Node та Agent Nodes/Clouds.
Загальна архітектура Jenkins виглядає так:
Розгляньмо ці компоненти окремо.
Jenkins Master Node
Сервер Jenkins (головний вузол) містить усі ключові конфігурації. Майстер-нода Jenkins схожа на керівний сервер, який організовує весь робочий процес, визначений у конвеєрах, як планування завдань, моніторинг завдань тощо.
Ключові компоненти Jenkins Master Node:
- Jenkins Jobs — набір кроків, за допомогою яких можна зібрати вихідний код, протестувати його, запустити скрипт командного рядка тощо. Зазвичай це називається пайплайном або конвеєром;
- Jenkins Plugins — модулі, розроблені спільнотою, які можна встановити на свій сервер Jenkins. Дозволяють отримати більше функцій, які типово не доступні в Jenkins;
- Jenkins Credentials — іноді для налаштування пайплайну Jenkins необхідно прописати сценарій, де інструменту потрібно під’єднатися до хмарного облікового запису, сервера, бази даних або кінцевої точки API з використанням секретів;
- Jenkins Nodes/Clouds — можна налаштувати декілька вузлів агентів (Linux, Windows) або хмар (Docker, Kubernetes) для виконання завдань;
- Jenkins Global Config — можна налаштувати всі конфігурації встановлених плагінів та власні глобальні конфігурації Jenkins.
Jenkins Agent
Агенти Jenkins — це робочі вузли, які фактично виконують всі кроки, вказані у завданні. Під час створення завдання для Jenkins, необхідно призначити йому агента. Кожен агент має певну мітку, що є унікальним ідентифікатором.
Коли ти запускаєш завдання Jenkins з майстер-ноди, фактичне виконання відбувається на ноді агента, який налаштований у завданні. Можна мати будь-яку кількість агентів Jenkins, приєднаних до головного агента з комбінацією серверів Windows, Linux і навіть контейнерів, що слугують агентами білда.
Є 2 типи Jenkins-агентів:
- вузли — це сервери (Windows/Linux), що будуть налаштовані як статичні агенти. Ці агенти будуть постійно працювати і залишатися на зв’язку з сервером Jenkins;
- хмари — це динамічні агенти. Кожного разу, коли ти запускаєш завдання, агент за потребою розгортається як віртуальна машина або контейнер і видаляється після завершення завдання.
Післяслово
Після ознайомлення з основними компонентами Jenkins та їхньою взаємодією, цей інструмент сприймається як більш потужний. Його архітектура у поєднанні з широкою системою плагінів, яка тільки розширюється, дозволяє автоматизувати велику кількість завдань та полегшити роботу спеціаліста в межах життєвого циклу розробки.
Jenkins — один з кращих CI/CD-інструментів, отже він є необхідним у роботі DevOps-інженера. Якщо ти тільки плануєш освоїти цю професію, рекомендуємо пройти курс «DevOps з нуля». Протягом 9 місяців ти не тільки засвоїш теорію, що необхідна для роботи, але й отримаєш практичний досвід використання багатьох DevOps-інструментів.