This is an automated email from the ASF dual-hosted git repository. rusackas pushed a commit to branch chore/lychee-link-checker in repository https://gitbox.apache.org/repos/asf/superset.git
commit 0ebad1bb7ca17cb54d5278824b7565385958f9d7 Author: Superset Dev <[email protected]> AuthorDate: Mon Jul 27 21:48:25 2026 -0700 chore(ci): swap linkinator-action for lychee-action in docs link checker lychee (Rust, lycheeverse/lychee-action) replaces JustinBeckwith/linkinator-action for the "Link Checking" job in superset-docs-verify.yml: - Pin to lychee-action v2.9.0 (e7477775783ea5526144ba13e8db5eec57747ce8). - Port all 24 linksToSkip regex patterns 1:1 to --exclude flags (verified by diffing the parsed pattern lists programmatically, not just by eye). - Wire up real caching: an actions/cache step persists .lycheecache (lychee's on-disk request cache, enabled via --cache) across runs, keyed on github.run_id with a prefix restore-key so every run saves fresh while always restoring the nearest prior cache; --max-cache-age 7d keeps entries from going stale forever. linkinator-action has no equivalent — every run re-checked every external link from scratch. - Keep the job fully advisory like before: continue-on-error: true plus lychee-action's own fail: false input. - Job key renamed linkinator -> lychee; the display name ("Link Checking") is unchanged, so this shouldn't affect any branch protection rule matching on it. Validated locally: zizmor clean, YAML parses, and the rendered `args` string was run through eval (matching lychee-action's entrypoint.sh) to confirm every regex round-trips as a single argv token with parens/ pipes/backslashes intact. Note: .mdx files aren't natively parsed by lychee (HTML/Markdown only); it falls back to best-effort linkify-based extraction for them, same as any other non-html/md format. Worth an eye on the first few runs to see if that changes what gets caught relative to linkinator's mdx handling. Per an existing repo convention (see the comment this replaces), bumping or replacing this action requires an ASF Infra ticket to allowlist it org-side before it can actually execute in CI. Co-Authored-By: Claude Fable 5 <[email protected]> --- .github/workflows/superset-docs-verify.yml | 73 ++++++++++++++++++------------ 1 file changed, 43 insertions(+), 30 deletions(-) diff --git a/.github/workflows/superset-docs-verify.yml b/.github/workflows/superset-docs-verify.yml index aaa84245f95..d5d76158605 100644 --- a/.github/workflows/superset-docs-verify.yml +++ b/.github/workflows/superset-docs-verify.yml @@ -21,8 +21,8 @@ permissions: contents: read jobs: - linkinator: - # See docs here: https://github.com/marketplace/actions/linkinator + lychee: + # See docs here: https://github.com/lycheeverse/lychee-action # Only run on pull_request, not workflow_run if: github.event_name == 'pull_request' name: Link Checking @@ -31,37 +31,50 @@ jobs: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - # Do not bump this linkinator-action version without opening + # Restores the on-disk request cache (.lycheecache) lychee writes when + # `--cache` is set, so re-runs don't re-check every external link from + # scratch. Key never matches exactly (github.run_id is unique per run), + # so actions/cache always saves a fresh copy afterwards; restore-keys + # falls back to the most recent prior cache on lookup. + - uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: .lycheecache + key: lychee-cache-${{ github.run_id }} + restore-keys: lychee-cache- + # Do not bump this lychee-action version without opening # an ASF Infra ticket to allow the new version first! - - uses: JustinBeckwith/linkinator-action@af984b9f30f63e796ae2ea5be5e07cb587f1bbd9 # v2.3 + - uses: lycheeverse/lychee-action@e7477775783ea5526144ba13e8db5eec57747ce8 # v2.9.0 continue-on-error: true # This will make the job advisory (non-blocking, no red X) with: - paths: "**/*.md, **/*.mdx" - linksToSkip: >- - ^https://github.com/apache/(superset|incubator-superset)/(pull|issues)/\d+, - ^https://github.com/apache/(superset|incubator-superset)/commit/[a-f0-9]+, - superset-frontend/.*CHANGELOG\.md, - http://localhost:8088/, - http://127.0.0.1:3000/, - http://localhost:9001/, - https://charts.bitnami.com/bitnami, - https://www.li.me/, - https://www.fanatics.com/, - https://tails.com/gb/, - https://www.techaudit.info/, - https://avetilearning.com/, - https://www.udemy.com/, - https://trustmedis.com/, - http://theiconic.com.au/, - https://dev.mysql.com/doc/refman/5.7/en/innodb-limits.html, - ^https://img\.shields\.io/.*, - https://vkusvill.ru/, - https://www.linkedin.com/in/mark-thomas-b16751158/, - https://theiconic.com.au/, - https://wattbewerb.de/, - https://timbr.ai/, - https://opensource.org/license/apache-2-0, - https://www.plaidcloud.com/ + fail: false + args: >- + --verbose --no-progress + --cache --max-cache-age 7d + --exclude '^https://github.com/apache/(superset|incubator-superset)/(pull|issues)/\d+' + --exclude '^https://github.com/apache/(superset|incubator-superset)/commit/[a-f0-9]+' + --exclude 'superset-frontend/.*CHANGELOG\.md' + --exclude 'http://localhost:8088/' + --exclude 'http://127.0.0.1:3000/' + --exclude 'http://localhost:9001/' + --exclude 'https://charts.bitnami.com/bitnami' + --exclude 'https://www.li.me/' + --exclude 'https://www.fanatics.com/' + --exclude 'https://tails.com/gb/' + --exclude 'https://www.techaudit.info/' + --exclude 'https://avetilearning.com/' + --exclude 'https://www.udemy.com/' + --exclude 'https://trustmedis.com/' + --exclude 'http://theiconic.com.au/' + --exclude 'https://dev.mysql.com/doc/refman/5.7/en/innodb-limits.html' + --exclude '^https://img\.shields\.io/.*' + --exclude 'https://vkusvill.ru/' + --exclude 'https://www.linkedin.com/in/mark-thomas-b16751158/' + --exclude 'https://theiconic.com.au/' + --exclude 'https://wattbewerb.de/' + --exclude 'https://timbr.ai/' + --exclude 'https://opensource.org/license/apache-2-0' + --exclude 'https://www.plaidcloud.com/' + './**/*.md' './**/*.mdx' build-on-pr: # Build docs when PR changes docs/** (uses committed databases.json)
