Цей блог надає покрокову інструкцію зі створення надійного CI/CD конвеєра для Python додатків з використанням GitHub Actions, AWS Elastic Container Registry (ECR) та самостійно хостованого GitHub Actions runner на EC2 інстансі AWS. Конвеєр автоматизує побудову, тестування та деплой контейнеризованих Python додатків.
Крок 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
- Запустіть EC2 інстанс:
- Виберіть Ubuntu образ.
- Відкрийте наступні порти в правилах вхідного доступу до безпеки:
- 22 (SSH доступ)
- 80 (HTTP)
- 443 (HTTPS)
- 8000 (доступ до додатку).
- SSH доступ до інстансу:
ssh -i "your-key.pem" ubuntu@
- Встановіть залежності:
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
- Перейдіть до вашого GitHub репозиторію.
- Перейдіть до:
- Settings > Actions > Runners > New Self-Hosted Runner.
- Виберіть наступні налаштування:
- Runner Image:
Linux
(оскільки EC2 інстанс працює на Ubuntu). - Architecture:
x64
(компатибельно з більшістю інстансів).
- Натисніть 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:
- AWSACCESSKEY_ID: Ваш AWS ключ доступу.
- AWSSECRETACCESS_KEY: Ваш AWS секретний ключ доступу.
- AWS_REGION: AWS регіон, де розташований ваш ECR (наприклад,
us-east-1
). - 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
- Відправте ваш код в гілку
main
:
git add .
git commit -m "Add CI/CD workflow"
git push origin main
- Перейдіть до вкладки Actions у вашому GitHub репозиторії, щоб побачити хід виконання workflow.
Крок 7: Доступ до додатку
Після завершення завдання деплоя, отримайте доступ до додатку за адресою:
http://:5000
Як це працює
- Завдання 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 для складнішої оркестрації.
- Натисніть Generate Command Instructions, і вам будуть надані кроки для завантаження та налаштування runner.
Перекладено з: CI/CD Pipeline Using GitHub Actions, AWS ECR, and GitHub Self-Hosted Runner(Part I)