evOo-local/.github/workflows/evo-deploy.yml
Cursor Agent b5b88db862 feat(ops): auto-deploy evOo-local on Evo with health check and rollback
Add idempotent deploy helper and GitHub workflow that runs on the
self-hosted Evo runner (no SSH secrets). Pulls main or a pinned SHA,
migrates, restarts via systemd/tmux/compose, probes :3100/:5173, and
resets on health failure.

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
2026-09-23 22:58:14 +00:00

84 lines
3.1 KiB
YAML

name: evo-deploy
# Deploy evOo-local on the Evo host when main advances, or on manual dispatch.
# Runs ON the self-hosted Evo runner (no SSH, no deploy secrets in the workflow).
on:
push:
branches: [main]
workflow_dispatch:
inputs:
ref:
description: Git ref or SHA to deploy (default main tip)
required: false
default: main
dry_run:
description: Dry run (no git/service changes)
type: boolean
default: false
skip_migrate:
description: Skip database migrations
type: boolean
default: false
permissions:
contents: read
concurrency:
group: evo-deploy
cancel-in-progress: false
jobs:
deploy:
if: vars.EVO_DEPLOY_ENABLED == 'true'
runs-on: [self-hosted, evoo-ci, Linux]
timeout-minutes: 30
steps:
- name: Checkout deploy scripts
uses: actions/checkout@v5
with:
persist-credentials: false
ref: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.ref || github.sha }}
- name: Deploy evOo-local on Evo
env:
EVO_DEPLOY_DIR: ${{ vars.EVO_DEPLOY_DIR }}
EVO_DEPLOY_REF: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.ref || github.sha }}
EVO_DRY_RUN: ${{ github.event.inputs.dry_run || 'false' }}
EVO_MIGRATE: ${{ github.event.inputs.skip_migrate == true && 'false' || 'true' }}
EVO_RESTART_MODE: ${{ vars.EVO_RESTART_MODE || 'auto' }}
EVO_SYSTEMD_UNIT: ${{ vars.EVO_SYSTEMD_UNIT || '' }}
EVO_SYSTEMD_SCOPE: ${{ vars.EVO_SYSTEMD_SCOPE || 'user' }}
EVO_TMUX_SESSION: ${{ vars.EVO_TMUX_SESSION || 'evoo' }}
EVO_API_HEALTH_URL: ${{ vars.EVO_API_HEALTH_URL || 'http://127.0.0.1:3100/health' }}
EVO_WEB_HEALTH_URL: ${{ vars.EVO_WEB_HEALTH_URL || 'http://127.0.0.1:5173/' }}
EVO_HEALTH_TIMEOUT_SEC: ${{ vars.EVO_HEALTH_TIMEOUT_SEC || '120' }}
run: |
set -euo pipefail
EVO_DEPLOY_DIR="${EVO_DEPLOY_DIR:-${HOME}/Projects/evOo-local}"
export EVO_DEPLOY_DIR
test -d "$EVO_DEPLOY_DIR" || { echo "EVO_DEPLOY_DIR missing: $EVO_DEPLOY_DIR" >&2; exit 1; }
args=()
[[ "$EVO_DRY_RUN" == "true" ]] && args+=(--dry-run)
[[ "$EVO_MIGRATE" == "false" ]] && args+=(--skip-migrate)
bash "${GITHUB_WORKSPACE}/ops/evo-deploy/deploy.sh" "${args[@]}"
- name: Deploy summary
if: always()
env:
EVO_DEPLOY_DIR: ${{ vars.EVO_DEPLOY_DIR }}
run: |
EVO_DEPLOY_DIR="${EVO_DEPLOY_DIR:-${HOME}/Projects/evOo-local}"
EVO_STATE_FILE="$EVO_DEPLOY_DIR/.evo-deploy/state.json"
{
echo "### Evo deploy"
echo
echo "- Ref: \`${{ github.event_name == 'workflow_dispatch' && github.event.inputs.ref || github.sha }}\`"
echo "- Dir: \`$EVO_DEPLOY_DIR\`"
if [[ -f "$EVO_STATE_FILE" ]]; then
echo "- State:"
echo '```json'
cat "$EVO_STATE_FILE"
echo '```'
fi
} >> "$GITHUB_STEP_SUMMARY"