Git Actions минимальные настройки для деплоя
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" проект будет обновляться и перезапускаться на удаленном сервере.