Skip to content

build_and_push_telegram #14

build_and_push_telegram

build_and_push_telegram #14

Workflow file for this run

name: Main Taski workflow
on:
push:
branches:
- main
jobs:
tests:
runs-on: ubuntu-latest
# Блок services аналогичен docker-compose.yml
services:
postgres:
image: postgres:13.10
# Указываем имя тестовой базы, имя и пароль пользователя в открытом виде,
# ведь эта база будет работать только во время прогона тестов
env:
POSTGRES_USER: django_user
POSTGRES_PASSWORD: django_password
POSTGRES_DB: django_db
ports:
- 5432:5432
# Эта конструкция описывает проверку готовности сервиса postgres
# Если её не будет, то тесты могут запуститься раньше, чем сервер PostgreSQL
# В результате тесты опять решат, что базы нет, — и упадут
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: 3.9
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install flake8==6.0.0 flake8-isort==6.0.0
pip install -r ./backend/requirements.txt
# Этот шаг дополним переменными для доступа к БД
- name: Test with flake8 and django tests
# Добавляем env-переменные для доступа к БД
env:
POSTGRES_USER: django_user
POSTGRES_PASSWORD: django_password
POSTGRES_DB: django_db
# Сервер БД запущен в Docker, но его порт проброшен на хост
# Поэтому подключаемся к 127.0.0.1:5432
DB_HOST: 127.0.0.1
DB_PORT: 5432
run: |
python -m flake8 backend/
cd backend/
python manage.py test
build_and_push_to_docker_hub:
name: Push Docker image to DockerHub
runs-on: ubuntu-latest
needs: tests
steps:
- name: Check out the repo
# Получение исходного кода из репозитория
uses: actions/checkout@v3
- name: Set up Docker Buildx
# Установка сборщика контейнеров Docker
uses: docker/setup-buildx-action@v2
- name: Login to Docker
# Авторизация на Docker Hub
uses: docker/login-action@v2
# При помощи with передаём в action параметры username и password
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
# Хорошо ли держать логин и пароль прямо в коде workflow?
# Нет, это нехорошо
- name: Push to DockerHub
# Одновременный билд и пуш образа в Docker Hub
uses: docker/build-push-action@v4
with:
# Параметр context: ./backend/ указывает, что нужный Dockerfile
# находится в ./backend/
context: ./backend/
# Параметр push: true указывает, что образ нужно не только собрать,
# но и отправить на Docker Hub
push: true
# В параметре tags задаётся название и тег для образа.
# Для каждого пересобранного образа
# устанавливаем тег latest, чтобы потом
# на сервере и в docker-compose.yml не указывать версию
tags: back4up/taski_backend:latest
frontend_tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up nodeJS
# Это готовый воркфлоу для установки Node.js на раннер
uses: actions/setup-node@v3
with:
# Это параметр воркфлоу, указывающий нужную версию Node.js
node-version: 18
- name: Install dependencies
# Эта команда устанавливает зависимости для фронтенда
run: |
cd frontend/
npm ci
- name: Test frontend
# Запускаем тесты
run: |
cd frontend/
npm run test
build_frontend_and_push_to_docker_hub:
name: Push frontend Docker image to DockerHub
runs-on: ubuntu-latest
needs: frontend_tests
steps:
- name: Check out the repo
uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to Docker
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Push to DockerHub
uses: docker/build-push-action@v4
with:
context: ./frontend/
push: true
tags: back4up/taski_frontend:latest
build_gateway_and_push_to_docker_hub:
name: Push gateway Docker image to DockerHub
runs-on: ubuntu-latest
steps:
- name: Check out the repo
uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to Docker
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Push to DockerHub
uses: docker/build-push-action@v4
with:
context: ./gateway/
push: true
# Тут вместо username должен быть ваш логин на Docker Hub
tags: back4up/taski_gateway:latest
deploy:
runs-on: ubuntu-latest
needs:
# Дождёмся билда всех образов Taski
- build_and_push_to_docker_hub
- build_frontend_and_push_to_docker_hub
- build_gateway_and_push_to_docker_hub
steps:
- name: Checkout repo
uses: actions/checkout@v3
# Копируем docker-compose.production.yml на продакшен-сервер
- name: Copy docker-compose.yml via ssh
uses: appleboy/scp-action@master
# Передаём параметры для action appleboy/scp-action:
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USER }}
key: ${{ secrets.SSH_KEY }}
passphrase: ${{ secrets.SSH_PASSPHRASE }}
source: "docker-compose.production.yml"
target: "taski"
- name: Executing remote ssh commands to deploy
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USER }}
key: ${{ secrets.SSH_KEY }}
passphrase: ${{ secrets.SSH_PASSPHRASE }}
# Параметр script передаёт в action appleboy/ssh-action команды,
# которые нужно выполнить на сервере,
# с которым установлено соединение
script: |
cd taski
# Выполняет pull образов с Docker Hub
sudo docker compose -f docker-compose.production.yml pull
# Перезапускает все контейнеры в Docker Compose
sudo docker compose -f docker-compose.production.yml down
sudo docker compose -f docker-compose.production.yml up -d
# Выполняет миграции и сбор статики
sudo docker compose -f docker-compose.production.yml exec backend python manage.py migrate
sudo docker compose -f docker-compose.production.yml exec backend python manage.py collectstatic
sudo docker compose -f docker-compose.production.yml exec backend cp -r /app/collected_static/. /backend_static/static/
send_message:
runs-on: ubuntu-latest
needs: deploy
steps:
- name: Send message
uses: appleboy/telegram-action@master
with:
to: ${{ secrets.TELEGRAM_TO }}
token: ${{ secrets.TELEGRAM_TOKEN }}
message: Деплой успешно выполнен!