Files
runicnpc-rust/.gitea/workflows/pr-checks.yml

64 lines
2.5 KiB
YAML

# Gate every pull request into `main` and `edge`.
#
# RunicNPC cannot be compiled by CI: it is deployed as SOURCE and built by Oxide
# or Carbon against game assemblies that exist only on a Rust server, so a build
# job is not available at any price.
#
# What is available is a reader, and the mistakes worth reading for are the ones
# both frameworks make silent. Hooks, chat commands and `Call` targets bind by
# name through reflection, with no compile-time check and no warning when a name
# matches nothing. `scripts/checkPlugin.js` asks, dependency-free:
#
# • every hook is listed in `ExpectedHooks`, so `rnpc.status` can report it;
# • every hook is void unless answering is written down with a reason;
# • every chat command has the signature the frameworks bind;
# • every `RunicNpc_*` API call is one Oxide's `Call` can reach;
# • `ApiVersion`, `// Requires:` and `[Info]` agree with plugin.toml, which is
# what the release copies into the manifest the installer reads.
#
# Its own test suite breaks it every way it claims to catch — including the
# failure that would make every other case meaningless, a parser that silently
# matches nothing.
#
# Enforcement (one-time, in the Gitea UI):
# Repository Settings → Branches → Branch Protection (rules for `main`, `edge`)
# • Enable Status Check
# • Status check patterns: PR Checks / *
# Gitea only lists a context after it has reported once; the glob matches
# without the dropdown and keeps matching as jobs are added.
name: PR Checks
on:
pull_request:
branches: [main, edge]
concurrency:
group: pr-checks-${{ github.ref }}
cancel-in-progress: true
jobs:
plugin-checks:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
# No install step: the checks are dependency-free on purpose, which is also
# how a contributor runs them.
- name: Check the plugin's hooks, API and declarations
run: node scripts/checkPlugin.js
# Named individually rather than `node --test scripts/`: directory mode is
# not portable across the Node versions this project runs on.
- name: Test the checker itself
run: node --test scripts/checkPlugin.test.js
# The staging drill's pure parts (tools/drill/drill.js): its stall limit and fresh-data list.
- name: Test the staging drill
run: node --test tools/drill/drill.test.js