2 Commits

Author SHA1 Message Date
hsiegeln
ca2a725953 ci(deploy): merge build+deploy into one job, manual trigger only
All checks were successful
ci / build-test (push) Successful in 4m0s
Two changes:

1. Merge build and deploy jobs into a single 'deploy' job. This
   eliminates the actions/upload-artifact@v3 round-trip, which was
   silently stripping dotfiles (.htaccess) from the artifact and
   leaving the deployed origin without security headers. The built
   dist/ (including .htaccess) now flows directly into rsync in the
   same workspace.

2. Remove the 'push: branches: [main]' trigger so deploy runs only
   on workflow_dispatch (manual click in Gitea Actions UI).
   Merges to main no longer auto-deploy — production promotion is
   an explicit user action.

The concurrency group at workflow level still prevents overlapping
deploys. All secrets remain unchanged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 21:24:42 +02:00
hsiegeln
fdb0411c35 Sync main into feat/initial-build before merge-jobs refactor 2026-04-24 21:23:58 +02:00

View File

@@ -1,10 +1,14 @@
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# cameleer-website — Deploy to Hetzner Webhosting L # cameleer-website — Deploy to Hetzner Webhosting L
# #
# Runs ONLY on pushes to `main` and on manual dispatch from the Gitea UI. # MANUAL TRIGGER ONLY. Runs exclusively on workflow_dispatch from the Gitea UI
# Does NOT run Lighthouse CI (that's in ci.yml — assume any commit that reached # (Actions → deploy → Run workflow). Does NOT auto-deploy on push to main —
# main already passed the full gate). Rebuilds fresh, runs the TBD guard, and # merges to main must be explicitly promoted to production.
# rsyncs `dist/` to the origin over SSH with host-key pinning. #
# Build and deploy run in a single job so the built dist/ (including
# dotfiles like .htaccess) flows directly into rsync. An earlier split-job
# design was abandoned because actions/upload-artifact@v3 excludes dotfiles
# by default and the v4 client does not work on Gitea Actions / GHES.
# #
# Runner: self-hosted arm64 Gitea runner. Adjust `runs-on` if your runner's # Runner: self-hosted arm64 Gitea runner. Adjust `runs-on` if your runner's
# labels differ. Deploy target is Hetzner amd64 — arch mismatch is a non-issue # labels differ. Deploy target is Hetzner amd64 — arch mismatch is a non-issue
@@ -12,15 +16,12 @@
# #
# Required secrets (repo settings → Actions → Secrets): # Required secrets (repo settings → Actions → Secrets):
# SFTP_HOST, SFTP_USER, SFTP_PATH, SFTP_KEY, SFTP_KNOWN_HOSTS # SFTP_HOST, SFTP_USER, SFTP_PATH, SFTP_KEY, SFTP_KNOWN_HOSTS
# Required variables (repo settings → Actions → Variables):
# PUBLIC_AUTH_SIGNIN_URL, PUBLIC_AUTH_SIGNUP_URL, PUBLIC_SALES_EMAIL # PUBLIC_AUTH_SIGNIN_URL, PUBLIC_AUTH_SIGNUP_URL, PUBLIC_SALES_EMAIL
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
name: deploy name: deploy
on: on:
push:
branches: [main]
workflow_dispatch: workflow_dispatch:
concurrency: concurrency:
@@ -28,9 +29,9 @@ concurrency:
cancel-in-progress: false cancel-in-progress: false
jobs: jobs:
build: deploy:
runs-on: ubuntu-latest runs-on: ubuntu-latest
timeout-minutes: 15 timeout-minutes: 25
env: env:
PUBLIC_AUTH_SIGNIN_URL: ${{ secrets.PUBLIC_AUTH_SIGNIN_URL }} PUBLIC_AUTH_SIGNIN_URL: ${{ secrets.PUBLIC_AUTH_SIGNIN_URL }}
PUBLIC_AUTH_SIGNUP_URL: ${{ secrets.PUBLIC_AUTH_SIGNUP_URL }} PUBLIC_AUTH_SIGNUP_URL: ${{ secrets.PUBLIC_AUTH_SIGNUP_URL }}
@@ -70,28 +71,6 @@ jobs:
exit 1 exit 1
fi fi
# Pin to v3 — Gitea Actions implements the v3 artifact protocol.
# upload/download-artifact@v4 talk to a github.com-only backend and
# fail with GHESNotSupportedError on Gitea / Forgejo / GHES.
- name: Upload dist artifact
uses: actions/upload-artifact@v3
with:
name: dist
path: dist/
retention-days: 7
deploy:
needs: build
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Download dist artifact
uses: actions/download-artifact@v3
with:
name: dist
path: dist/
- name: Configure SSH - name: Configure SSH
env: env:
SFTP_KEY: ${{ secrets.SFTP_KEY }} SFTP_KEY: ${{ secrets.SFTP_KEY }}