Конвеєр CI/CD з використанням GitHub Actions, AWS ECR та GitHub Self-Hosted Runner (Частина I)

Цей блог надає покрокову інструкцію зі створення надійного CI/CD конвеєра для Python додатків з використанням GitHub Actions, AWS Elastic Container Registry (ECR) та самостійно хостованого GitHub Actions runner на EC2 інстансі AWS. Конвеєр автоматизує побудову, тестування та деплой контейнеризованих Python додатків.

pic

Крок 1: Налаштування вашого Python проекту

Переконайтеся, що ваш проект структурований наступним чином:

python-ci-cd/  
├── app.py # Головний файл Python додатку  
├── requirements.txt # Залежності додатку  
├── Dockerfile # Dockerfile для побудови додатку  
├── .github/ # Папка для GitHub workflows  
│ └── workflows/  
│ └── ci-cd.yml # GitHub Actions workflow файл

Приклад файлів

app.py:

from flask import Flask  
app = Flask(__name__)  
@app.route('/')  
def home():  
 return "Hello, CI/CD with GitHub Actions and AWS ECR!"  
if __name__ == "__main__":  
 app.run()

requirements.txt:

blinker==1.9.0  
certifi==2024.12.14  
charset-normalizer==3.4.1  
click==8.1.8  
colorama==0.4.6  
Flask==3.0.0  
gunicorn==23.0.0  
idna==3.10  
itsdangerous==2.2.0  
Jinja2==3.1.5  
MarkupSafe==3.0.2  
packaging==24.2  
requests==2.31.0  
urllib3==2.3.0  
Werkzeug==3.1.3

Dockerfile:

FROM python:3.10-alpine  
WORKDIR /app  
COPY requirements.txt .  
RUN pip install --no-cache-dir -r requirements.txt  
COPY . .  
EXPOSE 5000  
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]

Крок 2: Запуск EC2 інстансу AWS

  1. Запустіть EC2 інстанс:
  • Виберіть Ubuntu образ.
  • Відкрийте наступні порти в правилах вхідного доступу до безпеки:
  • 22 (SSH доступ)
  • 80 (HTTP)
  • 443 (HTTPS)
  • 8000 (доступ до додатку).
  1. SSH доступ до інстансу:
ssh -i "your-key.pem" ubuntu@
  1. Встановіть залежності:
sudo apt update   
sudo apt install -y docker.io curl   
sudo systemctl start docker   
sudo systemctl enable docker

Крок 3: Налаштування GitHub Actions Runner на EC2

3.1 Додавання самостійно хостованого runner

  1. Перейдіть до вашого GitHub репозиторію.
  2. Перейдіть до:
  • Settings > Actions > Runners > New Self-Hosted Runner.
  1. Виберіть наступні налаштування:
  • Runner Image: Linux (оскільки EC2 інстанс працює на Ubuntu).
  • Architecture: x64 (компатибельно з більшістю інстансів).
  1. Натисніть Generate Command Instructions, і вам нададуть кроки для завантаження та налаштування runner.

Завантаження

# Створіть папку  
 $ mkdir actions-runner && cd actions-runner  


 # Завантажте останній пакет для runner  
 $ curl -o actions-runner-linux-x64-2.321.0.tar.gz -L https://github.com/actions/runner/releases/download/v2.321.0/actions-runner-linux-x64-2.321.0.tar.gz  


 # За бажанням: перевірте хеш  
 $ echo "ba46ba7ce3a4d7236b1ftre44419fb453bc08f866b24f04d549ec89f1722a26y actions-runner-linux-x64-2.321.0.tar.gz" | shasum -a 256 -c  

 # Розпакуйте інсталятор  
 $ tar xzf ./actions-runner-linux-x64-2.321.0.tar.gz

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

#configure   
./config.sh --url / --token  #останній крок - запустіть ./run.sh

(Опціонально) Для запуску самостійно хостованого runner як сервісу, виконайте:

sudo ./svc.sh install sudo ./svc.sh start

Крок 4: Створення GitHub Secrets

Додайте наступні секрети у ваш GitHub репозиторій через Settings > Secrets and variables > Actions:

  1. AWSACCESSKEY_ID: Ваш AWS ключ доступу.
  2. AWSSECRETACCESS_KEY: Ваш AWS секретний ключ доступу.
  3. AWS_REGION: AWS регіон, де розташований ваш ECR (наприклад, us-east-1).
  4. AWSECRREGISTRY: URI вашого ECR реєстру (наприклад, 123456789012.dkr.ecr.us-east-1.amazonaws.com).
    5.
    AWSECRREPOSITORY: Назва вашого ECR репозиторію (наприклад, python-ci-cd).

Крок 5: Створення GitHub Actions Workflow

Створіть файл CI/CD workflow у .github/workflows/ci-cd.yml:

name: Production CI/CD Pipeline  

on:  
 push:  
 branches: main  
 workflow_dispatch:  

jobs:  
 build:  
 name: Побудова Docker образу та пуш в AWS ECR  
 runs-on: ubuntu-latest  
 env:  
 IMAGE_TAG: latest  
 steps:  
 - name: Checkout коду  
 uses: actions/checkout@v4  

 - name: Налаштування AWS облікових даних  
 uses: aws-actions/configure-aws-credentials@v2  
 with:  
 aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}  
 aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}  
 aws-region: ${{ secrets.AWS_REGION }}  

 - name: Логін в Amazon ECR  
 uses: aws-actions/amazon-ecr-login@v2  

 - name: Побудова та пуш Docker образу  
 run: |  
 IMAGE_URI=${{ secrets.AWS_ECR_REGISTRY }}/${{ secrets.AWS_ECR_REPOSITORY }}:${{ env.IMAGE_TAG }}  
 docker build -t $IMAGE_URI .  
 docker push $IMAGE_URI  
 echo "image_uri=$IMAGE_URI" >> $GITHUB_OUTPUT  

 deploy:  
 name: Деплой на EC2  
 needs: build  
 runs-on: self-hosted  
 env:  
 IMAGE_TAG: latest  
 steps:  
 - name: Зупинка та видалення старих контейнерів  
 run: docker rm -f $(docker ps -aq) || echo "Немає контейнерів для видалення"  

 - name: Завантаження Docker образу  
 run: |  
 IMAGE_URI=${{ secrets.AWS_ECR_REGISTRY }}/${{ secrets.AWS_ECR_REPOSITORY }}:${{ env.IMAGE_TAG }}  
 docker pull $IMAGE_URI  

 - name: Запуск Docker контейнера  
 run: |  
 IMAGE_URI=${{ secrets.AWS_ECR_REGISTRY }}/${{ secrets.AWS_ECR_REPOSITORY }}:${{ env.IMAGE_TAG }}  
 docker run -d -p 5000:5000 $IMAGE_URI

Крок 6: Запуск CI/CD Pipeline

  1. Відправте ваш код в гілку main:
git add .  
git commit -m "Add CI/CD workflow"  
git push origin main
  1. Перейдіть до вкладки Actions у вашому GitHub репозиторії, щоб побачити хід виконання workflow.

Крок 7: Доступ до додатку

Після завершення завдання деплоя, отримайте доступ до додатку за адресою:

http://:5000

Як це працює

  1. Завдання Build:
  • Виконується на GitHub-hosted runner (ubuntu-latest).
  • Будує Docker образ, використовуючи Dockerfile.
  • Пушить Docker образ в AWS ECR.

2. Завдання Deploy:

  • Виконується на самостійно хостованому runner (ваш EC2 інстанс).
  • Завантажує останній Docker образ з AWS ECR.
  • Деплой додатку шляхом запуску Docker контейнера.

Висновок

Ця конфігурація автоматизує процес побудови, тестування та деплою Python додатків з використанням GitHub Actions та AWS ECR. Самостійно хостований runner на AWS EC2 надає більший контроль над середовищем деплою та зменшує залежність від зовнішньої інфраструктури.

Цю конфігурацію можна розширити, додаючи:

  • Інструменти для linting (перевірки коду), такі як flake8.
  • Додавання сповіщень (наприклад, Slack або email) про статус виконання workflow.
  • Використання AWS ECS для складнішої оркестрації.
  1. Натисніть Generate Command Instructions, і вам будуть надані кроки для завантаження та налаштування runner.

Перекладено з: CI/CD Pipeline Using GitHub Actions, AWS ECR, and GitHub Self-Hosted Runner(Part I)

Leave a Reply

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