1 Commits
Author SHA1 Message Date
austnv 6d543361c4 fix: add step "Set repository name to lowercase"
Build and Deploy Backend / build-and-deploy (push) Failing after 32s
2026-06-26 13:10:32 +03:00
2 changed files with 21 additions and 28 deletions
+20 -27
View File
@@ -11,17 +11,14 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
# 1. Клонируем код
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
fetch-depth: 0 # Важно для получения всех тегов fetch-depth: 0
# 2. Настраиваем Docker Buildx
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3 uses: docker/setup-buildx-action@v3
# 3. Логинимся в Container Registry Gitea
- name: Login to Gitea Container Registry - name: Login to Gitea Container Registry
uses: docker/login-action@v3 uses: docker/login-action@v3
with: with:
@@ -29,15 +26,26 @@ jobs:
username: ${{ gitea.repository_owner }} username: ${{ gitea.repository_owner }}
password: ${{ secrets.ACCESS_TOKEN }} password: ${{ secrets.ACCESS_TOKEN }}
# 4. Собираем и пушим Docker образ - name: Set repository name to lowercase
id: repo
run: |
OWNER=$(echo "${{ gitea.repository_owner }}" | tr '[:upper:]' '[:lower:]')
REPO=$(echo "${{ github.event.repository.name }}" | tr '[:upper:]' '[:lower:]')
echo "owner=$OWNER" >> $GITHUB_OUTPUT
echo "repo=$REPO" >> $GITHUB_OUTPUT
echo "full_repo=$OWNER/$REPO" >> $GITHUB_OUTPUT
# Также сохраняем полный путь к образу
echo "image=git.uvpn.shop/$OWNER/$REPO" >> $GITHUB_OUTPUT
- name: Build and push Docker image - name: Build and push Docker image
uses: docker/build-push-action@v5 uses: docker/build-push-action@v5
with: with:
context: . context: .
push: true push: true
tags: | tags: |
git.uvpn.shop/${{ gitea.repository }}:latest ${{ steps.repo.outputs.image }}:latest
git.uvpn.shop/${{ gitea.repository }}:${{ gitea.ref_name }} ${{ steps.repo.outputs.image }}:${{ gitea.ref_name }}
cache-from: type=gha cache-from: type=gha
cache-to: type=gha,mode=max cache-to: type=gha,mode=max
build-args: | build-args: |
@@ -45,28 +53,22 @@ jobs:
BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ') BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')
VCS_REF=${{ github.sha }} VCS_REF=${{ github.sha }}
# 5. Создаем Gitea Release через API
- name: Create Gitea Release via API - name: Create Gitea Release via API
run: | run: |
# Получаем описание из тега (если есть)
TAG_MESSAGE=$(git tag -l --format='%(contents)' "${{ gitea.ref_name }}" 2>/dev/null || echo "Автоматический релиз через CI/CD") TAG_MESSAGE=$(git tag -l --format='%(contents)' "${{ gitea.ref_name }}" 2>/dev/null || echo "Автоматический релиз через CI/CD")
# Экранируем кавычки и переносы для JSON
TAG_MESSAGE_ESCAPED=$(echo "$TAG_MESSAGE" | sed 's/"/\\"/g' | awk '{printf "%s\\n", $0}') TAG_MESSAGE_ESCAPED=$(echo "$TAG_MESSAGE" | sed 's/"/\\"/g' | awk '{printf "%s\\n", $0}')
# Формируем JSON
JSON_PAYLOAD=$(cat <<EOF JSON_PAYLOAD=$(cat <<EOF
{ {
"tag_name": "${{ gitea.ref_name }}", "tag_name": "${{ gitea.ref_name }}",
"name": "Release ${{ gitea.ref_name }}", "name": "Release ${{ gitea.ref_name }}",
"body": "## Релиз ${{ gitea.ref_name }}\n\n📝 ${TAG_MESSAGE_ESCAPED}\n\n---\n\n**🏷️ Тег:** \`${{ gitea.ref_name }}\`\n**👤 Автор:** @${{ gitea.actor }}\n**📦 Образ:** \`git.uvpn.shop/${{ gitea.repository }}:${{ gitea.ref_name }}\`\n\n✅ Автоматически собрано и развёрнуто", "body": "## Релиз ${{ gitea.ref_name }}\n\n📝 ${TAG_MESSAGE_ESCAPED}\n\n---\n\n**🏷️ Тег:** \`${{ gitea.ref_name }}\`\n**👤 Автор:** @${{ gitea.actor }}\n**📦 Образ:** \`${{ steps.repo.outputs.image }}:${{ gitea.ref_name }}\`\n\n✅ Автоматически собрано и развёрнуто",
"draft": false, "draft": false,
"prerelease": false "prerelease": false
} }
EOF EOF
) )
# Отправляем запрос
RESPONSE=$(curl -s -w "\n%{http_code}" \ RESPONSE=$(curl -s -w "\n%{http_code}" \
-X POST \ -X POST \
-H "Authorization: token ${{ secrets.ACCESS_TOKEN }}" \ -H "Authorization: token ${{ secrets.ACCESS_TOKEN }}" \
@@ -74,7 +76,6 @@ jobs:
-d "$JSON_PAYLOAD" \ -d "$JSON_PAYLOAD" \
"https://git.uvpn.shop/api/v1/repos/${{ gitea.repository }}/releases") "https://git.uvpn.shop/api/v1/repos/${{ gitea.repository }}/releases")
# Проверяем ответ
HTTP_CODE=$(echo "$RESPONSE" | tail -n1) HTTP_CODE=$(echo "$RESPONSE" | tail -n1)
BODY=$(echo "$RESPONSE" | sed '$d') BODY=$(echo "$RESPONSE" | sed '$d')
@@ -89,32 +90,24 @@ jobs:
exit 1 exit 1
fi fi
# 6. Устанавливаем SSH-ключ для деплоя
- name: Install SSH key - name: Install SSH key
uses: webfactory/ssh-agent@v0.9.0 uses: webfactory/ssh-agent@v0.9.0
with: with:
ssh-private-key: ${{ secrets.DEPLOY_SSH_KEY }} ssh-private-key: ${{ secrets.DEPLOY_SSH_KEY }}
# 7. Деплой на сервер
- name: Deploy on server - name: Deploy on server
run: | run: |
ssh -o StrictHostKeyChecking=no ${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }} << 'EOF' ssh -o StrictHostKeyChecking=no ${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }} << 'EOF'
# Переходим в папку с проектом (где лежит docker-compose.yml)
cd /opt/uvpn.shop/backend cd /opt/uvpn.shop/backend
# Логинимся в реестр Gitea (чтобы docker pull мог скачать образ)
echo "${{ secrets.ACCESS_TOKEN }}" | docker login git.uvpn.shop -u ${{ gitea.repository_owner }} --password-stdin echo "${{ secrets.ACCESS_TOKEN }}" | docker login git.uvpn.shop -u ${{ gitea.repository_owner }} --password-stdin
# Скачиваем свежий образ с тегом latest или конкретным тегом # Используем образ с правильным именем в нижнем регистре
export IMAGE_NAME="git.uvpn.shop/uvpn/backend"
docker compose pull docker compose pull
docker compose down || true
# Перезапускаем контейнер с новым образом
docker compose down || true # Если контейнер не запущен — игнорируем ошибку
docker compose up -d docker compose up -d
# Очищаем неиспользуемые образы
docker image prune -f docker image prune -f
# Проверяем статус контейнера
docker compose ps docker compose ps
EOF EOF
+1 -1
View File
@@ -1,6 +1,6 @@
[project] [project]
name = "uvpn-backend" name = "uvpn-backend"
version = "0.7.6" version = "0.7.7"
description = "FastAPI backend with Docker for uvpn.shop" description = "FastAPI backend with Docker for uvpn.shop"
readme = "README.md" readme = "README.md"
requires-python = ">=3.12" requires-python = ">=3.12"