66 lines
2.8 KiB
YAML
66 lines
2.8 KiB
YAML
# Деплой на сервер по SSH после пуша тега v* или вручную (в т.ч. откат на старый тег).
|
||
name: Deploy
|
||
|
||
on:
|
||
push:
|
||
tags:
|
||
- "v*"
|
||
workflow_dispatch:
|
||
inputs:
|
||
ref:
|
||
description: "Git ref (тег для релиза или отката, напр. v1.5.0 или v1.4.1)"
|
||
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
|
||
cd "${{ secrets.DEPLOY_PATH }}"
|
||
git fetch origin --tags --prune
|
||
git checkout "${{ steps.pick.outputs.ref }}"
|
||
# Теги не дают refs/remotes/origin/<тег> — только ветки; для v* срабатывает else.
|
||
if git show-ref --verify --quiet "refs/remotes/origin/${{ steps.pick.outputs.ref }}"; then
|
||
git reset --hard "origin/${{ steps.pick.outputs.ref }}"
|
||
else
|
||
git reset --hard "${{ steps.pick.outputs.ref }}"
|
||
fi
|
||
docker compose build
|
||
docker compose up -d
|
||
docker compose ps
|