mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-11-11 12:33:53 -06:00
Every archive has a recipe in recipes/archives.json, and no page a user reads said so. A short reference page says what a recipe is, how to rebuild one archive and what exact and canonical mean. Its counts and the README line are counted from the recipe file at each build. The README gains a row of four badges: PyPI version, Python versions, the Validation workflow on main and the license. Tests hold the badges, the counts and the page's command.
236 lines
8.6 KiB
YAML
236 lines
8.6 KiB
YAML
name: Deploy Site
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
paths:
|
|
- "platforms/**"
|
|
- "emulators/**"
|
|
- "provenance/**"
|
|
- "wiki/**"
|
|
- "exports/**"
|
|
# Every script the build runs or imports, and no other
|
|
# (tests/test_workflow_paths.py).
|
|
- "scripts/archive_build.py"
|
|
- "scripts/artifacts.py"
|
|
- "scripts/auto_fetch.py"
|
|
- "scripts/common.py"
|
|
- "scripts/cross_reference.py"
|
|
- "scripts/crypto_verify.py"
|
|
- "scripts/derivations.py"
|
|
- "scripts/dedup.py"
|
|
- "scripts/deterministic_zip.py"
|
|
- "scripts/dumpcatalog.py"
|
|
- "scripts/exporter/baseline.py"
|
|
- "scripts/exporter/candidates.py"
|
|
- "scripts/gamedata.py"
|
|
- "scripts/generate_event_schema.py"
|
|
- "scripts/generate_pack.py"
|
|
- "scripts/generate_readme.py"
|
|
- "scripts/generate_site.py"
|
|
- "scripts/hashing.py"
|
|
- "scripts/indexnow.py"
|
|
- "scripts/largefiles.py"
|
|
- "scripts/launchers.py"
|
|
- "scripts/manifestselect.py"
|
|
- "scripts/measurement_records.py"
|
|
- "scripts/nativemode.py"
|
|
- "scripts/packextras.py"
|
|
- "scripts/packpaths.py"
|
|
- "scripts/packreadme.py"
|
|
- "scripts/packresolve.py"
|
|
- "scripts/packverify.py"
|
|
- "scripts/pr_checks.py"
|
|
- "scripts/provenance_report.py"
|
|
- "scripts/refresh_data_dirs.py"
|
|
- "scripts/region.py"
|
|
- "scripts/release_record.py"
|
|
- "scripts/restore_large_files.py"
|
|
- "scripts/safeparse.py"
|
|
- "scripts/sect233r1.py"
|
|
- "scripts/siteagents.py"
|
|
- "scripts/site_markdown.py"
|
|
- "scripts/sitebootstrap.py"
|
|
- "scripts/sitecollection.py"
|
|
- "scripts/sitediagrams.py"
|
|
- "scripts/siteentries.py"
|
|
- "scripts/siteguides.py"
|
|
- "scripts/siteinputs.py"
|
|
- "scripts/sitemarkup.py"
|
|
- "scripts/sitemeasurements.py"
|
|
- "scripts/siteexports.py"
|
|
- "scripts/siterender.py"
|
|
- "scripts/retired_files.py"
|
|
- "scripts/romset_recipes.py"
|
|
- "scripts/sitesources.py"
|
|
- "scripts/sitesteps.py"
|
|
- "scripts/sitestarlight.py"
|
|
- "scripts/sitewrite.py"
|
|
- "scripts/slot.py"
|
|
- "scripts/slots.py"
|
|
- "scripts/sourceref.py"
|
|
- "scripts/split_pack.py"
|
|
- "scripts/torrentzip.py"
|
|
- "scripts/truth.py"
|
|
- "scripts/upstream.py"
|
|
- "scripts/validate_pr.py"
|
|
- "scripts/validate_schemas.py"
|
|
- "scripts/validate_site.py"
|
|
- "scripts/validation.py"
|
|
- "scripts/verify.py"
|
|
- "scripts/ziptools.py"
|
|
- "schemas/**"
|
|
- "docs_assets/**"
|
|
- "install/**"
|
|
# The site serves install.sh and install.ps1 pinned to install.py
|
|
# of the commit it is built from (scripts/sitebootstrap.py).
|
|
- "install.py"
|
|
- "install.sh"
|
|
- "install.ps1"
|
|
- "database.json"
|
|
- "release.json"
|
|
- "derivable.json"
|
|
- "retired.json"
|
|
# The README and the archive recipes page count the recipes.
|
|
- "recipes/archives.json"
|
|
- "measurements/**"
|
|
# The Proof lines of the emulator pages read what an issue's runs showed.
|
|
- "tests/campaign/observations.yml"
|
|
# The Starlight project: config, components, styles, lockfile. Its
|
|
# generated folders are gitignored and never trigger anything.
|
|
- "website/**"
|
|
- ".github/workflows/deploy-site.yml"
|
|
# The contributing guide quotes the pip lines of its test job.
|
|
- ".github/workflows/validate.yml"
|
|
workflow_dispatch:
|
|
|
|
permissions:
|
|
contents: read
|
|
pages: write
|
|
id-token: write
|
|
|
|
concurrency:
|
|
# Pages deployments must run to completion: cancelling one mid-flight
|
|
# leaves the deployment stuck and makes the next runs time out waiting
|
|
# on it. Queued runs collapse to the latest instead.
|
|
group: pages
|
|
cancel-in-progress: false
|
|
|
|
jobs:
|
|
build:
|
|
runs-on: ubuntu-latest
|
|
outputs:
|
|
indexnow: ${{ steps.indexnow.outputs.payload }}
|
|
# Node's compile cache writes under /tmp on every node run, the build
|
|
# and the search gate alike.
|
|
env:
|
|
NODE_DISABLE_COMPILE_CACHE: "1"
|
|
steps:
|
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
|
|
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
|
|
with:
|
|
python-version: "3.12"
|
|
|
|
- run: pip install pyyaml "jsonschema[format-nongpl]==4.26.0"
|
|
|
|
# Node builds the site only: the scripts stay Python. The engine and
|
|
# its plugins are pinned exactly in website/package.json and resolved
|
|
# from the committed lockfile.
|
|
- uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
|
|
with:
|
|
node-version: "24"
|
|
cache: npm
|
|
cache-dependency-path: website/package-lock.json
|
|
|
|
- run: npm ci --prefix website
|
|
|
|
- name: Validate data contracts
|
|
run: python scripts/validate_schemas.py
|
|
|
|
# Coverage is resolved against the disk, so a checkout without the
|
|
# release assets and the data caches reports files as missing and the
|
|
# generated README stops matching the committed one.
|
|
- name: Restore large files from release
|
|
run: |
|
|
mkdir -p .cache/large
|
|
gh release download large-files -D .cache/large/ 2>/dev/null || true
|
|
python scripts/restore_large_files.py
|
|
env:
|
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
- name: Refresh data directories
|
|
run: python scripts/refresh_data_dirs.py
|
|
|
|
- name: Generate site
|
|
run: |
|
|
python scripts/generate_site.py
|
|
python scripts/generate_readme.py --db database.json --platforms-dir platforms
|
|
# starlight-links-validator fails the build on a dead link or anchor.
|
|
npm run build --prefix website
|
|
python scripts/validate_site.py --site-dir website/dist
|
|
|
|
# The one-liner the site serves: each copy pins its own installer and
|
|
# says what a refusal means for it. Validation runs these too, but in
|
|
# another workflow this one never waits for: a copy that refuses every
|
|
# install must stop the deploy, the last good pair staying served.
|
|
- name: Check the served bootstraps
|
|
run: python -m unittest tests.test_site_bootstrap
|
|
|
|
# The queries a visitor types must reach the page that answers them,
|
|
# read through the site's own search box, and the home page must stay
|
|
# under its weight budget. A miss blocks the deploy. The browser driver
|
|
# is not a dependency of the build: pinned here, not saved to the
|
|
# lockfile, and it drives the Chrome the runner image ships.
|
|
- name: Search gate
|
|
run: |
|
|
npm install --no-save --prefix website playwright-core@1.58.0
|
|
python website/tools/search_gate.py --site-dir website/dist
|
|
|
|
# write_if_changed() compares content with its timestamp line stripped,
|
|
# so a run that only moves the clock leaves the file untouched and this
|
|
# stays a real staleness check rather than a guaranteed failure.
|
|
- name: Require committed README and CONTRIBUTING to be current
|
|
run: git diff --exit-code -- README.md CONTRIBUTING.md
|
|
|
|
# The pages whose words this deploy changes, read against the
|
|
# digests the live site still serves. A failure here only loses the
|
|
# notice: search engines find the pages on their next visit.
|
|
- name: List the pages this deploy changes
|
|
id: indexnow
|
|
continue-on-error: true
|
|
run: python scripts/indexnow.py --dist website/dist --output "$GITHUB_OUTPUT"
|
|
|
|
- name: Setup Pages
|
|
uses: actions/configure-pages@45bfe0192ca1faeb007ade9deae92b16b8254a0d # v6
|
|
|
|
- name: Upload artifact
|
|
uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5
|
|
with:
|
|
path: website/dist/
|
|
|
|
deploy:
|
|
needs: build
|
|
runs-on: ubuntu-latest
|
|
environment:
|
|
name: github-pages
|
|
url: ${{ steps.deployment.outputs.page_url }}
|
|
steps:
|
|
- name: Deploy to GitHub Pages
|
|
id: deployment
|
|
uses: actions/deploy-pages@368f82528645a54fb793d4d04e342629a3f51346 # v5.0.1
|
|
|
|
# IndexNow: Bing, Yandex, Seznam and Naver fetch the listed pages
|
|
# soon after, so an assistant searching through them reads this build.
|
|
- name: Tell search engines which pages changed
|
|
if: needs.build.outputs.indexnow != ''
|
|
continue-on-error: true
|
|
env:
|
|
PAYLOAD: ${{ needs.build.outputs.indexnow }}
|
|
run: |
|
|
code=$(curl -sS -o /dev/null -w '%{http_code}' -X POST \
|
|
-H 'Content-Type: application/json; charset=utf-8' \
|
|
--data "$PAYLOAD" https://api.indexnow.org/indexnow)
|
|
echo "IndexNow answered $code"
|
|
case "$code" in 200|202) ;; *) echo "::warning::IndexNow answered $code"; exit 1 ;; esac
|