name: Markdown Links on: pull_request: branches: [main, develop] paths: - "**/*.md" - "scripts/check-markdown-links.mjs" - ".github/workflows/markdown-links.yml" push: branches: [main, develop] paths: - "**/*.md" - "scripts/check-markdown-links.mjs" - ".github/workflows/markdown-links.yml" workflow_dispatch: # CI fan-out fix: the PR-scoped concurrency from #14069 fell back to # github.run_id on push, so every develop push got a unique group and # nothing ever superseded. A 37-merge wave queued thousands of push runs # and starved the self-hosted fleet. Fall back to github.ref (all develop # pushes share a group) and cancel superseded runs on push too. PR behavior # is unchanged (pull_request.number still wins the key); merge_group and # schedule events are not in the cancel set, so the merge queue and nightly # runs always complete. concurrency: group: markdown-links-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: ${{ github.event_name == 'pull_request' || github.event_name == 'push' }} permissions: contents: read jobs: relative-links: name: Relative Markdown Links runs-on: ${{ fromJSON(vars.HETZNER_FLEET_ONLINE == 'false' && '["ubuntu-24.04"]' || '["self-hosted","hetzner-robot"]') }} timeout-minutes: 5 steps: - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 with: submodules: false - name: Setup Node.js uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e with: node-version: "24.15.0" - name: Check relative Markdown links run: node scripts/check-markdown-links.mjs