Files
datacontroller.io/.gitea/workflows/publish.yml
T
dc 5980e2caba chore(ci): regenerate the lockfile and gate deploys on critical vulns
Review follow-up.

Lockfile: the previous commit pruned the surfer subtree by hand and left
orphaned nested entries behind (node_modules/cloudron-surfer/node_modules/*,
plus children of removed parents such as @cloudron/pankow's filesize and
express-session's cookie). Regenerated from the unmodified main lockfile with
`npm install --package-lock-only --legacy-peer-deps`, so the lock is npm's own
output rather than an edit. No dangling entries remain.

Publish workflow: added a blocking `npm audit --audit-level=critical` step
between install and build. Critical rather than the suggested default/low: the
tree carries 102 advisories at low/moderate/high that have no non-breaking fix
(mostly the Gatsby 5 build toolchain), so a low gate would fail every deploy
from the first run. The tree is now clear of criticals, having bumped the two
that were live, both within their parents' existing ranges:

- proxy-addr 2.0.7 -> 2.0.8 (GHSA-jqcg-44mw-7w3h, via express ~2.0.7)
- shell-quote 1.8.1 -> 1.12.0 (GHSA-w7jw-789q-3m8p, GHSA-395f-4hp3-45gv, via
  react-dev-utils ^1.7.3)

.pre-commit-config.yaml: gitleaks hook pinned to v8.30.1 for staged-content
secret scanning. Developer-side only - `pre-commit install` per clone.

Verified: `npm ci --legacy-peer-deps` clean against the regenerated lock,
`npm audit --audit-level=critical` exits 0, build 136 pages, typecheck clean,
lint unchanged at the 8 pre-existing files.
2026-10-28 12:04:06 +00:00

61 lines
2.2 KiB
YAML

name: publish
run-name: Publishing the website with a surfer
on:
push:
branches:
- main
workflow_dispatch:
# One deploy at a time: `surfer deploy` swaps the site atomically, so two runs
# racing each other is not corruption, but it is a wasted build and the last
# swap wins.
concurrency:
group: surfer-datacontroller-io
cancel-in-progress: false
jobs:
Build-and-publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
- name: Install dependencies
run: npm ci --legacy-peer-deps
# Blocking gate, at CRITICAL only. `npm audit` fails on the severity you
# name, so `--audit-level=low` (or the default) would stop every deploy
# today: the Gatsby 5 tree carries ~100 advisories at low/moderate/high
# that have no non-breaking fix, and publishing would simply never run.
# Critical is the line worth stopping a deploy for, and the tree is clear
# of it - keep it that way rather than gating on noise nobody will action.
- name: Audit for critical vulnerabilities
run: npm audit --audit-level=critical
- name: Build
run: npm run build
# Deploy tooling pinned to an exact version: the workflow publishes
# whatever is committed, and an unpinned `latest` would let a breaking or
# compromised upstream release ship straight to the live site.
#
# `deploy` (v7) replaces the site atomically - it extracts to a staging
# folder and swaps it in, so a failed upload leaves the current site
# serving. The v6 `put` this replaces was token authenticated and is
# gone; v7 takes the Cloudron username plus an app password for this app.
- name: Publish
env:
SURFER_PASSWORD: ${{ secrets.SURFER_PASSWORD }}
REF_NAME: ${{ gitea.ref_name }}
COMMIT_SHA: ${{ gitea.sha }}
run: |
set -euo pipefail
npx --yes @cloudron/surfer@7.2.0 deploy public \
--server datacontroller.io \
--username allan \
--password "$SURFER_PASSWORD" \
--message "Build from ${REF_NAME} @ ${COMMIT_SHA:0:8}"