74 lines
3.1 KiB
YAML
74 lines
3.1 KiB
YAML
# Деплой на сервер по SSH после пуша тега v* или вручную (в т.ч. откат на старый тег).
|
||
name: Deploy
|
||
|
||
on:
|
||
push:
|
||
tags:
|
||
- "v*"
|
||
workflow_dispatch:
|
||
inputs:
|
||
ref:
|
||
description: "Ветка или тег: main = как на Forgejo; v1.7.0 = тег. Не путать с 1.7.0 без v."
|
||
required: true
|
||
default: "main"
|
||
|
||
jobs:
|
||
deploy:
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- name: Определить ревизию
|
||
id: pick
|
||
run: |
|
||
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
|
||
echo "ref=${{ inputs.ref }}" >> "$GITHUB_OUTPUT"
|
||
else
|
||
echo "ref=${{ github.ref_name }}" >> "$GITHUB_OUTPUT"
|
||
fi
|
||
|
||
# Без секретов appleboy/ssh-action падает с «missing server host» — даём явную подсказку.
|
||
- name: Проверить секреты деплоя
|
||
env:
|
||
DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }}
|
||
DEPLOY_USER: ${{ secrets.DEPLOY_USER }}
|
||
DEPLOY_PATH: ${{ secrets.DEPLOY_PATH }}
|
||
DEPLOY_SSH_KEY: ${{ secrets.DEPLOY_SSH_KEY }}
|
||
run: |
|
||
ok=0
|
||
[ -n "$DEPLOY_HOST" ] || { echo "::error::Секрет DEPLOY_HOST пустой. Forgejo → репозиторий → Настройки → Actions → Secrets."; ok=1; }
|
||
[ -n "$DEPLOY_USER" ] || { echo "::error::Секрет DEPLOY_USER пустой."; ok=1; }
|
||
[ -n "$DEPLOY_PATH" ] || { echo "::error::Секрет DEPLOY_PATH пустой (каталог клона на сервере, напр. /opt/onGuard24)."; ok=1; }
|
||
[ -n "$DEPLOY_SSH_KEY" ] || { echo "::error::Секрет DEPLOY_SSH_KEY пустой (приватный SSH-ключ целиком, PEM)."; ok=1; }
|
||
exit "$ok"
|
||
|
||
- name: SSH — fetch, checkout, docker compose
|
||
uses: appleboy/ssh-action@v1.2.0
|
||
with:
|
||
host: ${{ secrets.DEPLOY_HOST }}
|
||
port: "22"
|
||
username: ${{ secrets.DEPLOY_USER }}
|
||
key: ${{ secrets.DEPLOY_SSH_KEY }}
|
||
script_stop: true
|
||
command_timeout: 20m
|
||
script: |
|
||
set -euo pipefail
|
||
REF="${{ steps.pick.outputs.ref }}"
|
||
cd "${{ secrets.DEPLOY_PATH }}"
|
||
echo "=== deploy REF=$REF ==="
|
||
git fetch origin --tags --prune
|
||
git checkout "$REF"
|
||
# Теги не дают refs/remotes/origin/<тег> — только ветки; для v* срабатывает else.
|
||
if git show-ref --verify --quiet "refs/remotes/origin/$REF"; then
|
||
git reset --hard "origin/$REF"
|
||
else
|
||
git reset --hard "$REF"
|
||
fi
|
||
echo "=== git HEAD ==="
|
||
git log -1 --oneline
|
||
echo "=== docker compose version ==="
|
||
docker compose version
|
||
echo "=== docker compose build ==="
|
||
docker compose build --progress=plain
|
||
echo "=== docker compose up ==="
|
||
docker compose up -d
|
||
docker compose ps
|