Git Actions минимальные настройки для деплоя

GIT

splinter

Deploy на удаленный VPS without Docker

Создаем .github/workflows/filename.yaml

name: Deploy & Test

on:
  push:
    branches: [ "master" ]
  pull_request:
    branches: [ "master" ]

jobs:
  tests:

    runs-on: ubuntu-latest
    strategy:
      max-parallel: 4
      matrix:
        python-version: ['3.10']  #Можно указать версии Python на которых будут выполняться тесты

    steps:
    - uses: actions/checkout@v3
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v3
      with:
        python-version: ${{ matrix.python-version }}
    - name: Install Dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt
    - name: Lint with flake8
      run: |
        pip install flake8
        flake8 .

  deploy:

    runs-on: ubuntu-latest
    needs: tests  # Ожидает выполнение job - tests

    steps:
      - uses: actions/checkout@v3
      - name: Deploy to Server
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USERNAME }}
          key: ${{ secrets.SSH_KEY }}
          # Запускаем скрипт deploy.sh из директории project_name
          script: "cd ~/project_name/ && ./deploy.sh" 

Необходимо добавить secrets в git:

Repository settings > Secrets and variables > Actions > New repository secret

 Создаем фаил скрипта deploy.sh в корневой директории проекта.

#!/bin/bash
# exit if errors
set -e

echo "Deployment started ..."
# Перейти в директорию проекта
cd ~/projectname/

# Активировать виртуальное окружение
source venv/bin/activate
echo "Virtual Env Activated !"

# Обновляем локальный репозиторий из master ветки
git pull origin master
echo "New changes copied to server !"

echo "Installing Dependencies..."
# Установка зависимостей
pip install --upgrade pip
pip install -r requirements.txt --no-input

echo "Serving Static Files..."
# Перейти в /directory & manage.py и запомнить предыдущую директорию
pushd directory_&_manage.py_name
#Собираем статику
python manage.py collectstatic --noinput

echo "Running Database migration"
# Выполняем миграции
python3 manage.py makemigrations
python3 manage.py migrate
echo "Migrations complete"
# Возвращаемся в предыдущую директорию
popd

# Деактивируем виртуальное окружение
deactivate
echo "Virtual Env Deactivated !"

# Перезапускаем gunicorn
systemctl status gunicorn |  sed -n 's/.*Main PID: \(.*\)$/\1/g p' | cut -f1 -d' ' | xargs kill -HUP
echo "Gunicorn restarted"

echo "### Deployment Finished! :rocket:"

Теперь при "push" проект будет обновляться и перезапускаться на удаленном сервере.