Skip to content

Releases: QuantEcon/action-link-checker

v1.2.0 — the action's steps move to Node 24

Choose a tag to compare

@mmcky mmcky released this 18 Sep 10:28
9ba86af

Moves the action's own steps onto Node 24. Node 20 reached end-of-life on 2026-04-30. No input, output or script changes, so a workflow pinned to QuantEcon/action-link-checker@v1 keeps working as it is, and v1 now follows this release.

Node 24

actions/github-script moves from v7 to v9 (three steps) and actions/upload-artifact from v4 to v7, both of which run on Node 24.

GitHub-hosted runners already meet the one new requirement. A self-hosted runner needs v2.327.1 or later to run the new pins.

This repository's own CI

These changes affect contributors to the action, not workflows that use it.

CI now serves its fixtures from 127.0.0.1, so no gating step depends on the public internet. A clean page, a followed redirect, a reported error status and that status silenced by silent-codes are each asserted end to end against responses under our control. The scans of good-links.html and broken-links.html remain as informational smoke that cannot turn CI red, and they no longer post a comment on pull requests, since their findings are true by construction.

A new check-own-docs job renders this repository's Markdown and checks the links in it. It is the only job that comments on a pull request, and only when a link we publish is reported broken; it runs with silent-codes: '0,403,503' so a transient failure stays quiet. On its first run it found the README's Marketplace badge linking to a page that returns 404 (the action was never published there), which is fixed.

CI itself moves to actions/checkout v7 and actions/setup-python v7, with a grouped weekly Dependabot config for GitHub Actions so the pins do not fall behind again.

Pinned to an exact version?

A workflow pinned to @v1.1.0 rather than @v1 stays on Node 20 until it moves to @v1.2.0. Dependabot proposes that bump where it is configured for GitHub Actions.

Full changelog: https://github.com/QuantEcon/action-link-checker/blob/v1.2.0/CHANGELOG.md

v1.1.0 — ignore-patterns, issue reuse, and the unreachable timeout path

Choose a tag to compare

@mmcky mmcky released this 03 Aug 06:14
39255b1

First published release of this action. It adds two inputs aimed at the same problem — a link checker whose reports had become noise — and fixes the bugs underneath that made the existing false-positive handling unreachable.

Pin it as QuantEcon/action-link-checker@v1, which now exists as a moving tag and will follow the 1.x line.

ignore-patterns

A newline-separated list of regular expressions for URLs to skip entirely:

- uses: QuantEcon/action-link-checker@v1
  with:
    html-path: '_build/html'
    ignore-patterns: |
      https://fred\.stlouisfed\.org/.*
      linkedin\.com

Matching URLs are never requested, so they can be reported as neither broken nor redirected — an explicit exemption rather than a suppressed finding. They are counted separately and exposed as a new ignored-count output, so an exemption stays visible instead of silently shrinking the scanned set.

Newline-separated rather than comma-separated so that quantifiers such as {1,3} survive unsplit, and matched with re.search, so a bare domain works as a substring without anchoring and a Sphinx linkcheck_ignore list can be pasted in almost unchanged. Note that Sphinx anchors its patterns at the start of the URL while this matches anywhere, so an imported pattern may match slightly more here.

update-existing-issue

Defaults to true. Before creating an issue, the action looks for the newest open issue with the same title and the broken-links label and refreshes its body instead of opening a duplicate. A weekly cron on a persistent finding now produces one issue rather than one per week. Close it once the links are fixed and a recurrence opens a fresh one. A new issue-updated output reports which path was taken.

This is a behaviour change for anyone already running create-issue: 'true'. Set update-existing-issue: 'false' to restore the previous behaviour. Note that GitHub does not send notifications for an edit to an issue body, so a refreshed report is quiet by design — watch the scheduled workflow if you want to be told about every run. If a repository runs more than one link check, give each workflow its own issue-title, or they will overwrite each other's report.

Fixes

is_likely_bot_blocked() exists to absorb exactly the class of false positive above, but it could never fire on a timeout. The legitimate_domains allowance required the error string Connection Error while the timeout handler passed timeout, so a listed domain was protected against one failure mode and reported broken on the other. silent-codes was only consulted on responses that carried a status code, so it could not apply to a timeout or a connection error either. Both are fixed, and the allowance is now keyed on which handler caught the failure rather than on the error text.

Status 0 can now be listed in silent-codes, but only for genuine transport failures — timeout, connection failure, or a response broken mid-stream. A malformed link such as https:// and a redirect loop also report status 0 and stay reported however silent-codes is set, since those are the project's own to fix.

Several fail-quiet paths are also closed. An invalid ignore pattern could abort the whole run rather than be skipped as documented, because re.compile raises OverflowError and RecursionError in addition to re.error. The checker's stderr was written to a file that was never displayed, so none of its warnings could reach a job log. A crash aborted the step with no diagnostic at all. Multi-line outputs used a fixed EOF delimiter that scanned link text could terminate early.

Testing

The test suite previously could not fail — the runner never inspected its result — and one of its two files could not even import the module under test. Both are fixed and both now run in CI, and the fixtures no longer depend on httpstat.us or httpbin.org, which had stopped answering and left the CI step named for silent-codes exercising nothing.

A note on v1.0.0

The v1.0.0 tag points at this repository's initial commit and no release was ever published for it. It is left where it is rather than moved. Pin v1 or v1.1.0.

Full changelog: https://github.com/QuantEcon/action-link-checker/blob/v1.1.0/CHANGELOG.md