Оптимізація Jenkins Pipelines за допомогою контейнерних агентів Docker

pic

Розуміння агентів у Jenkins

Агент — це як помічник на кухні: це машина або програмне забезпечення, яке виконує конкретні завдання, такі як запуск скриптів, виконання тестів або створення компонентів. Давайте спростимо це через наочну аналогію: уявіть, що Пунеет керує жвавою ресторанною справою. Щоб все йшло гладко, він наймає спеціалізованих кухарів — кондитера для десертів, гардеробера для салатів та соусера для соусів. Кожен кухар є експертом у своїй сфері і займається конкретними завданнями.

У цій аналогії ресторан Пунеета — це конвеєр (pipeline), а кухарі — це агенти. Так само, як вам потрібен кондитер для приготування ідеального торту, вам потрібен агент на базі Linux для виконання shell-скрипту. Правильний кухар (або агент) гарантує, що робота буде виконана ефективно і бездоганно!

Тепер, коли ми маємо чітке уявлення про агентів у Jenkins, ця стаття зосередиться на використанні контейнерів Docker як агентів, залишаючи інші типи вузлів для окремої дискусії. Почнемо з того, щоб зрозуміти, що таке контейнер як агент, і які переваги це приносить.

Чому контейнери як агенти революціонізують CI/CD конвеєри

У Jenkins концепція "контейнера як агента" передбачає використання контейнера Docker як агента для збірки. Це дозволяє виконувати завдання Jenkins у самодостатньому середовищі, надаючи ізоляцію та гнучкість для різних вимог до збірки. Давайте розглянемо це через просту і наочну аналогію.

pic

Уявіть, що ресторан Пунеета вже не може собі дозволити тримати постійних кухарів для кожної ролі, і це стає непрактичним з фінансової точки зору. Тому Пунеет приходить до чудової ідеї: замість найму постійних кухарів він найматиме фрілансерів! Ці кухарі будуть викликатися лише тоді, коли їх спеціалізація буде потрібна. Ось як Пунеет пояснює план своїй команді:

Пунеет:
"Наш ресторан стикається з труднощами, тому замість того, щоб утримувати постійних кухарів, я вирішив найняти вас як фрілансерів. Так я зможу викликати вас лише тоді, коли ваші спеціалізовані навички будуть потрібні — наприклад, кондитера для десертів або соусера для соусів. Це ефективно, економно і дає можливість максимально використовувати ваші здібності!"

Кухар 1 (Кондитер):
"Отже, я прийду тільки коли буде замовлення на десерт? Звучить солодко!"

Кухар 2 (Гардеробер):
"То я можу брати інші підробітки? Я за!"

Кухар 3 (Соусер):
"Хм, має сенс. Немає сенсу платити мені, щоб я просто сидів, коли немає соусів, які треба приготувати!"

Тепер давайте перенесемо це в контекст Jenkins:

Контейнери як кухарі в Jenkins

У цій аналогії ресторан представляє ваш конвеєр Jenkins, а кухарі — агенти. Традиційно агенти можуть бути постійними працівниками — спеціалізованими машинами або віртуальними машинами, налаштованими для виконання завдань Jenkins. Однак це може бути ресурсоємним і дорогим.

Використовуючи контейнери як агентів, ви створюєте більш гнучку, за вимогою систему. Контейнери запускаються лише тоді, коли конвеєр ініціює завдання, так само як виклик фрілансера для конкретного завдання.
pic

Встановлення контейнера як агента

Припускаємо, що Jenkins вже встановлений на вашій машині.

Встановлення плагіна Docker Pipeline у Jenkins:

  • Увійдіть в Jenkins.
  • Перейдіть до Manage Jenkins > Manage Plugins.
  • У вкладці Available знайдіть "Docker Pipeline".
  • Виберіть плагін і натисніть кнопку Install.
  • Після встановлення плагіна перезапустіть Jenkins.

pic

Налаштування 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

Leave a Reply

Your email address will not be published. Required fields are marked *