Jenkins — це сервер автоматизації з відкритим кодом, який відіграє важливу роль у реалізації CI/CD пайплайнів. У цьому пості ми розглянемо, як налаштувати пайплайн Jenkins, який автоматизує весь робочий процес для розгортання Docker-застосунку.
Пайплайн має чотири основні етапи:
- Завантаження коду з Git репозиторію.
- Створення Docker образу за допомогою Dockerfile.
- Завантаження образу в AWS Elastic Container Registry (ECR).
- Нарешті, розгортання образу на AWS Elastic Beanstalk.
Попередні вимоги
Перед тим як почати налаштування, переконайтеся, що у вас є:
- Обліковий запис AWS (безкоштовний рівень підходить для цього налаштування).
- Встановлені Jenkins та Docker на вашому локальному комп’ютері або хмарному інстансі.
- Базове знайомство з Jenkins, Docker та сервісами AWS.
- Встановлений AWS CLI на вашому комп’ютері.
Встановлення Jenkins
Jenkins можна налаштувати на вашому локальному комп’ютері або шляхом безпосереднього встановлення, або через Docker. Ви можете знайти інструкції з встановлення для Windows, Linux, macOS, Docker.
Налаштування AWS облікових даних в Jenkins
Щоб взаємодіяти з сервісами AWS, потрібно додати наші облікові дані AWS до Jenkins як змінні середовища. Спочатку перейдіть в розділ "IAM" в консолі AWS. Створіть нового користувача або знайдіть існуючого користувача, для якого хочете створити ключі доступу.
Примітка: Не створюйте ключі доступу для користувача **Admin**. Рекомендується створювати користувача з мінімальними привілеями, необхідними для задач, які виконуватиме Jenkins.
Натисніть "Users" з лівої панелі, виберіть користувача, перейдіть на вкладку "Security credentials" і натисніть "Create access key". Дотримуйтесь інструкцій і завантажте файл з ключами доступу або скопіюйте Access Key ID та Secret Access Key в безпечне місце.
Далі необхідно додати ці облікові дані в Jenkins. Відкрийте Jenkins і перейдіть до “Manage Jenkins” > “Credentials”. У домені "global" (або в іншому домені, якщо ви маєте кілька) натисніть "Add Credentials". Виберіть "AWS Credentials" у полі "Kind", введіть отримані Access Key ID та Secret Access Key. Дайте обліковим даним зрозумілу назву.
Створення репозиторію в AWS Elastic Container Registry
Потрібно створити репозиторій для завантаження нашого Docker образу. У консолі AWS знайдіть "Elastic Container Registry". Ви можете створити приватний або публічний репозиторій. Для простоти створимо публічний репозиторій. Натисніть "Create Repository" та надайте йому ім'я.
Можна пропустити всі розділи "Optional" і натискати "Create Repository". Ваш репозиторій буде створено за короткий час.
Примітка: Як видно на зображенні вище, це буде посилання на ваш ECR репозиторій, “public.ecr.aws/b2n3p6u5/{your registry name}”
Створення Dockerfile та Docker.aws.json файлів
Далі ми напишемо Dockerfile
для нашого застосунку, щоб його можна було контейнеризувати. Ось простий Dockerfile
для базового Node.js застосунку.
FROM --platform=linux/amd64 node:14
# Встановлюємо робочу директорію в контейнері на /app
WORKDIR /app
# Копіюємо package.json та package-lock.json в робочу директорію
COPY package*.json ./
# Встановлюємо залежності застосунку всередині Docker образу
RUN npm install
# Копіюємо решту коду застосунку в робочу директорію
COPY . .
# Відкриваємо порт 8080 для застосунку.
EXPOSE 8080
# Визначаємо команду для запуску застосунку
CMD ["npm", "start"]
Примітка: Переконайтеся, що ви перевірили локальне збирання Docker перед тим, як продовжити.
Додатково, нам потрібно створити файл “Docker.aws.json”.
Elastic Beanstalk шукатиме цей файл, щоб дізнатися, звідки завантажити наш Docker образ, в даному випадку Docker образ буде розміщений у нашому репозиторії AWS ECR.
{
"AWSEBDockerrunVersion": "1",
"Image": {
"Name": "public.ecr.aws/b2n3p6u5/projectcontainer",
"Update": "true"
},
"Ports": [
{
"ContainerPort": "8080"
}
]
}
Замініть поле “Name” на посилання на ваш ECR репозиторій, яке ви отримали в попередньому розділі.
Примітка: Обидва ці файли повинні бути розміщені в кореневій директорії вашого проєкту.
Створення профілю EC2 для Elastic Beanstalk
Перед створенням нашого середовища в Elastic Beanstalk ми створимо набір дозволів для EC2 інстансів, які буде створювати Elastic Beanstalk. Це гарантує, що Elastic Beanstalk зможе належним чином налаштувати ресурси та отримати доступ до інших ресурсів AWS, таких як наш репозиторій ECR, і зможе створювати та запускати Docker застосунки на цих EC2 інстансах.
Відкрийте сервіс “IAM” в іншій вкладці браузера. З лівої панелі натисніть “Roles” і виберіть “Create Role”. Виберіть “AWS service” і EC2 в розділі “Use case” і натисніть Next.
Далі пошукайте наступні дозволи та виберіть їх:
- AWSElasticBeanstalkMulticontainerDocker
- AmazonEC2ContainerRegistryReadOnly
- AWSElasticBeanstalkWebTier
- AWSElasticBeanstalkWorkerTier
Дайте роль зрозумілу назву (наприклад, aws-ec2-elasticbeanstalk) і перегляньте ваші дозволи, вони повинні виглядати так:
Натисніть “Create Role”, і ваша роль буде створена.
Створення середовища застосунку в AWS
AWS Elastic Beanstalk — це Platform as a Service (PaaS) від AWS, який дозволяє вам розгортати застосунки без необхідності керувати основною інфраструктурою.
Перед тим як розгорнути наш Docker-застосунок за допомогою Jenkins, ми повинні налаштувати середовище в AWS Elastic Beanstalk. Знайдіть “Elastic Beanstalk” в консолі AWS. Це перенесе вас на панель управління Elastic Beanstalk.
Натисніть “Create Application”, що знаходиться в верхньому правому куті панелі управління Elastic Beanstalk. У розділі Environment tier виберіть “Web server Environment”. Введіть ім’я для вашого застосунку в поле “Application Name” і надайте ім’я середовища в розділі “Environment information”.
Виберіть “Docker” як тип платформи і “Docker, що працює на 64-бітному Amazon Linux 2023”.
Виберіть “Sample Application” в розділі Application code, це дозволить AWS розгорнути тестовий проєкт на Elastic Beanstalk для перевірки, що застосунки правильно розгортаються на власному середовищі Elastic Beanstalk. Потім ми замінимо цей тестовий застосунок на наш власний. Виберіть “Single Instance” в розділі Presets і натисніть Next.
Далі виберіть “Create and use new service role”, AWS автоматично створить нову роль для вас. У розділі “EC2 instance profile” виберіть роль, яку ми створили на попередньому кроці. Натисніть Skip, щоб переглянути, або за бажанням налаштуйте інстанси EC2, бази даних, мережі та балансувальники навантаження, які буде використовувати Elastic Beanstalk.
Натисніть “Submit” внизу сторінки, і ваше середовище почне налаштовуватися, це може зайняти кілька хвилин. Після створення застосунку ви зможете побачити стан вашого застосунку, а також домен, призначений Elastic Beanstalk.
Створення Jenkins Pipeline
Увійдіть в панель управління Jenkins, з лівої панелі натисніть “New item”.
Виберіть “Pipeline” і надайте вашому pipeline (конвеєр) назву, потім натисніть Ok.
Натисніть “Github Project” і введіть URL вашого репозиторію на Github.
Прокрутіть вниз і ви побачите секцію Pipeline (конвеєр) та редактор. Ось скрипт, який ми будемо використовувати.
pipeline {
agent any
environment {
AWS_DEFAULT_REGION = 'your default region'
AWS_ACCOUNT_ID = 'your account id'
ECR_REPOSITORY = 'your ecr repository'
IMAGE_TAG = "latest" // Або використовуйте динамічний тег на основі номера збірки або git коміту
EB_APPLICATION_NAME = 'your elastic beanstalk application'
EB_ENVIRONMENT_NAME = 'your elastic beanstalk env'
S3_BUCKET = 'S3 bucket created by Elastic Beanstalk'
}
stages {
stage('Checkout Code') {
steps {
// Використовуємо плагін Git для отримання коду
git branch: 'main', url: 'https://github.com/prabhnoorsingh22/Jenkins-AWS-Pipeline'
}
}
stage('Build Docker Image') {
steps {
script {
docker.build("${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${ECR_REPOSITORY}:${IMAGE_TAG}")
}
}
}
stage('Push to ECR') {
steps {
script {
withAWS(credentials: 'aws-jenkins', region: "${AWS_DEFAULT_REGION}") {
sh "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/b2n3p6u5"
sh "docker tag ${AWS_ACCOUNT_ID}.dkr.ecr.us-east-1.amazonaws.com/${ECR_REPOSITORY}:${IMAGE_TAG} public.ecr.aws/b2n3p6u5/projectcontainer:latest"
sh "docker push public.ecr.aws/b2n3p6u5/projectcontainer:latest"
}
}
}
}
stage('Deploy to Elastic Beanstalk') {
steps {
script {
// Архівуємо Dockerrun.aws.json для розгортання на Elastic Beanstalk
sh "zip -r deployment-package.zip Dockerrun.aws.json"
// Створюємо нову версію застосунку та оновлюємо середовище
withAWS(credentials: 'aws-jenkins', region: "${AWS_DEFAULT_REGION}") {
sh "aws s3 cp deployment-package.zip s3://${S3_BUCKET}/${EB_APPLICATION_NAME}-${IMAGE_TAG}.zip"
sh "aws elasticbeanstalk create-application-version --application-name ${EB_APPLICATION_NAME} --version-label ${IMAGE_TAG} --source-bundle S3Bucket=${S3_BUCKET},S3Key=${EB_APPLICATION_NAME}-${IMAGE_TAG}.zip"
sh "aws elasticbeanstalk update-environment --application-name ${EB_APPLICATION_NAME} --environment-name ${EB_ENVIRONMENT_NAME} --version-label ${IMAGE_TAG}"
}
}
}
}
}
}
Перш за все, нам потрібно налаштувати деякі змінні середовища, такі як регіон за замовчуванням, ID облікового запису (це можна знайти, натиснувши на ім'я вашого користувача у верхньому правому куті консолі AWS), репозиторій ECR тощо.
Примітка: Якщо ви правильно виконали попередній розділ, Elastic Beanstalk створить S3 бакет для зберігання даних про застосунок. Пошукайте “S3” і ви знайдете бакет. Додайте ім’я цього бакету як змінну середовища “S3BUCKET”._
Стадія “checkout code” витягне наш код з нашого репозиторію на Github. Далі ми побудуємо наш Docker образ за допомогою наступної команди.
docker.build("name for docker image")
Це створить Docker образ з нашого Dockerfile, ви можете вказати будь-яке осмислене ім’я в лапках. Для наступної стадії ми надішлемо наш образ в ECR. Для цих команд увійдіть до консолі AWS і знайдіть “Elastic Container Registry” > натисніть на назву вашого репозиторію.
Знайдіть “push commands” (команди для push) у верхній частині.
Скопіюйте команди 1, 3 і 5 та замініть їх у стадії “Push to ECR”.
stage('Push to ECR') {
steps {
script {
withAWS(credentials: 'aws-jenkins', region: "${AWS_DEFAULT_REGION}") {
sh "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin ${Your_repo_link}"
sh "docker tag ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${ECR_REPOSITORY}:${IMAGE_TAG} ${Your_repo_link}:latest"
sh "docker push ${Your_repo_link}:latest"
}
}
}
}
На фінальній стадії ми будемо розгортати наш застосунок на Elastic Beanstalk, архівуючи наш Docker.aws.json у S3 бакет. Elastic Beanstalk витягне цей файл з S3 і оновить версію застосунку та середовище.
Примітка: Elastic Beanstalk використовує S3 бакет, оскільки S3 підтримує версіонування файлів, що допомагає з різними версіями застосунку.
Натискайте Save & Apply (Зберегти та застосувати) і будуйте ваш pipeline (конвеєр). Якщо ваш pipeline успішно пройшов, ви повинні побачити щось подібне.
Якщо ваш pipeline не вдався, ви можете натискати на номер збірки невдалого pipeline з лівої сторони та вибрати “Console Output” для налагодження помилок.
Висновки
Налаштування Jenkins pipeline для розгортання Docker-застосунків на AWS Elastic Beanstalk включає кілька етапів, від налаштування Jenkins для роботи з Docker та AWS до написання скрипту pipeline, який автоматизує процес побудови, push і розгортання. Виконуючи кроки, описані в цій статті, ви зможете спростити ваш CI/CD процес, забезпечуючи ефективне та надійне розгортання ваших застосунків.
Не соромтеся коригувати вміст, щоб краще відповідати вашому досвіду чи специфічним деталям, які ви хочете включити про pipeline Jenkins і стратегії розгортання.
Ресурси
- Посилання на проект Github з усіма файлами тут.
- Документація Docker
- Jenkins
Перекладено з: Setting up a CI/CD pipeline with Jenkins: Deploying a Docker container to Elastic Beanstalk via AWS ECR