CI/CD — Docker-Compose, Elastic Beanstalk і Github Actions

pic

AWS

Метою цього посту є налаштування CI/CD pipeline за допомогою Github Actions, щоб кожен коміт у гілці master запускав набір дій, які виконуються з нашим кодом і розгортаються на Elastic Beanstalk, якщо всі дії пройшли успішно. Кодова база буде наведена нижче. Спочатку зверніть увагу, що Docker-compose був детально пояснений у моєму попередньому пості. Крім того, концепції Elastic Beanstalk і eb cli також були описані в попередньому пості.

[

Розуміння Docker-Compose

Якщо коли-небудь виникне необхідність запускати кілька контейнерів для підтримки програми, docker-compose зазвичай дозволяє це зробити...

kirtfieldk.medium.com

](/understanding-docker-compose-71663472ecc4?source=post_page-----9d5572975269--------------------------------)

[

Керівництво: Розгортання контейнера на AWS Elastic Beanstalk

Я б сказав, що успішне розгортання Docker контейнера на Elastic Beanstalk - це перший крок до чудового...

kirtfieldk.medium.com

](/guid-deploying-container-on-aws-elastic-beanstalk-f586f02c5de5?source=post_page-----9d5572975269--------------------------------)

[

kirtfieldk/BC_API

В рамках цього API користувач зможе додавати, видаляти, оновлювати та отримувати заявки стажистів, які подали заявки...

github.com

](https://github.com/kirtfieldk/BCAPI?source=postpage-----9d5572975269--------------------------------)

Налаштування Github Actions

Github Actions дозволяють виконувати дії та команди щоразу, коли певна подія відбувається з нашим кодом у віртуальному середовищі. Github Actions налаштовується у .yml файлі в директорії /.github/workflows/.

Перейдіть до особистого репозиторію Github і натисніть Action. Github пропонує кілька шаблонів для початку workflow, це буде корисно, якщо нам потрібно використовувати команди для конкретної мови (npm) для запуску таких подій, як тестування або збірки. Однак у цьому випадку нам потрібно лише взаємодіяти з Docker і AWS.

pic

Щоб створити власний flow, натисніть set up a workflow yourself і скористайтеся рядком пошуку, щоб знайти корисні дії. Дії в Marketplace є відкритим програмним забезпеченням і значно знижують складність. Усі workflow матимуть структуру: ім'я, подія та робота.

#NAME  
name: Push images to Dockerhub and deploy on ELastic Beanstalk  
#EVENT  
on:  
 push:  
 branches:  
 - master  
#JOBS  
jobs:  
 build_docker_images:  
 name: build docker images  
 runs-on: [ubuntu-latest]  
 steps:  
 - name: checkout  
 uses: actions/checkout@v2  
 ...

Розділ події ініціюється за допомогою on і може бути налаштований для запуску при різних подіях Github. Зокрема, цей workflow буде запускатися щоразу, коли буде виконано пуш до гілки master. Потім розділ з робочими процесами позначається терміном jobs, де кожен job має ім'я, як наприклад build_docker_images. Кожен job має свою операційну систему. Крім того, кожен job має набір steps з властивістю імені. Ми використовуємо термін uses, щоб підключати допомогу відкритих джерел, таких як клонування репозиторію в крок або вхід у docker.

Для того, щоб Elastic Beanstalk успішно розгорнув контент git-коміту, перший крок — це налаштувати наш Github Action для побудови та пушу нових образів у DockerHub. Це означає, що нам потрібно увійти до Dockerhub у віртуальному середовищі Github. Ми можемо використовувати ще одну дію спільноти, docker/[email protected], для входу в наш Docker акаунт. {{secrets.DOCKERHUB_USERNAME}} витягує дані з зашифрованих секретів у нашому профілі Github — фактично це змінні середовища.

- name: Docker Login  
 uses: docker/[email protected]  
 with:  
 username: ${{secrets.DOCKERHUB_USERNAME}}  
 password: ${{secrets.DOCKERHUB_TOKEN}}  
 logout: true

Тепер, коли ми отримали доступ до нашого акаунту Dockerhub, все, що залишається — це побудувати і надіслати наші образи в їх репозиторії.
Коли ви відправляєте образи до Dockerhub, наступні команди побудують, тегуватимуть і надішлють образ, створений з файлу Dockerfile в директорії.

docker build -t keithkfield/blog-server .   
docker tag keithkfield/blog-server keithkfield/blog-server:latest  
docker push keithkfield/blog-server:latest

Ці три команди повинні бути єдиними, які вам знадобляться для того, щоб відправити образи, побудовані з нашого вихідного коду, на Dockerhub.

- name: Build Server image  
 run: docker build -t keithkfield/blog-server -f  
 ./Server/Dockerfile ./Server  
- name: Tag our Image  
 run: docker tag keithkfield/blog-server   
 keithkfield/blog-server:latest  
- name: Push to dockerhub  
 run: docker push keithkfield/blog-server

Тепер просто повторіть ці три кроки для контейнерів client та nginx.

Використання AWS

Після того, як ми налаштуємо безперервне розгортання наших образів, нам знадобиться доступ до нашого облікового запису в Amazon Web Services. Знову ж, ми можемо використати ще одну дію з відкритим вихідним кодом — einaregilsson/beanstalk-seploy@v14.

- name: Deploy to EB  
 uses: einaregilsson/beanstalk-deploy@v14  
 with:  
 aws_access_key: ${{ secrets.AWS_ACCESS_KEY }}  
 aws_secret_key: ${{ secrets.AWS_ACCESS_SECRET_KEY }}  
 application_name: medium-compose-series  
 environment_name: Mediumblogseries-dev  
 version_label: "app-cbe0-210131_121135"  
 region: us-east-1

Ми витягуємо aws_access_key і aws_secret_key з наших зашифрованих секретів. application_name, environment_name і version_label будуть зібрані під час процесу створення програми в Elastic Beanstalk.

Створення програми Elastic Beanstalk

Для того, щоб цей процес працював, ми повинні заздалегідь створити ім’я програми та ім’я середовища. Для початку скористайтеся командою

eb init -r  

щоб розпочати процес створення програми.

pic

Процес створення програми

Єдине налаштування, яке потрібно змінити, це питання про платформу. Замість за замовчуванням 1, ця програма є Multi-container Docker, тому виберіть 2.

Select a platform branch.  
1) Docker running on 64bit Amazon Linux 2  
2) Multi-container Docker running on 64bit Amazon Linux  
3) Docker running on 64bit Amazon Linux

Після виконання цієї команди init буде створено директорію .elasticbeanstalk з файлом config.yml. У AWS файл Dockerrun.aws.json визначає, як мають працювати кілька контейнерів в межах програми.

pic

Файл Dockerrun.aws.json

Файл Dockerrun.aws.json нагадує файл Docker-compose. Його формат — .json, і він перелічує всі контейнери в ключі containerDefinitions. Головна ідея полягає в тому, що лише образ keithkfield/blog-nginx має відображення портів, і він зв’язує образи client і server.

Тепер, коли файл конфігурації Dockerrun готовий, ми можемо скористатися командою

eb create 

щоб створити змінну середовища. Виконуючи цю команду, система шукає інструкції в Dockerrun.aws.json. Спочатку вона зазначає, що AWSEBDockerrunVersion встановлено на 3, що означає, що це багатоконтейнерна програма. Elastic Beanstalk витягує всі три образи з Dockerhub і з’єднує їх через конфігурацію навантажувача балансування nginx. Цей процес займає деякий час, але він створює базову програму, з якої можна працювати.

Збірка разом

Тепер, коли ми визначили ім’я програми та ім’я середовища, ми можемо вставити їх у останній крок нашого робочого процесу. Залишається лише отримати мітку версії. Для цього виконайте команду

eb appversion

щоб отримати список допустимих версій для використання.

Моя фінальна команда в робочому процесі виглядає ось так:

pic

Активація потоку

Щоб активувати цей потік, просто відправте ці зміни в гілку master. Це ініціює дію з назвою коміту в вкладці actions.
Через кілька хвилин ми можемо перевірити консоль Elastic Beanstalk, щоб отримати згенероване посилання і відвідати сайт.

pic

Початковий пуш

З успіхом наша програма працює! Тепер будь-які зміни в UI і їх пуш призведуть до розгортання тієї ж програми.

pic

Успіх!!

Зазначте, що це довгий процес, і зазвичай займає кілька годин, щоб все налаштувати правильно.

pic

Мені знадобилося 30 потоків, щоб налаштувати мою CI/CD pipeline і отримати її ідеальну роботу.

Перекладено з: CI/CD — Docker-Compose, Elastic Beanstalk, and Github Actions

Leave a Reply

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