Skip to content

Commit 4ac323d

Browse files
oschwaldclaude
andcommitted
Add lychee link checker config and CI workflow
Adds a lychee configuration and a Links GitHub Actions workflow so that stale or redirecting links are caught automatically going forward. The checker runs on push, pull request, and weekly to catch external link rot. max_redirects is 0 so links that have moved are surfaced and can be updated to their canonical destination. Part of STF-557. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent edc022b commit 4ac323d

3 files changed

Lines changed: 100 additions & 0 deletions

File tree

.github/workflows/links.yml

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
name: Links
2+
3+
on:
4+
push:
5+
pull_request:
6+
schedule:
7+
- cron: "0 13 * * 1" # weekly, to catch external link rot without a commit
8+
workflow_dispatch:
9+
10+
permissions: {}
11+
12+
jobs:
13+
linkChecker:
14+
runs-on: ubuntu-latest
15+
permissions:
16+
issues: write # required for peter-evans/create-issue-from-file
17+
steps:
18+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
19+
with:
20+
persist-credentials: false
21+
22+
- name: Link Checker
23+
id: lychee
24+
uses: lycheeverse/lychee-action@885c65f3dc543b57c898c8099f4e08c8afd178a2 # v2.7.0
25+
with:
26+
fail: true
27+
args: "'./**/*.md' './src/**/*.java' './pom.xml'"
28+
29+
- name: Create Issue From File
30+
if: github.event_name == 'schedule' && steps.lychee.outputs.exit_code != 0
31+
uses: peter-evans/create-issue-from-file@fca9117c27cdc29c6c4db3b86c48e4115a786710 # v6.0.0
32+
with:
33+
title: Link Checker Report
34+
content-filepath: ./lychee/out.md
35+
labels: report, automated issue

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,4 @@ pom.xml.versionsBackup
2020
target
2121
reports
2222
Test.java
23+
.lycheecache

lychee.toml

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# Lychee link checker configuration
2+
# https://lychee.cli.rs/#/usage/config
3+
#
4+
# Run locally with:
5+
# lychee './**/*.md' './src/**/*.java' './pom.xml'
6+
7+
# Include URL fragments in checks
8+
include_fragments = true
9+
10+
# Don't allow any redirects, so links that have moved are surfaced and updated
11+
# to their canonical destination.
12+
max_redirects = 0
13+
14+
# Accept these HTTP status codes
15+
# 100-103: Informational responses
16+
# 200-299: Success responses
17+
# 403: Forbidden (some sites use this for rate limiting)
18+
# 429: Too Many Requests
19+
# 500-599: Server errors (temporary issues shouldn't fail CI)
20+
# 999: LinkedIn's custom status code
21+
accept = ["100..=103", "200..=299", "403", "429", "500..=599", "999"]
22+
23+
# Exclude URL patterns from checking (treated as regular expressions)
24+
exclude = [
25+
'^file://',
26+
# Live / auth-gated endpoints that appear as string literals or require login
27+
'^https://geoip\.maxmind\.com',
28+
'^https://geolite\.info',
29+
'^https://minfraud\.maxmind\.com',
30+
'^https://sandbox\.maxmind\.com',
31+
'^https://updates\.maxmind\.com',
32+
'^https://www\.maxmind\.com/en/accounts/',
33+
'https://www\.maxmind\.com/en/account/login',
34+
# XML namespace identifiers in pom.xml (not real links)
35+
'^http://www\.w3\.org/',
36+
'^http://maven\.apache\.org/',
37+
'^https://maven\.apache\.org/xsd/',
38+
'^http://java\.sun\.com/',
39+
'^http://schemas\.',
40+
# Maven property placeholder in a build-time download URL (not a real link)
41+
'japicmp\.baselineVersion',
42+
# Placeholders / local
43+
'^https?://example\.(com|org|net)',
44+
'^http://localhost',
45+
'127\.0\.0\.1',
46+
]
47+
48+
# Exclude file paths from getting checked (treated as regular expressions)
49+
exclude_path = [
50+
'node_modules',
51+
'target',
52+
'\.git',
53+
# Test fixtures (MaxMind-DB submodule) contain example URLs, not ours
54+
'src/test/resources',
55+
# Changelog: historical entries are preserved as-is, not rewritten
56+
'CHANGELOG\.md',
57+
]
58+
59+
# Cache results for 1 day to speed up repeated checks
60+
cache = true
61+
max_cache_age = "1d"
62+
63+
# Skip missing input files instead of erroring
64+
skip_missing = true

0 commit comments

Comments
 (0)