215
.gitea/workflows/build-and-push.yml
Normal file
215
.gitea/workflows/build-and-push.yml
Normal file
@@ -0,0 +1,215 @@
|
||||
name: Build and Push Docker Image
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
|
||||
jobs:
|
||||
build-and-push:
|
||||
runs-on: ubuntu-latest # Убедитесь, что у вашего раннера есть этот тег
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 2
|
||||
|
||||
- name: Get versions and check change
|
||||
id: version_check
|
||||
run: |
|
||||
# Извлекаем текущую версию
|
||||
CUR=$(cat VERSION | tr -d '[:space:]')
|
||||
echo "current=$CUR" >> $GITHUB_OUTPUT
|
||||
|
||||
# Извлекаем сообщение последнего коммита
|
||||
COMMIT_MSG=$(git log -1 --pretty=%B | head -1)
|
||||
echo "commit_message=$COMMIT_MSG" >> $GITHUB_OUTPUT
|
||||
|
||||
# Безопасно извлекаем старую версию
|
||||
PREV=$(git show HEAD~1:VERSION 2>/dev/null | tr -d '[:space:]' || echo "none")
|
||||
|
||||
if [ "$CUR" != "$PREV" ]; then
|
||||
echo "changed=true" >> $GITHUB_OUTPUT
|
||||
else
|
||||
echo "changed=false" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
- name: Patch DNS for Local Network
|
||||
run: |
|
||||
# Записываем IP Synology прямо в контейнер сборки
|
||||
echo "192.168.50.55 dungeonsiege.synology.me" | sudo tee -a /etc/hosts
|
||||
|
||||
- name: Build Docker Image
|
||||
id: build
|
||||
run: |
|
||||
REGISTRY="dungeonsiege.synology.me/poignatov/play-life"
|
||||
VER="${{ steps.version_check.outputs.current }}"
|
||||
|
||||
echo "Building Docker image..."
|
||||
echo "Registry: $REGISTRY"
|
||||
echo "Tag: latest"
|
||||
|
||||
# Собираем образ
|
||||
docker build -t $REGISTRY:latest .
|
||||
|
||||
echo "✅ Successfully built image: $REGISTRY:latest"
|
||||
|
||||
- name: Log in to Gitea Registry
|
||||
if: steps.version_check.outputs.changed == 'true'
|
||||
run: |
|
||||
echo "${{ secrets.GIT_TOKEN }}" | docker login dungeonsiege.synology.me -u ${{ secrets.GIT_USERNAME }} --password-stdin
|
||||
|
||||
- name: Push Docker Image
|
||||
id: push
|
||||
if: steps.version_check.outputs.changed == 'true'
|
||||
run: |
|
||||
REGISTRY="dungeonsiege.synology.me/poignatov/play-life"
|
||||
VER="${{ steps.version_check.outputs.current }}"
|
||||
|
||||
# Тегируем образ версией
|
||||
docker tag $REGISTRY:latest $REGISTRY:$VER
|
||||
|
||||
# Пушим оба тега
|
||||
echo "Pushing image to registry..."
|
||||
docker push $REGISTRY:latest
|
||||
docker push $REGISTRY:$VER
|
||||
|
||||
echo "✅ Successfully pushed to registry:"
|
||||
echo " - $REGISTRY:latest"
|
||||
echo " - $REGISTRY:$VER"
|
||||
|
||||
- name: Send Telegram notification (build success)
|
||||
if: success() && steps.version_check.outputs.changed == 'false'
|
||||
uses: appleboy/telegram-action@master
|
||||
with:
|
||||
to: ${{ secrets.TELEGRAM_TO }}
|
||||
token: ${{ secrets.TELEGRAM_TOKEN }}
|
||||
format: markdown
|
||||
message: |
|
||||
*play-life*
|
||||
`${{ steps.version_check.outputs.commit_message }}`
|
||||
|
||||
Build: ✅
|
||||
Registration: ⏭️
|
||||
Deploy: ⏭️
|
||||
|
||||
- name: Deploy to Production Server
|
||||
id: deploy
|
||||
if: steps.version_check.outputs.changed == 'true'
|
||||
uses: appleboy/ssh-action@master
|
||||
with:
|
||||
host: ${{ secrets.DEPLOY_HOST }}
|
||||
username: ${{ secrets.DEPLOY_USER }}
|
||||
password: ${{ secrets.DEPLOY_PASSWORD }}
|
||||
script: |
|
||||
set -e
|
||||
|
||||
# Расширяем PATH для Synology (при SSH сессии PATH минимальный)
|
||||
export PATH="/usr/local/bin:/usr/syno/bin:$PATH"
|
||||
|
||||
REGISTRY="dungeonsiege.synology.me/poignatov/play-life"
|
||||
DEPLOY_PATH="/volume1/docker/play-life"
|
||||
|
||||
echo "🚀 Начинаю деплой на production сервер..."
|
||||
echo "PATH: $PATH"
|
||||
|
||||
# Проверяем наличие docker
|
||||
if ! command -v docker >/dev/null 2>&1; then
|
||||
echo "❌ Docker не найден в PATH!"
|
||||
echo "Пробуем найти docker..."
|
||||
which docker || find /usr -name "docker" -type f 2>/dev/null | head -5
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DOCKER_CMD="docker"
|
||||
|
||||
# Определяем docker-compose (может быть docker compose или docker-compose)
|
||||
if command -v docker-compose >/dev/null 2>&1; then
|
||||
DOCKER_COMPOSE_CMD="docker-compose"
|
||||
elif docker compose version >/dev/null 2>&1; then
|
||||
DOCKER_COMPOSE_CMD="docker compose"
|
||||
else
|
||||
echo "❌ Docker Compose не найден!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Используем: $DOCKER_CMD и $DOCKER_COMPOSE_CMD"
|
||||
|
||||
# Переходим в директорию проекта
|
||||
cd $DEPLOY_PATH
|
||||
|
||||
# Логинимся в registry
|
||||
echo "${{ secrets.GIT_TOKEN }}" | $DOCKER_CMD login dungeonsiege.synology.me -u ${{ secrets.GIT_USERNAME }} --password-stdin
|
||||
|
||||
# Обновляем образ
|
||||
echo "📥 Обновляю образ из registry..."
|
||||
$DOCKER_CMD pull $REGISTRY:latest
|
||||
|
||||
# Перезапускаем контейнеры
|
||||
echo "🔄 Перезапускаю контейнеры..."
|
||||
$DOCKER_COMPOSE_CMD -f docker-compose.prod.yml up -d --force-recreate
|
||||
|
||||
# Проверяем статус
|
||||
echo "✅ Деплой завершен успешно"
|
||||
$DOCKER_COMPOSE_CMD -f docker-compose.prod.yml ps
|
||||
|
||||
- name: Send Telegram notification (publish success)
|
||||
if: steps.build.outcome == 'success' && steps.version_check.outputs.changed == 'true' && steps.push.outcome == 'success' && steps.deploy.outcome == 'success'
|
||||
uses: appleboy/telegram-action@master
|
||||
with:
|
||||
to: ${{ secrets.TELEGRAM_TO }}
|
||||
token: ${{ secrets.TELEGRAM_TOKEN }}
|
||||
format: markdown
|
||||
message: |
|
||||
*play-life*
|
||||
`${{ steps.version_check.outputs.commit_message }}`
|
||||
|
||||
Build: ✅
|
||||
Registration: ✅
|
||||
Deploy: ✅
|
||||
|
||||
- name: Send Telegram notification (push failure)
|
||||
if: steps.build.outcome == 'success' && steps.version_check.outputs.changed == 'true' && steps.push.outcome == 'failure'
|
||||
uses: appleboy/telegram-action@master
|
||||
with:
|
||||
to: ${{ secrets.TELEGRAM_TO }}
|
||||
token: ${{ secrets.TELEGRAM_TOKEN }}
|
||||
format: markdown
|
||||
message: |
|
||||
*play-life*
|
||||
`${{ steps.version_check.outputs.commit_message }}`
|
||||
|
||||
Build: ✅
|
||||
Registration: ❌
|
||||
Deploy: ⏭️
|
||||
|
||||
- name: Send Telegram notification (deploy failure)
|
||||
if: steps.build.outcome == 'success' && steps.push.outcome == 'success' && steps.version_check.outputs.changed == 'true' && steps.deploy.outcome == 'failure'
|
||||
uses: appleboy/telegram-action@master
|
||||
with:
|
||||
to: ${{ secrets.TELEGRAM_TO }}
|
||||
token: ${{ secrets.TELEGRAM_TOKEN }}
|
||||
format: markdown
|
||||
message: |
|
||||
*play-life*
|
||||
`${{ steps.version_check.outputs.commit_message }}`
|
||||
|
||||
Build: ✅
|
||||
Registration: ✅
|
||||
Deploy: ❌
|
||||
|
||||
- name: Send Telegram notification (build failure)
|
||||
if: steps.build.outcome == 'failure'
|
||||
uses: appleboy/telegram-action@master
|
||||
with:
|
||||
to: ${{ secrets.TELEGRAM_TO }}
|
||||
token: ${{ secrets.TELEGRAM_TOKEN }}
|
||||
format: markdown
|
||||
message: |
|
||||
*play-life*
|
||||
`${{ steps.version_check.outputs.commit_message }}`
|
||||
|
||||
Build: ❌
|
||||
Registration: ⏭️
|
||||
Deploy: ⏭️
|
||||
Reference in New Issue
Block a user