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)

Reply via email to