You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

120 lines
4.3 KiB
Markdown

+++
title = "Write .gitea/workflows/deploy-ui.yml — Gitea Actions workflow to build and deploy UI to Cloudflare Pages"
priority = 4
status = "todo"
ticket_type = "task"
dependencies = ["ae886f", "dc3d2b"]
+++
<context>
Build strategy resolved in triage fc9bfd: pre-built artifact + Gitea Actions + `wrangler pages deploy`.
The Gitea instance at `gitea.elijah.run` runs Gitea Actions (GitHub Actions-compatible YAML). The workflow must:
1. Trigger on push to the `quotesdb` branch
2. Build the Yew/Wasm UI with `trunk build --release`
3. Deploy the `dist/` output to Cloudflare Pages via `wrangler pages deploy`
The Cloudflare Pages project (`quotesdb-ui`) is created by OpenTofu (ticket ae886f) and must exist before this workflow can successfully deploy.
</context>
<goal>
Create `.gitea/workflows/deploy-ui.yml` at the repository root (not inside `quotesdb/`).
</goal>
<implementation>
```yaml
# .gitea/workflows/deploy-ui.yml
# Builds the quotesdb Yew/Wasm UI with Trunk and deploys to Cloudflare Pages.
# Triggered on push to the quotesdb integration branch.
# Requires repository secrets: CLOUDFLARE_API_TOKEN, CLOUDFLARE_ACCOUNT_ID.
name: Deploy quotesdb UI
on:
push:
branches:
- quotesdb
paths:
- "quotesdb/**"
jobs:
deploy-ui:
runs-on: ubuntu-latest
defaults:
run:
working-directory: quotesdb
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Rust toolchain with wasm32 target
uses: dtolnay/rust-toolchain@stable
with:
targets: wasm32-unknown-unknown
- name: Cache Rust build artifacts
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
quotesdb/target
key: ${{ runner.os }}-cargo-ui-${{ hashFiles("quotesdb/Cargo.lock") }}
restore-keys: |
${{ runner.os }}-cargo-ui-
- name: Install Trunk
run: |
curl -fsSL https://github.com/trunk-rs/trunk/releases/latest/download/trunk-x86_64-unknown-linux-gnu.tar.gz \
| tar -xz -C ~/.cargo/bin
- name: Build UI with Trunk
run: trunk build --release
- name: Deploy to Cloudflare Pages
uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
command: pages deploy dist/ --project-name quotesdb-ui --branch main
```
</implementation>
<secrets>
The following repository secrets must be configured in Gitea (Settings → Secrets):
| Secret | Description |
|--------|-------------|
| `CLOUDFLARE_API_TOKEN` | Cloudflare API token with Pages:Edit and Account:Read permissions |
| `CLOUDFLARE_ACCOUNT_ID` | Cloudflare account ID (visible in the Cloudflare dashboard URL) |
Documentation for secrets is tracked in ticket 71b1d4.
</secrets>
<notes>
- The workflow file lives at the **repository root** (`.gitea/workflows/`), not inside `quotesdb/`. Gitea Actions discovers workflows from the repo root.
- `working-directory: quotesdb` ensures all `run` steps execute from the project directory.
- `paths: ["quotesdb/**"]` limits deploys to pushes that actually change the UI project, avoiding spurious rebuilds.
- Trunk downloads the latest release binary from GitHub; pin to a specific version for reproducibility once stable.
- `wrangler-action@v3` handles `npx wrangler` invocation internally — no separate Node.js/wrangler install needed.
- `--branch main` tells Pages this deployment is for the production branch (matches `production_branch = "quotesdb"` in OpenTofu — adjust if Pages branch naming differs).
</notes>
<constraints>
- The Cloudflare Pages project (`quotesdb-ui`) must already exist (created by OpenTofu ticket ae886f) before the first deploy succeeds.
- `trunk build --release` must succeed locally before this workflow is useful; verify with `trunk build` first.
- Do not commit `CLOUDFLARE_API_TOKEN` or any secrets to the repository.
</constraints>
<validation>
After creating the workflow file:
1. Push to the `quotesdb` branch
2. Confirm the Gitea Actions run succeeds (Actions tab in Gitea UI)
3. Confirm the deployment appears in the Cloudflare Pages dashboard under `quotesdb-ui`
</validation>
<commit>
`ci(quotesdb): add Gitea Actions workflow to build and deploy UI to Cloudflare Pages`
</commit>