Add Forgejo Actions workflow to build and deploy on push
Some checks failed
Deploy / build-deploy (push) Failing after 1m0s
Some checks failed
Deploy / build-deploy (push) Failing after 1m0s
- .forgejo/workflows/deploy.yaml: build the wasm bundle on the arch-latest Docker runner and rsync it into the bind-mounted web root (/deploy) on push to master - deploy/Caddyfile.example: reference site block with the cross-origin isolation headers the WASM runtime requires Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
13a12c2a2c
commit
d3dd4b1f7a
2 changed files with 117 additions and 0 deletions
96
.forgejo/workflows/deploy.yaml
Normal file
96
.forgejo/workflows/deploy.yaml
Normal file
|
|
@ -0,0 +1,96 @@
|
||||||
|
name: Deploy
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [master]
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
# One deploy at a time; if you push twice quickly, cancel the older run so the
|
||||||
|
# newest commit is what lands on the server.
|
||||||
|
concurrency:
|
||||||
|
group: deploy
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-deploy:
|
||||||
|
runs-on: arch-latest
|
||||||
|
steps:
|
||||||
|
- name: Install build dependencies
|
||||||
|
run: |
|
||||||
|
# Same keyring bootstrap the Crafter.Build CI does: the slim
|
||||||
|
# archlinux:latest image ships without a populated pacman keyring
|
||||||
|
# or local master key.
|
||||||
|
pacman-key --init
|
||||||
|
pacman-key --populate archlinux
|
||||||
|
pacman -Sy --noconfirm --needed archlinux-keyring
|
||||||
|
pacman -Syu --noconfirm --needed \
|
||||||
|
clang lld libc++ \
|
||||||
|
wasi-libc wasi-libc++ wasi-libc++abi wasi-compiler-rt \
|
||||||
|
git curl tar rsync
|
||||||
|
# Container runs as root; workspace may be owned by another uid.
|
||||||
|
git config --global --add safe.directory '*'
|
||||||
|
|
||||||
|
- name: Install crafter-build
|
||||||
|
# Pull the rolling 'latest' Linux build from the Crafter.Build repo and
|
||||||
|
# install it distro-style so it auto-discovers its modules under
|
||||||
|
# /usr/share/crafter-build. v2 = SSE4.2 baseline, safe on the CI SBC.
|
||||||
|
run: |
|
||||||
|
set -eux
|
||||||
|
url="https://forgejo.catcrafts.net/Catcrafts/Crafter.Build/releases/download/latest/crafter-build-linux-x86_64-v2.tar.gz"
|
||||||
|
mkdir -p /tmp/cb
|
||||||
|
curl -fsSL "$url" -o /tmp/cb.tar.gz
|
||||||
|
tar -xzf /tmp/cb.tar.gz -C /tmp/cb
|
||||||
|
install -Dm755 /tmp/cb/bin/crafter-build /usr/bin/crafter-build
|
||||||
|
cp -r /tmp/cb/share/crafter-build /usr/share/
|
||||||
|
crafter-build --version || true
|
||||||
|
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Cache crafter-build dependency clones
|
||||||
|
# ~/.cache/crafter.build holds the Crafter.Graphics clone and prebuilt
|
||||||
|
# module cache. crafter-build still git-pulls the dep each run, so a
|
||||||
|
# stale cache only means a smaller delta fetch, never a stale build.
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: ~/.cache/crafter.build
|
||||||
|
key: crafter-cache-${{ runner.os }}-${{ hashFiles('project.cpp') }}
|
||||||
|
restore-keys: |
|
||||||
|
crafter-cache-${{ runner.os }}-
|
||||||
|
|
||||||
|
- name: Build (wasm bundle)
|
||||||
|
run: crafter-build
|
||||||
|
|
||||||
|
- name: Locate build output
|
||||||
|
id: out
|
||||||
|
run: |
|
||||||
|
set -eu
|
||||||
|
dist=$(find bin -maxdepth 1 -type d -name 'Catcrafts.Net-wasm32-wasip1-*' | head -n1)
|
||||||
|
if [ -z "$dist" ]; then
|
||||||
|
echo "No build output directory found under bin/" >&2
|
||||||
|
ls -la bin || true
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "dist=$dist" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "Built bundle: $dist"
|
||||||
|
ls -la "$dist"
|
||||||
|
|
||||||
|
- name: Deploy to web root
|
||||||
|
# No SSH: the job already runs on the deploy box. The server's web root
|
||||||
|
# is bind-mounted into this container at /deploy via the runner config
|
||||||
|
# (container.options: "-v /path/to/webroot:/deploy"). We just copy into
|
||||||
|
# it. --delete makes the root an exact mirror of the build; Caddyfile.coi
|
||||||
|
# is a local dev helper (its 'root' points at the build machine), so the
|
||||||
|
# server's own Caddy config supplies the headers instead.
|
||||||
|
env:
|
||||||
|
DIST: ${{ steps.out.outputs.dist }}
|
||||||
|
run: |
|
||||||
|
set -eu
|
||||||
|
if [ ! -d /deploy ]; then
|
||||||
|
echo "ERROR: /deploy is not mounted into the runner container." >&2
|
||||||
|
echo "Add '-v /your/webroot:/deploy' to the runner's container.options" >&2
|
||||||
|
echo "in config.yaml and restart the runner." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
rsync -a --delete --exclude 'Caddyfile.coi' "$DIST"/ /deploy/
|
||||||
|
echo "Deployed $DIST -> /deploy (host web root)"
|
||||||
21
deploy/Caddyfile.example
Normal file
21
deploy/Caddyfile.example
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
# catcrafts.net Caddy site block
|
||||||
|
#
|
||||||
|
# The WASM app (Crafter.Graphics) needs a cross-origin-isolated context
|
||||||
|
# (SharedArrayBuffer / threads), which requires these response headers. They
|
||||||
|
# are NOT optional — without them the page loads but the runtime fails.
|
||||||
|
#
|
||||||
|
# If you already have a `catcrafts.net { ... }` block, you only need to ADD the
|
||||||
|
# three Cross-Origin-* header lines to it. This file is the complete block for
|
||||||
|
# reference. Point `root` at the host directory you bind-mount into the runner
|
||||||
|
# as /deploy (the "-v /path/to/webroot:/deploy" in the runner's config.yaml).
|
||||||
|
|
||||||
|
catcrafts.net {
|
||||||
|
root * /srv/catcrafts.net
|
||||||
|
|
||||||
|
header Cross-Origin-Opener-Policy "same-origin"
|
||||||
|
header Cross-Origin-Embedder-Policy "require-corp"
|
||||||
|
header Cross-Origin-Resource-Policy "same-origin"
|
||||||
|
|
||||||
|
encode zstd gzip
|
||||||
|
file_server
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue