Skip to content

Workflow changes to add automated link checking#428

Open
Copilot wants to merge 17 commits intomainfrom
copilot/update-workflow-file-feedback
Open

Workflow changes to add automated link checking#428
Copilot wants to merge 17 commits intomainfrom
copilot/update-workflow-file-feedback

Conversation

Copy link
Contributor

Copilot AI commented Feb 23, 2026

Use lychee to add a broken external link checker workflow. Also addresses all workflow-related review feedback from PR #424.

check-links.yml (new)

  • Triggers on pull_request (paths: **.md, docs/**, and the workflow file itself) and workflow_dispatch
  • Posts/updates a single PR comment with results; job summary only when run manually — no issue management
  • Excludes: localhost, fortuneservice, *.internal, consul-register-example, docker://; paths .git, docs/api
  • --max-concurrency 5, --retry-wait-time 15, --max-retries 6, --timeout 30
  • Post-run steps use if: ${{ !cancelled() }}; lychee's built-in # Summary heading replaced with # Link checking results
  • Checkout step: name: Git checkout, persist-credentials: false

💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.

Co-authored-by: TimHess <3947063+TimHess@users.noreply.github.com>
Copilot AI changed the title [WIP] Update workflow file with feedback adjustments Add check-links workflow with all feedback from PR #424 applied Feb 23, 2026
Copilot AI requested a review from TimHess February 23, 2026 14:46
@TimHess TimHess changed the title Add check-links workflow with all feedback from PR #424 applied Add check-links workflow Feb 23, 2026
…and-stage.yml

Co-authored-by: TimHess <3947063+TimHess@users.noreply.github.com>
Copilot AI changed the title Add check-links workflow Add check-links workflow with all review feedback addressed Feb 23, 2026
@github-actions

This comment was marked as outdated.

@TimHess TimHess requested a review from bart-vmware February 23, 2026 16:33
@github-actions
Copy link

Preview link: https://www-steeltoe-pr-428.azurewebsites.net

  • Your changes have been deployed to the preview site. The preview site will update as you add more commits to this branch.
  • The preview link is shareable, but will be deleted when the pull request is merged or closed.

This is an automated message.

@TimHess TimHess changed the title Add check-links workflow with all review feedback addressed Workflow changes to add automated link checking Feb 23, 2026
…cfx files

- ignore razor routes from static file checking
- alter root-dir to avoid errors with asset links
- drop changes to build-and-stage
- replace .ps1 with equivalent of check-links.yml
@github-actions
Copy link

github-actions bot commented Feb 24, 2026

External link checking results

Status Count
🔍 Total 1922
✅ Successful 758
⏳ Timeouts 0
🔀 Redirected 298
👻 Excluded 804
❓ Unknown 0
🚫 Errors 62
⛔ Unsupported 0

Errors per input

Errors in docs/api/v2/index.md

Errors in docs/api/v3/index.md

Errors in docs/api/v4/index.md

Errors in docs/articles/create-dotnet-microservice-projects-automatically-with-steeltoe-initializr.md

Errors in docs/articles/releases/steeltoe-2-2-gives-your--microservices-a-boost.md

Errors in docs/articles/releases/steeltoe-3-0-packs-a-mighty-punch-with-many-new-features.md

Errors in docs/articles/tech-tutorial-use-kubernetes-for-modern-net-apps-steeltoe-and-project-tye-are-your-path-to-productivity.md

Errors in docs/docs/v2/connectors/gemfire.md

Errors in docs/docs/v2/connectors/mysql.md

Errors in docs/docs/v2/connectors/redis.md

Errors in docs/docs/v2/logging/dynamic-logging-provider.md

Errors in docs/docs/v2/management/metrics.md

Errors in docs/docs/v2/management/using-endpoints.md

Errors in docs/docs/v2/security/credhub-api-client.md

Errors in docs/docs/v2/security/jwt-authentication-in-asp.NET-WebAPI.md

Errors in docs/docs/v2/security/sso-open-id.md

Errors in docs/docs/v3/configuration/config-server-provider.md

Errors in docs/docs/v3/configuration/kubernetes-providers.md

Errors in docs/docs/v3/connectors/mysql.md

Errors in docs/docs/v3/connectors/redis.md

Errors in docs/docs/v3/discovery/kubernetes.md

Errors in docs/docs/v3/discovery/netflix-eureka.md

Errors in docs/docs/v3/logging/dynamic-logging-provider.md

Errors in docs/docs/v3/messaging/rabbitmq-reference.md

Errors in docs/docs/v3/security/credhub-api-client.md

Errors in docs/docs/v3/stream/index.md

Errors in docs/docs/v3/stream/rabbit-binder.md

Errors in docs/docs/v3/stream/standalone-stream-rabbitmq.md

Errors in docs/docs/v4/connectors/cosmosdb.md

Errors in docs/docs/v4/connectors/mysql.md

Errors in docs/docs/v4/connectors/postgresql.md

Errors in docs/docs/v4/discovery/initialize-discovery-client.md

Errors in docs/docs/v4/fileshares/index.md

Errors in docs/docs/v4/management/cloud-foundry.md

Errors in docs/docs/v4/management/loggers.md

Errors in docs/docs/v4/management/prometheus.md

Errors in docs/guides/messaging/Tutorials/Tutorial1/Readme.md

Errors in docs/guides/messaging/Tutorials/Tutorial5/Readme.md

Errors in docs/guides/observability/wavefront.md

Redirects per input

Redirects in AGENTS.md

Redirects in docs/api/v2/index.md

Redirects in docs/api/v3/index.md

Redirects in docs/api/v4/index.md

Redirects in docs/articles/index.md

Redirects in docs/articles/pivotal-contributes-steeltoe-to-the-net-foundation.md

Redirects in docs/articles/releases/steeltoe-2-1-boosts-your-net-microservices-with-actuator-endpoints-distributed-tracing-and-deeper-support-for-the-frameworks-that-matter.md

Redirects in docs/articles/releases/steeltoe-2-2-gives-your--microservices-a-boost.md

Redirects in docs/articles/releases/steeltoe-2-4-boosts-dotnet-microservices-development.md

Redirects in docs/articles/releases/steeltoe-3-0-packs-a-mighty-punch-with-many-new-features.md

Redirects in docs/articles/releases/steeltoe-turns-2-0-adds-support-for-asp-net-core-2-0-credhub-and-a-sql-server-connector.md

Redirects in docs/articles/tech-tutorial-use-kubernetes-for-modern-net-apps-steeltoe-and-project-tye-are-your-path-to-productivity.md

Redirects in docs/docs/v2/circuitbreaker/hystrix.md

Redirects in docs/docs/v2/circuitbreaker/index.md

Redirects in docs/docs/v2/configuration/cloud-foundry-provider.md

Redirects in docs/docs/v2/configuration/config-server-provider.md

Redirects in docs/docs/v2/configuration/index.md

Redirects in docs/docs/v2/configuration/placeholder-provider.md

Redirects in docs/docs/v2/configuration/random-value-provider.md

Redirects in docs/docs/v2/connectors/cosmosdb.md

Redirects in docs/docs/v2/connectors/gemfire.md

Redirects in docs/docs/v2/connectors/microsoft-sql-server.md

Redirects in docs/docs/v2/connectors/mongodb.md

Redirects in docs/docs/v2/connectors/mysql.md

Redirects in docs/docs/v2/connectors/oauth.md

Redirects in docs/docs/v2/connectors/postgresql.md

Redirects in docs/docs/v2/connectors/rabbitmq.md

Redirects in docs/docs/v2/connectors/redis.md

Redirects in docs/docs/v2/developer-tools/cli.md

Redirects in docs/docs/v2/discovery/discovering-services.md

Redirects in docs/docs/v2/discovery/hashicorp-consul.md

Redirects in docs/docs/v2/discovery/netflix-eureka.md

Redirects in docs/docs/v2/fileshares/index.md

Redirects in docs/docs/v2/fileshares/usage.md

Redirects in docs/docs/v2/logging/dynamic-logging-provider.md

Redirects in docs/docs/v2/logging/index.md

Redirects in docs/docs/v2/management/dump.md

Redirects in docs/docs/v2/management/health.md

Redirects in docs/docs/v2/management/heapdump.md

Redirects in docs/docs/v2/management/info.md

Redirects in docs/docs/v2/management/metrics.md

Redirects in docs/docs/v2/management/prometheus.md

Redirects in docs/docs/v2/management/using-endpoints.md

Redirects in docs/docs/v2/security/credhub-api-client.md

Redirects in docs/docs/v2/security/index.md

Redirects in docs/docs/v2/security/jwt-authentication-in-asp.NET-core.md

Redirects in docs/docs/v2/security/jwt-authentication-in-asp.NET-WCF.md

Redirects in docs/docs/v2/security/jwt-authentication-in-asp.NET-WebAPI.md

Redirects in docs/docs/v2/security/sso-oauth2.md

Redirects in docs/docs/v2/security/sso-open-id.md

Redirects in docs/docs/v2/welcome/common-steps.md

Redirects in docs/docs/v2/welcome/prerequisites.md

Redirects in docs/docs/v3/bootstrap/index.md

Redirects in docs/docs/v3/circuitbreaker/hystrix.md

Redirects in docs/docs/v3/configuration/config-server-provider.md

Redirects in docs/docs/v3/connectors/microsoft-sql-server.md

Redirects in docs/docs/v3/connectors/mysql.md

Redirects in docs/docs/v3/connectors/postgresql.md

Redirects in docs/docs/v3/connectors/usage.md

Redirects in docs/docs/v3/discovery/initialize-discovery-client.md

Redirects in docs/docs/v3/fileshares/index.md

Redirects in docs/docs/v3/fileshares/usage.md

Redirects in docs/docs/v3/management/dbmigrations.md

Redirects in docs/docs/v3/management/health.md

Redirects in docs/docs/v3/management/info.md

Redirects in docs/docs/v3/management/metrics.md

Redirects in docs/docs/v3/management/using-endpoints.md

Redirects in docs/docs/v3/messaging/rabbitmq-intro.md

Redirects in docs/docs/v3/messaging/rabbitmq-reference.md

Redirects in docs/docs/v3/security/credhub-api-client.md

Redirects in docs/docs/v3/security/mtls.md

Redirects in docs/docs/v3/security/sso-oauth2.md

Redirects in docs/docs/v3/security/sso-open-id.md

Redirects in docs/docs/v3/stream/rabbit-binder.md

Redirects in docs/docs/v3/stream/standalone-stream-rabbitmq.md

Redirects in docs/docs/v3/stream/stream-reference.md

Redirects in docs/docs/v3/tracing/distributed-tracing-exporting.md

Redirects in docs/docs/v3/tracing/index.md

Redirects in docs/docs/v4/bootstrap/app-bootstrap.md

Redirects in docs/docs/v4/configuration/cloud-foundry-provider.md

Redirects in docs/docs/v4/configuration/config-server-provider.md

Redirects in docs/docs/v4/connectors/cosmosdb.md

Redirects in docs/docs/v4/connectors/microsoft-sql-server.md

Redirects in docs/docs/v4/connectors/mongodb.md

Redirects in docs/docs/v4/connectors/mysql.md

Redirects in docs/docs/v4/connectors/postgresql.md

Redirects in docs/docs/v4/connectors/rabbitmq.md

Redirects in docs/docs/v4/connectors/redis.md

Redirects in docs/docs/v4/connectors/usage.md

Redirects in docs/docs/v4/discovery/discovering-services.md

Redirects in docs/docs/v4/discovery/initialize-discovery-client.md

Redirects in docs/docs/v4/discovery/netflix-eureka.md

Redirects in docs/docs/v4/fileshares/index.md

Redirects in docs/docs/v4/fileshares/usage.md

Redirects in docs/docs/v4/logging/dynamic-console-logging.md

Redirects in docs/docs/v4/management/cloud-foundry.md

Redirects in docs/docs/v4/management/dbmigrations.md

Redirects in docs/docs/v4/management/health.md

Redirects in docs/docs/v4/management/heapdump.md

Redirects in docs/docs/v4/management/httpexchanges.md

Redirects in docs/docs/v4/management/prometheus.md

Redirects in docs/docs/v4/management/threaddump.md

Redirects in docs/docs/v4/management/using-endpoints.md

Redirects in docs/docs/v4/security/certificate.md

Redirects in docs/docs/v4/security/jwt-bearer.md

Redirects in docs/docs/v4/security/redis-key-storage-provider.md

Redirects in docs/docs/v4/security/sso-open-id.md

Redirects in docs/docs/v4/tracing/index.md

Redirects in docs/docs/v4/welcome/common-steps.md

Redirects in docs/docs/v4/welcome/migrate-quick-steps.md

Redirects in docs/docs/v4/welcome/prerequisites.md

Redirects in docs/docs/v4/welcome/whats-new.md

Redirects in docs/guides/application-configuration/cloud-foundry.md

Redirects in docs/guides/application-configuration/placeholder.md

Redirects in docs/guides/application-configuration/random-value.md

Redirects in docs/guides/application-configuration/spring-config.md

Redirects in docs/guides/cloud-management/distributed-tracing.md

Redirects in docs/guides/cloud-management/endpoints-netcore.md

Redirects in docs/guides/get-to-know-steeltoe/exercise1.md

Redirects in docs/guides/get-to-know-steeltoe/exercise2.md

Redirects in docs/guides/get-to-know-steeltoe/exercise3.md

Redirects in docs/guides/get-to-know-steeltoe/exercise4.md

Redirects in docs/guides/get-to-know-steeltoe/index.md

Redirects in docs/guides/get-to-know-steeltoe/summary.md

Redirects in docs/guides/index.md

Redirects in docs/guides/messaging/Tutorials/Tutorial1/Readme.md

Redirects in docs/guides/observability/grafana.md

Redirects in docs/guides/observability/tanzu.md

Redirects in docs/guides/observability/wavefront.md

Redirects in docs/guides/security/jwt.md

Redirects in docs/guides/security/redisstore.md

Redirects in docs/guides/security/sso-oauth.md

Redirects in docs/guides/security/sso-openid-netcore.md

Redirects in docs/guides/service-connectors/mongo.md

Redirects in docs/guides/service-connectors/mssql.md

Redirects in docs/guides/service-connectors/mysql.md

Redirects in docs/guides/service-connectors/oauth.md

Redirects in docs/guides/service-connectors/postgresql.md

Redirects in docs/guides/service-connectors/rabbitmq.md

Redirects in docs/guides/service-connectors/redis.md

Redirects in docs/guides/service-discovery/consul.md

Redirects in docs/guides/service-discovery/eureka.md

Redirects in docs/README.md

Redirects in README.md

Full Github Actions output

@TimHess TimHess marked this pull request as ready for review February 25, 2026 15:25
Co-authored-by: Cursor <cursoragent@cursor.com>
Made-with: Cursor
--retry-wait-time 15
--timeout 30
'**/*.md'
fail: true
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why does the step need to fail when broken links are found? Without it, the ifs in subsequent steps can be removed. And then we can distinguish between broken links and unexpected errors.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess it doesn't need to fail, but without the job failing it's a lot easier to skip over it... We don't have it as a required check, so it's not like this ever prevents a merge

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We have the summary for that, and we don't want to fail on broken links. But we should be able to distinguish between broken links (which are in the report) vs errors like "python error xxx", "commit sha not found", etc.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

despite removing fail:true the job still shows failure, so this flag doesn't seem to matter either way

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It defaults to true. Have you tried setting it to false?

uses: lycheeverse/lychee-action@v2
with:
args: |
--verbose
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why verbose output? Should we pass --quiet instead?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verbose output for at least this stage of the work to see which links are being checked. I suppose we could remove it now, we could remove it in the PR that fixes links, or we could keep it so we always have a way to see what it actually checked. We also could let it use the default and not pass either of those flags

Copy link
Member

@TimHess TimHess Feb 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unresolving because I put it back (in script and workflow) so we don't lose the details on redirects if we remove it... they aren't in the logs or summary otherwise. I think we should keep it at least through 424

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm fine with enabling verbose logging in the workflow and script if that helps understand why something was reported. But can we hide the redirects from the PR comment? They seem just noise to me; after all, the links are working, so there's no need to "fix" them.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After the next CI run in 424, assuming the results look as clear as we want them to, I'll remove the verbosity setting in that PR.

Copy link
Member

@TimHess TimHess Feb 27, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Worth noting... the redirects have disappeared from the comment in this PR because the most recent workflow run used the cache from the previous run. Lychee only caches the final result, which does not track the redirects.

The GHA cache should stick around for 7 days, but lychee has a default max-cache-age of 1 day, so any older GHA cache hit will not be used by lychee.

@bart-vmware

This comment was marked as resolved.

Co-authored-by: Bart Koelman <104792814+bart-vmware@users.noreply.github.com>
- only use --no-progress in CI
- use more defaults
- change settings per-host instead of globally
- check for installed lychee first
@TimHess

This comment was marked as resolved.

--verbose is needed to see redirect details
- locally:
  - set user-agent locally to avoid 403 on mysql links (doesn't seem to affect CI)
  - ignore build/docfx-net10-binaries (like playwright readme)
- longer host-request-interval and retry-wait-time
Comment on lines 53 to 54
--scheme http
--scheme https
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the local script, these are quoted values.

- since redirect fixes are already in place in other PR, change verbosity now
- also include a paste-able snippet to bust the cache for a given PR
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants