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
145 lines
5.5 KiB
YAML
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
|