Files
element-call/.gitea/workflows/ci.yml
T
Lotus CIandClaude Opus 5 9c52146312
CI / Build embedded bundle (push) Failing after 2m18s
CI / Publish to Gitea npm registry (push) Skipped
ci(lotus): hard-gate lint, format and unit tests before build; add concurrency
The workflow only built and smoke-checked that dist/index.html existed,
so a type error, lint violation or failing test could be tagged straight
to a published npm release. Run `pnpm lint` (tsc + oxlint + knip),
`pnpm format:check` (oxfmt) and `pnpm test:unit --run` before the build,
all hard. Add the same cancel-in-progress concurrency group cinny's CI
uses so rapid pushes to lotus don't queue redundant full builds.

Also fixes the one tsc error the v0.25.0 merge surfaced in
lotusDecorations (lazyActions.off now returns the emitter), so the new
gate is green from its first run.

Fixes #5
Fixes #34

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PPmy3tPq869XDW4njjVaKA
2026-09-12 11:55:33 -04:00

145 lines
5.5 KiB
YAML

name: CI
# Build + publish the Lotus fork of Element Call's embedded web bundle.
# Models LotusGuild/cinny's .gitea/workflows/ci.yml. Web bundle only, so
# Linux-only (the Windows worker is for cinny-desktop / Tauri, not needed here).
#
# - PRs and pushes to `lotus` -> build + smoke-check the embedded dist
# - Pushes of a tag `v*` -> build + publish @lotusguild/element-call-embedded
# to the Gitea npm registry
#
# Versioning: the checked-in embedded/web/package.json tracks the intended next
# release (e.g. 0.20.1-lotus.2) for local/manual publishes, but the AUTHORITATIVE
# published version is still derived from the git tag at publish time (the
# `npm version "$TAG"` step below overwrites it, so a tag always wins).
on:
push:
branches: [lotus]
tags: ["v*"]
pull_request:
branches: [lotus]
# A superseded push cancels its in-flight run (same guard as cinny's ci.yml):
# rapid pushes to lotus otherwise queue one full build each on the shared runner.
concurrency:
group: ci-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
env:
# element-call's build:full sets 16384 already; keep parity for safety.
NODE_OPTIONS: "--max-old-space-size=16384"
# Stamp the build so analytics/rageshakes aren't labelled "dev".
VITE_APP_VERSION: ${{ github.ref_name }}
jobs:
build:
name: Build embedded bundle
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version-file: ".node-version" # Node 24
# registry-url wires up the Gitea-scoped registry + auth for publish
registry-url: "https://code.lotusguild.org/api/packages/LotusGuild/npm/"
scope: "@lotusguild"
- name: Enable corepack (pnpm from packageManager field)
run: corepack enable
- name: Install dependencies
run: pnpm install --frozen-lockfile
# ── Quality gates (hard) — run BEFORE the slow build so a type/lint/
# format/test error fails in seconds. Upstream replaced eslint+prettier
# with oxlint+oxfmt in v0.25.0; `pnpm lint` = tsc + oxlint + knip.
- name: Lint (tsc + oxlint + knip)
run: pnpm lint
- name: Format check (oxfmt)
run: pnpm format:check
- name: Unit tests
run: pnpm test:unit --run
- name: Build embedded
# build:embedded writes to the repo-root dist/ (vite default outDir).
# Stage it into embedded/web/dist — the publish template's "files" entry
# — so the smoke-check and npm publish both see the bundle.
# (embedded/web/dist is gitignored, hence the explicit copy.)
run: |
pnpm run build:embedded
rm -rf embedded/web/dist
cp -r dist embedded/web/dist
- name: Smoke-check output
run: |
test -f embedded/web/dist/index.html
test -d embedded/web/dist/assets
echo "### Embedded bundle" >> "$GITHUB_STEP_SUMMARY"
echo "" >> "$GITHUB_STEP_SUMMARY"
echo '```' >> "$GITHUB_STEP_SUMMARY"
du -sh embedded/web/dist >> "$GITHUB_STEP_SUMMARY"
ls embedded/web/dist >> "$GITHUB_STEP_SUMMARY"
echo '```' >> "$GITHUB_STEP_SUMMARY"
# NOTE: no actions/upload-artifact step — v4 requires GitHub's artifact
# backend, which the Gitea act_runner does not implement (it fails with
# exit 1). The publish job rebuilds from source anyway, so the artifact
# was only a convenience; re-add a Gitea-compatible action here if per-run
# dist downloads are ever needed.
publish:
name: Publish to Gitea npm registry
needs: build
# Only on a version tag push, never on PRs.
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') }}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version-file: ".node-version"
registry-url: "https://code.lotusguild.org/api/packages/LotusGuild/npm/"
scope: "@lotusguild"
- name: Enable corepack
run: corepack enable
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build embedded
# build:embedded writes to the repo-root dist/ (vite default outDir).
# Stage it into embedded/web/dist — the publish template's "files" entry
# — so the smoke-check and npm publish both see the bundle.
# (embedded/web/dist is gitignored, hence the explicit copy.)
run: |
pnpm run build:embedded
rm -rf embedded/web/dist
cp -r dist embedded/web/dist
- name: Set published version from tag
working-directory: embedded/web
# Versioning scheme: reserve bare vX.Y.Z for upstream-parity points only
# (e.g. v0.20.1 == upstream 0.20.1). For Lotus-only iterations on top of
# an upstream base, tag a semver prerelease — v0.20.1-lotus.1, -lotus.2,
# … — so we never collide with an already-published upstream-parity
# version on the registry.
run: |
TAG="${GITHUB_REF_NAME#v}" # v0.20.1-lotus.1 -> 0.20.1-lotus.1
npm version "$TAG" --no-git-tag-version --allow-same-version
- name: Publish
working-directory: embedded/web
env:
NODE_AUTH_TOKEN: ${{ secrets.GITEA_NPM_TOKEN }}
run: npm publish --access public