Розуміння агентів у Jenkins
Агент — це як помічник на кухні: це машина або програмне забезпечення, яке виконує конкретні завдання, такі як запуск скриптів, виконання тестів або створення компонентів. Давайте спростимо це через наочну аналогію: уявіть, що Пунеет керує жвавою ресторанною справою. Щоб все йшло гладко, він наймає спеціалізованих кухарів — кондитера для десертів, гардеробера для салатів та соусера для соусів. Кожен кухар є експертом у своїй сфері і займається конкретними завданнями.
У цій аналогії ресторан Пунеета — це конвеєр (pipeline), а кухарі — це агенти. Так само, як вам потрібен кондитер для приготування ідеального торту, вам потрібен агент на базі Linux для виконання shell-скрипту. Правильний кухар (або агент) гарантує, що робота буде виконана ефективно і бездоганно!
Тепер, коли ми маємо чітке уявлення про агентів у Jenkins, ця стаття зосередиться на використанні контейнерів Docker як агентів, залишаючи інші типи вузлів для окремої дискусії. Почнемо з того, щоб зрозуміти, що таке контейнер як агент, і які переваги це приносить.
Чому контейнери як агенти революціонізують CI/CD конвеєри
У Jenkins концепція "контейнера як агента" передбачає використання контейнера Docker як агента для збірки. Це дозволяє виконувати завдання Jenkins у самодостатньому середовищі, надаючи ізоляцію та гнучкість для різних вимог до збірки. Давайте розглянемо це через просту і наочну аналогію.
Уявіть, що ресторан Пунеета вже не може собі дозволити тримати постійних кухарів для кожної ролі, і це стає непрактичним з фінансової точки зору. Тому Пунеет приходить до чудової ідеї: замість найму постійних кухарів він найматиме фрілансерів! Ці кухарі будуть викликатися лише тоді, коли їх спеціалізація буде потрібна. Ось як Пунеет пояснює план своїй команді:
Пунеет:
"Наш ресторан стикається з труднощами, тому замість того, щоб утримувати постійних кухарів, я вирішив найняти вас як фрілансерів. Так я зможу викликати вас лише тоді, коли ваші спеціалізовані навички будуть потрібні — наприклад, кондитера для десертів або соусера для соусів. Це ефективно, економно і дає можливість максимально використовувати ваші здібності!"
Кухар 1 (Кондитер):
"Отже, я прийду тільки коли буде замовлення на десерт? Звучить солодко!"
Кухар 2 (Гардеробер):
"То я можу брати інші підробітки? Я за!"
Кухар 3 (Соусер):
"Хм, має сенс. Немає сенсу платити мені, щоб я просто сидів, коли немає соусів, які треба приготувати!"
Тепер давайте перенесемо це в контекст Jenkins:
Контейнери як кухарі в Jenkins
У цій аналогії ресторан представляє ваш конвеєр Jenkins, а кухарі — агенти. Традиційно агенти можуть бути постійними працівниками — спеціалізованими машинами або віртуальними машинами, налаштованими для виконання завдань Jenkins. Однак це може бути ресурсоємним і дорогим.
Використовуючи контейнери як агентів, ви створюєте більш гнучку, за вимогою систему. Контейнери запускаються лише тоді, коли конвеєр ініціює завдання, так само як виклик фрілансера для конкретного завдання.
Встановлення контейнера як агента
Припускаємо, що Jenkins вже встановлений на вашій машині.
Встановлення плагіна Docker Pipeline у Jenkins:
- Увійдіть в Jenkins.
- Перейдіть до Manage Jenkins > Manage Plugins.
- У вкладці Available знайдіть "Docker Pipeline".
- Виберіть плагін і натисніть кнопку Install.
- Після встановлення плагіна перезапустіть Jenkins.
Налаштування Docker Slave
Запустіть команду нижче для встановлення Docker:
sudo apt update
sudo apt install docker.io
Надання прав користувачеві Jenkins і користувачеві Ubuntu для доступу до docker deamon.
sudo su -
usermod -aG docker jenkins
usermod -aG docker ubuntu
systemctl restart docker
Після завершення цих кроків краще перезапустити Jenkins.
http://:8080/restart
Налаштування контейнерного агента завершено успішно.
Створення Jenkins Pipeline з контейнерним агентом для Java та Maven проектів
У цьому проєкті ми продемонструємо, як створити конвеєр для Java проєкту, що вимагає Java 8 та Maven. Процес включає створення кастомного Docker-образу з необхідними інструментами та налаштування його в Jenkins pipeline.
Крок 1: Створення Dockerfile для Java 8 і Maven
Перший крок — створити Dockerfile, який встановлює Java 8 та Maven. Нижче наведений Dockerfile:
FROM openjdk:8-jdk
ENV MAVEN_VERSION=3.9.5
ENV MAVEN_HOME=/opt/maven
ENV PATH=$MAVEN_HOME/bin:$PATH
RUN
&& mkdir -p /opt \
&& curl -fsSL https://downloads.apache.org/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz \
| tar -xz -C /opt \
&& mv /opt/apache-maven-${MAVEN_VERSION} $MAVEN_HOME \
&& chmod +x $MAVEN_HOME/bin/mvn
RUN java -version && mvn -version
Створення Docker-образу
Після того, як Dockerfile готовий, створіть Docker-образ за допомогою наступної команди:
docker build -t jenkins-agent:1 .
Це створює образ з ім'ям jenkins-agent:1
, який ми будемо використовувати як контейнерного агента у нашому Jenkins pipeline.
Крок 2: Налаштування Jenkinsfile
Після підготовки Docker-образу, наступний крок — налаштування Jenkinsfile. Нижче наведена конфігурація Jenkins pipeline:
pipeline {
agent {
**docker {
image 'jenkins-agent:1'
args '-u root'
}**
}
parameters {
string defaultValue: 'buildBranch', description: 'Build Branch ', name: 'Branch'
}
stages {
stage('Download Code') {
steps {
git branch: env.Branch, credentialsId: '{Crediantial-ID}', url: '{Git-URL}'
}
}
stage('Build') {
steps {
// Запуск Maven clean та install з динамічними значеннями версій
sh 'mvn clean install '
}
}
}
}
У наведеному Jenkinsfile виділена частина, де ми визначаємо деталі нашого образу для контейнерного агента.
Адаптація конвеєра для інших проєктів
Якщо ваш проєкт потребує іншого середовища, ви можете змінити Dockerfile відповідно до вимог. Наприклад:
- Python проєкти: Створіть Dockerfile з встановленим Python.
- Node.js проєкти: Використовуйте образ на базі Node.js і встановіть необхідні залежності.
Ключові моменти
- Контейнери як агенти забезпечують гнучку систему за запитом для запуску конвеєрів.
- Дозволяють паралельне виконання кількох конвеєрів без конфліктів ресурсів.
- Контейнери видаляються після завершення конвеєра, незалежно від того, чи був він успішним чи проваленим, що забезпечує ефективне використання ресурсів.
- У цьому випадку майстер-вузол (master node) виступає як агент. Однак рекомендованим підходом є налаштування майстер-агент системи Jenkins для різних вимог до завдань, щоб не пошкодити сервер Jenkins через будь-які системні зміни конфігурації, необхідні для виконання завдання.
Перекладено з: Optimizing Jenkins Pipelines with Docker Container Agents