Skip to content

Link Check: External #1

Link Check: External

Link Check: External #1

name: 'Link Check: External'
on:
schedule:
- cron: '20 16 * * 1' # Run every Monday at 16:20 UTC / 8:20 PST — link & content quality theme
workflow_dispatch:
inputs:
max_urls:
description: 'Maximum number of URLs to check (leave blank for all)'
type: number
permissions:
contents: read
issues: write
jobs:
check-external-links:
if: github.repository == 'github/docs-internal'
runs-on: ubuntu-latest
timeout-minutes: 180 # 3 hours for external checks
steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: ./.github/actions/node-npm-setup
- name: Install dependencies
run: npm ci
- name: Check external links
env:
ACTION_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
CACHE_MAX_AGE_DAYS: '7'
run: |
if [[ -n "${{ inputs.max_urls }}" ]]; then
npm run check-links-external -- --max ${{ inputs.max_urls }}
else
npm run check-links-external
fi
- name: Upload report artifact
if: always()
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
with:
name: external-link-report
path: artifacts/external-link-report.*
retention-days: 14
if-no-files-found: ignore
- name: Check if report exists
if: always()
id: check_report
run: |
if [ -f "artifacts/external-link-report.md" ]; then
echo "has_report=true" >> $GITHUB_OUTPUT
# Prepend disclaimer banner
tmp=$(mktemp)
{
echo "> [!NOTE]"
echo "> **No action needed right now.** The link checker is being actively worked on and may produce false positives. You can safely ignore this report for now. We'll let you know when it's reliable."
echo ""
cat "artifacts/external-link-report.md"
} > "$tmp"
mv "$tmp" "artifacts/external-link-report.md"
else
echo "has_report=false" >> $GITHUB_OUTPUT
echo "No broken link report generated - all links valid!"
fi
- name: Create issue if broken links found
if: always() && steps.check_report.outputs.has_report == 'true'
uses: peter-evans/create-issue-from-file@fca9117c27cdc29c6c4db3b86c48e4115a786710 # v5
with:
token: ${{ secrets.DOCS_BOT_PAT_BASE }}
repository: github/docs-content
title: '🌐 Broken External Links Report'
content-filepath: artifacts/external-link-report.md
labels: broken link report
- uses: ./.github/actions/slack-alert
if: ${{ failure() && github.event_name != 'workflow_dispatch' }}
with:
slack_channel_id: ${{ secrets.DOCS_ALERTS_SLACK_CHANNEL_ID }}
slack_token: ${{ secrets.SLACK_DOCS_BOT_TOKEN }}