# CI for shopdb-flask on GitHub Actions. # # Mirrors the internal CI pipeline. Four jobs on push + pull_request: # backend - pytest (SQLite via TestingConfig, no DB service needed) # naming - the CONTRIBUTING.md naming/style gate # frontend - vitest + Vue build # migrations-mysql - the REAL multi-site deploy path: fresh flask db upgrade # + every plugin's chain on utf8mb4 MySQL 8, idempotent on # a second run. The pytest suite only exercises SQLite # create_all(), so this is what catches an Alembic # regression on MySQL before it ships. name: CI # Jobs run on the org's self-hosted "arc-runner-set" (enterprise # ge-aerospace-runner-group, Linux). GitHub-hosted runners are blocked by the # org IP allow list (hosted Azure runner IPs are not allow-listed -> checkout # 403), so ubuntu-latest cannot be used here. arc-runner-set checks out from an # internal allow-listed IP and, being Linux, still supports service containers. on: push: pull_request: jobs: backend: runs-on: arc-runner-set steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: '3.13' cache: pip - run: pip install -r requirements.txt - run: python -m pytest -q naming: runs-on: arc-runner-set steps: - uses: actions/checkout@v4 - run: bash scripts/check-naming-and-style.sh frontend: runs-on: arc-runner-set defaults: run: working-directory: frontend steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: '20' cache: npm cache-dependency-path: frontend/package-lock.json - run: npm ci - run: npx vitest run - run: npm run build lean-build: # ADR-013 Phase 5: prove a per-site build carries only its chosen plugins. # Builds a lean site (machines + printers) and asserts an omitted plugin's # code is absent from the bundle - the delete-a-plugin guarantee in CI. runs-on: arc-runner-set steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: '20' cache: npm cache-dependency-path: frontend/package-lock.json - run: cd frontend && npm ci - name: Build lean site (machines + printers) run: | printf '{ "site": "ci-lean", "plugins": ["machines", "printers"] }' \ > /tmp/lean-profile.json bash scripts/build-site.sh /tmp/lean-profile.json /tmp/leansite - name: Assert omitted plugin code is absent, chosen present run: | assets=/tmp/leansite/frontend-dist/assets for code in PartsKiosk ManifestEditor USBLabelBatch KnowledgeBaseDetail; do if grep -rqoh "$code" "$assets"/*.js; then echo "FAIL: omitted-plugin code '$code' leaked into the lean bundle" exit 1 fi done for code in MachineDetail PrinterDetail; do grep -rqoh "$code" "$assets"/*.js || { echo "FAIL: chosen-plugin code '$code' missing from the lean bundle" exit 1; } done # Core frontends (no manifest, e.g. applications) must ship in EVERY # build regardless of SITE_PLUGINS, or a lean site loses a core page. grep -rqoh "ApplicationsList" "$assets"/*.js || { echo "FAIL: core page 'ApplicationsList' missing from the lean bundle" exit 1; } test -d /tmp/leansite/plugins/machines test ! -d /tmp/leansite/plugins/printedparts echo "lean build verified: only chosen plugins present" # NOTE: the MySQL-8 migration/seed job (fresh `flask db upgrade` + every # plugin chain + strict-mode seeders on a real MySQL 8) runs on the internal # CI server, which supports service containers. The org's arc-runner-set is # Kubernetes/ARC without docker-in-docker, so GitHub Actions service # containers ("services: mysql") are unavailable here ("Job Container is # required"). That coverage stays on the internal CI rather than being # duplicated on GitHub.