Skip to content

chore(deps)(deps-dev): bump @boring-stack-pkg/eslint-plugin-test-conventions from 0.1.1 to 0.1.2 in /apps/api #154

chore(deps)(deps-dev): bump @boring-stack-pkg/eslint-plugin-test-conventions from 0.1.1 to 0.1.2 in /apps/api

chore(deps)(deps-dev): bump @boring-stack-pkg/eslint-plugin-test-conventions from 0.1.1 to 0.1.2 in /apps/api #154

name: docs-linkcheck
# Builds the BoringStack docs site and runs lychee against the built output.
# Internal broken links fail the job; external 4xx/5xx are warnings only
# (rate-limited APIs and intermittent third-party 503s are not the docs'
# problem to solve at PR-review time).
on:
push:
branches: [main]
paths:
- "apps/docs/src/**"
- "apps/docs/scripts/**"
- "apps/docs/astro.config.mjs"
- "apps/docs/package.json"
- "apps/docs/bun.lock"
- ".github/workflows/apps-docs-linkcheck.yml"
# PR trigger has NO `paths:` filter — the `linkcheck` check is in
# branch protection's required-checks list, so the workflow must run
# on every PR or branch protection will wait forever for a status
# that never comes ("Expected — Waiting for status to be reported").
# The expensive build + lychee steps are gated on the internal
# paths-filter below, so PRs that don't touch docs report green
# without doing any real work.
pull_request: {}
workflow_dispatch:
permissions:
contents: read
concurrency:
group: apps-docs-linkcheck-docs-${{ github.ref }}
cancel-in-progress: true
jobs:
linkcheck:
defaults:
run:
working-directory: apps/docs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Detect docs changes
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
id: filter
with:
filters: |
docs:
- 'apps/docs/src/**'
- 'apps/docs/scripts/**'
- 'apps/docs/astro.config.mjs'
- 'apps/docs/package.json'
- 'apps/docs/bun.lock'
- '.github/workflows/apps-docs-linkcheck.yml'
- name: No-op notice for non-docs PRs
if: steps.filter.outputs.docs != 'true'
run: echo "No docs files changed in this PR — link check skipped."
- uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0
if: steps.filter.outputs.docs == 'true'
with:
bun-version: 1.3.14
- name: Install docs deps
if: steps.filter.outputs.docs == 'true'
run: bun install --frozen-lockfile
- name: Install apps/ui deps for lint-meta export
if: steps.filter.outputs.docs == 'true'
working-directory: apps/ui
run: bun install --frozen-lockfile
- name: Install apps/api deps for lint-meta export
if: steps.filter.outputs.docs == 'true'
working-directory: apps/api
run: bun install --frozen-lockfile
- name: Verify generated docs data
if: steps.filter.outputs.docs == 'true'
env:
BORINGSTACK_UI_DIR: ${{ github.workspace }}/apps/ui
BORINGSTACK_API_DIR: ${{ github.workspace }}/apps/api
run: bun run check:docs-data
- name: Build docs site
if: steps.filter.outputs.docs == 'true'
env:
BORINGSTACK_UI_DIR: ${{ github.workspace }}/apps/ui
BORINGSTACK_API_DIR: ${{ github.workspace }}/apps/api
run: bun run build:ci
- name: Internal link check (fail on broken)
if: steps.filter.outputs.docs == 'true'
uses: lycheeverse/lychee-action@8646ba30535128ac92d33dfc9133794bfdd9b411 # v2.8.0
with:
args: >-
--no-progress
--offline
--root-dir ${{ github.workspace }}/apps/docs/dist
'${{ github.workspace }}/apps/docs/dist/**/*.html'
fail: true
- name: External link check (warning only)
if: steps.filter.outputs.docs == 'true'
uses: lycheeverse/lychee-action@8646ba30535128ac92d33dfc9133794bfdd9b411 # v2.8.0
continue-on-error: true
with:
args: >-
--no-progress
--root-dir ${{ github.workspace }}/apps/docs/dist
--exclude-path './llms-full.txt'
--exclude-path './llms-small.txt'
--exclude '^https?://(localhost|127\.0\.0\.1|.*\.localhost)'
--exclude 'github\.com/boringstack-xyz/.*/(blob|tree)/'
'${{ github.workspace }}/apps/docs/dist/**/*.html'
fail: false
env:
# Authenticate github.com link checks so lychee uses the GitHub API
# (5000 req/h) instead of anonymous requests (60 req/h). Without this,
# every github.com link hits the rate limit and lychee sits in a
# multi-minute backoff — the "unexpectedly big rate limit backoff" warns
# that dragged this step to ~4m. Needs only the default contents:read.
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}