ci: add Forgejo Actions workflow (eval + lint)
Pillar 7 first step. `.forgejo/workflows/check.yml` runs on every push to main and every PR. Three sequential checks in one job: 1. `nix flake check --no-build` Catches eval regressions: broken option references, missing imports, stale module argument shapes. The same command AGENT.md tells humans to run by hand before declaring a change done. 2. `bash -n` + `shellcheck --severity=error` over every `nomarchy-*` bash script. Mirrors what `.githooks/pre-commit` does locally, but across the whole tree on every push — so a branch that bypasses the hook (via `--no-verify` or a fresh clone without `core.hooksPath` set) still gets gated. Severity is capped at error to match the hook; the long tail of style/info warnings can be cleaned up incrementally. 3. `docs/SCRIPTS.md` drift check. Regenerates the audit doc to a temp file and `diff`s against the committed version. Fails loudly with the fix command if a script add/remove/rename didn't include the regeneration step. Dry-run results on the current tree: - `nix flake check --no-build`: pass (only pre-existing warnings). - shellcheck across 159 scripts at severity=error: pass. - SCRIPTS.md drift: clean. Activation: Forgejo Actions isn't enabled on the repo yet, so the workflow lands dormant. To activate: enable Actions on the repo in Forgejo's settings and register a `forgejo-runner` on any Docker-capable Linux host. The workflow uses `ubuntu-latest` and installs Nix itself via `DeterminateSystems/nix-installer-action`, so no special runner image is needed. Deferred to a follow-up batch (needs binary cache infra): - Building ISOs in CI (`nomarchy-installer`, `nomarchy-live`, default). - Release pipeline (`vYY.MM.x` tags publishing ISOs as artifacts). - `nixosTest` per palette with golden-image screenshot diffs. `docs/STRUCTURE.md` now documents `.forgejo/` and `.githooks/` so future agents and contributors can find both. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
79
.forgejo/workflows/check.yml
Normal file
79
.forgejo/workflows/check.yml
Normal file
@@ -0,0 +1,79 @@
|
||||
# Nomarchy CI — eval + lint.
|
||||
#
|
||||
# Catches the regressions that hurt today:
|
||||
# 1. Flake stops evaluating (broken option ref, missing import, etc.).
|
||||
# 2. A `nomarchy-*` shell script has a syntax error or a shellcheck
|
||||
# error-severity issue.
|
||||
# 3. `docs/SCRIPTS.md` drifts from the repo state because somebody
|
||||
# added / removed / renamed a script and didn't run the generator
|
||||
# (the pre-commit hook handles this, but only when enabled per-clone).
|
||||
#
|
||||
# Doesn't build ISOs — that needs a binary cache. Add a separate job
|
||||
# once Cachix/Attic is in place.
|
||||
|
||||
name: Check
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
eval-and-lint:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Install Nix
|
||||
uses: DeterminateSystems/nix-installer-action@main
|
||||
with:
|
||||
# Match the runner's effective channel. Nomarchy itself tracks
|
||||
# nixos-25.11 via flake.nix; the installer-action default is fine.
|
||||
extra-conf: |
|
||||
experimental-features = nix-command flakes
|
||||
|
||||
- name: nix flake check --no-build
|
||||
run: nix flake check --no-build
|
||||
|
||||
- name: Lint nomarchy-* scripts (bash -n + shellcheck)
|
||||
run: |
|
||||
# Mirror what .githooks/pre-commit runs locally, but across the
|
||||
# whole tree instead of just changed files. Pre-commit gates
|
||||
# individual commits; CI gates branches (including --no-verify
|
||||
# bypasses).
|
||||
set -e
|
||||
fail=0
|
||||
while IFS= read -r script; do
|
||||
[[ -f "$script" ]] || continue
|
||||
# Python helpers ship under the same nomarchy- prefix
|
||||
# (e.g. nomarchy-haptic-touchpad). Skip non-bash.
|
||||
head -1 "$script" | grep -qE '^#!.*\bbash\b' || continue
|
||||
if ! bash -n "$script"; then
|
||||
echo "::error file=$script::bash syntax error"
|
||||
fail=1
|
||||
fi
|
||||
if ! nix shell nixpkgs#shellcheck --command shellcheck \
|
||||
--severity=error --shell=bash "$script"; then
|
||||
echo "::error file=$script::shellcheck error-severity issue"
|
||||
fail=1
|
||||
fi
|
||||
done < <(find features/scripts/utils core/system/scripts \
|
||||
themes/engine/scripts \
|
||||
-maxdepth 1 -type f -name 'nomarchy-*')
|
||||
exit "$fail"
|
||||
|
||||
- name: docs/SCRIPTS.md is up to date
|
||||
run: |
|
||||
# Regenerate to a temp file and compare. If different, the
|
||||
# contributor forgot to run the generator (or skipped the
|
||||
# pre-commit hook). Fail loudly and tell them the fix.
|
||||
./bin/utils/nomarchy-docs-scripts --out /tmp/SCRIPTS.regen.md
|
||||
if ! diff -q docs/SCRIPTS.md /tmp/SCRIPTS.regen.md >/dev/null; then
|
||||
echo "::error::docs/SCRIPTS.md is stale."
|
||||
echo "Run: ./bin/utils/nomarchy-docs-scripts --out docs/SCRIPTS.md"
|
||||
echo "Then commit the regenerated file."
|
||||
echo "--- diff ---"
|
||||
diff -u docs/SCRIPTS.md /tmp/SCRIPTS.regen.md || true
|
||||
exit 1
|
||||
fi
|
||||
Reference in New Issue
Block a user