diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..2fea67b --- /dev/null +++ b/.github/workflows/deploy.yml @@ -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 }} \ No newline at end of file