added CI/CD pipeline from backend

This commit is contained in:
IcyAltair 2025-12-26 17:46:00 +03:00
parent d4c622295c
commit e40dea6b01

276
.github/workflows/deploy.yml vendored Normal file
View file

@ -0,0 +1,276 @@
# Отслеживаемые действия
on:
push:
branches:
- develop
# - main
# Создадим глобальный .env
env:
REPO_NAME_WITH_OWNER: ${{ gitea.repository }}
BRANCH: ${{ github.ref_name }}
jobs:
info:
runs-on: docker
outputs:
REPO_NAME: ${{ steps.set-repo-name.outputs.REPO_NAME }}
steps:
- name: Job info
run: |
echo "Starting a pipeline triggered by a ${{ github.event_name }} event"
echo "This job is now running on a ${{ runner.os }} server hosted by Gitea!"
echo "The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}."
echo "${{ github.workflow }}"
- name: Get repository name
id: set-repo-name
run: |
# Записываем имя репозитория
echo "${{ gitea.repository }}" | cut -d "/" -f 2 > repo.txt
echo "REPO_NAME=$(cat repo.txt)" >> $GITHUB_OUTPUT
rm -rf repo.txt
ci:
needs: [info]
runs-on: docker
env:
REPO_NAME: ${{ needs.info.outputs.REPO_NAME }}
steps:
- name: Update project via SSH on remote server
uses: https://github.com/appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SERVER_DOMAIN }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
port: ${{ secrets.SERVER_PORT }}
script: |
# Переходим в директорию с проектами
mkdir -p ${{ secrets.PROJECT_PATH }}
cd ${{ secrets.PROJECT_PATH }}
# Создаем общую директорию для репозитория
mkdir -p ${{ env.REPO_NAME }}
cd ${{ env.REPO_NAME }}
# Создаем директорию для ветки
mkdir -p ${{ env.BRANCH }}
cd ${{ env.BRANCH }}
# Клонируем репозиторий, если необходимо, иначе добавляем последние изменения
if [ -z "$(ls -A)" ]; then
echo "Repository ${{ env.REPO_NAME }} not found. Cloning from GitHub..."
GIT_SSH_COMMAND="ssh -i ~/.ssh/deploy_key_rostelecom_back" git clone --branch ${{ env.BRANCH }} ssh://git@api.statanly.com:2222/${{ env.REPO_NAME_WITH_OWNER }}.git .
else
GIT_SSH_COMMAND="ssh -i ~/.ssh/deploy_key_rostelecom_back" git pull --ff-only
fi
# Добавим права доступа
chmod -R u+rwx ./logging_service
chmod u+rwx ./data/add_default_data.sh
autotests:
needs: [info, ci]
runs-on: docker
env:
REPO_NAME: ${{ needs.info.outputs.REPO_NAME }}
steps:
- name: Run autotests via SSH on remote server
uses: https://github.com/appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SERVER_DOMAIN }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
port: ${{ secrets.SERVER_PORT }}
command_timeout: 3h
script: |
# Переходим в директорию сервиса
cd ${{ secrets.PROJECT_PATH }}/${{ env.REPO_NAME }}/${{ env.BRANCH }}
# Запустим автотесты
#docker compose \
#--env-file ./src_backend/.env \
#--env-file ./src_backend/.env.test \
#-f docker-compose-test.yaml \
#up --build --abort-on-container-exit --exit-code-from api
sleep 1
delete_test_service:
needs: [info, autotests]
if: ${{needs.autotests.result == 'success' || failure() && needs.autotests.result == 'failure'}}
runs-on: docker
env:
REPO_NAME: ${{ needs.info.outputs.REPO_NAME }}
steps:
- name: Delete test service
uses: https://github.com/appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SERVER_DOMAIN }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
port: ${{ secrets.SERVER_PORT }}
script: |
# Переходим в директорию сервиса
cd ${{ secrets.PROJECT_PATH }}/${{ env.REPO_NAME }}/${{ env.BRANCH }}
# После проверок удалим тестовую версию сервиса
docker compose \
--env-file ./src_backend/.env \
--env-file ./src_backend/.env.test \
-f docker-compose-test.yaml \
down
undo-changes:
needs: [info, autotests]
if: ${{ failure() && needs.autotests.result == 'failure' }}
runs-on: docker
env:
REPO_NAME: ${{ needs.info.outputs.REPO_NAME }}
steps:
- name: Remove last commit
uses: https://github.com/appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SERVER_DOMAIN }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
port: ${{ secrets.SERVER_PORT }}
script: |
# Переходим в директорию сервиса
cd ${{ secrets.PROJECT_PATH }}/${{ env.REPO_NAME }}/${{ env.BRANCH }}
# Удаляем изменения последнего коммита
git reset --hard HEAD~1
cd:
needs: [info, autotests]
runs-on: docker
env:
REPO_NAME: ${{ needs.info.outputs.REPO_NAME }}
steps:
- name: Deploy verified code
uses: https://github.com/appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SERVER_DOMAIN }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
port: ${{ secrets.SERVER_PORT }}
command_timeout: 3h
script: |
# Переходим в директорию сервиса
cd ${{ secrets.PROJECT_PATH }}/${{ env.REPO_NAME }}/${{ env.BRANCH }}
# Поднимаем новый контейнер нужной версии
if [ ${{ env.BRANCH }} = "main" ]; then
docker compose \
--env-file ./src_backend/.env \
--env-file ./src_backend/.env.prod \
--env-file ./src_backend/.env.compose_vars \
down
docker compose \
--env-file ./src_backend/.env \
--env-file ./src_backend/.env.prod \
--env-file ./src_backend/.env.compose_vars \
up --build -d
sleep 15
# Добавляем базовые данные, если необходимо
data/add_default_data.sh \
--env_files src_backend/.env src_backend/.env.prod src_backend/.env.compose_vars \
--weights_archieve_name weights.tar.gz \
--default_data_dir ../default_data
else
docker compose \
--env-file ./src_backend/.env \
--env-file ./src_backend/.env.dev \
--env-file ./src_backend/.env.compose_vars \
down
docker compose \
--env-file ./src_backend/.env \
--env-file ./src_backend/.env.dev \
--env-file ./src_backend/.env.compose_vars \
up --build -d
sleep 15
# Добавляем базовые данные, если необходимо
data/add_default_data.sh \
--env_files src_backend/.env src_backend/.env.dev src_backend/.env.compose_vars \
--weights_archieve_name weights.tar.gz \
--default_data_dir ../default_data
fi
cd_astra:
needs: [info, cd]
if: github.ref_name == 'develop'
runs-on: docker
env:
REPO_NAME: ${{ needs.info.outputs.REPO_NAME }}
steps:
- name: Deploy verified code
uses: https://github.com/appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SERVER_DOMAIN }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_ASTRA_PRIVATE_KEY }}
port: ${{ secrets.ASTRA_SERVER_PORT }}
command_timeout: 3h
script: |
# Переходим в директорию с проектами
mkdir -p ${{ secrets.ASTRA_PROJECT_PATH }}
cd ${{ secrets.ASTRA_PROJECT_PATH }}
# Создаем общую директорию для репозитория
mkdir -p ${{ env.REPO_NAME }}
cd ${{ env.REPO_NAME }}
# Создаем директорию для ветки
mkdir -p ${{ env.BRANCH }}
cd ${{ env.BRANCH }}
# Клонируем репозиторий, если необходимо, иначе добавляем последние изменения
if [ -z "$(ls -A)" ]; then
echo "Repository ${{ env.REPO_NAME }} not found. Cloning from GitHub..."
GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa" git clone --branch ${{ env.BRANCH }} ssh://git@api.statanly.com:2222/${{ env.REPO_NAME_WITH_OWNER }}.git .
else
GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa" git pull --ff-only
fi
# Поднимаем нужную dev версию сервиса
docker compose \
--env-file ./src_backend/.env \
--env-file ./src_backend/.env.astra \
--env-file ./src_backend/.env.compose_vars \
down
docker compose \
--env-file ./src_backend/.env \
--env-file ./src_backend/.env.astra \
--env-file ./src_backend/.env.compose_vars \
up --build -d
push-to-gitverse:
needs: [cd]
runs-on: docker
container:
image: node:20-bullseye
env:
GITVERSE_TOKEN: ${{ secrets.GITVERSE_TOKEN }}
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Print last 5 commits
run: git log -n 5 --oneline
- name: Push to Gitverse
run: |
git remote add gitverse https://${{ env.GITVERSE_TOKEN }}@gitverse.ru/${{ env.REPO_NAME_WITH_OWNER }}.git
git push gitverse ${{ env.BRANCH }}