added CI/CD pipeline from backend
This commit is contained in:
parent
d4c622295c
commit
e40dea6b01
1 changed files with 276 additions and 0 deletions
276
.github/workflows/deploy.yml
vendored
Normal file
276
.github/workflows/deploy.yml
vendored
Normal 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 }}
|
||||||
Loading…
Reference in a new issue