Link Checker #12
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Link Checker | |
on: | |
repository_dispatch: | |
workflow_dispatch: | |
schedule: | |
- cron: '0 0 1 * *' # Run at midnight on the first of every month | |
jobs: | |
linkChecker: | |
name: Check and report broken links | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout Repository | |
uses: actions/checkout@v4 | |
with: | |
submodules: 'recursive' | |
- name: Set up Node.js | |
uses: actions/setup-node@v4 | |
with: | |
node-version: '20' | |
# Replace corepack with direct PNPM installation | |
- name: Install pnpm | |
run: npm install -g pnpm | |
- name: Get Token | |
uses: actions/create-github-app-token@v1 | |
id: get_workflow_token | |
with: | |
app-id: ${{ vars.APP_ID }} | |
private-key: ${{ secrets.PRIVATE_KEY }} | |
- name: Install Dependencies | |
run: pnpm install --frozen-lockfile | |
- name: Serve App Locally | |
run: pnpm run dev & | |
- name: Wait for App to Start | |
run: sleep 20 | |
# This will restore the lychee cache | |
- name: Restore lychee cache | |
uses: actions/cache@v4 | |
with: | |
path: .lycheecache | |
key: cache-lychee-${{ github.sha }} | |
restore-keys: cache-lychee- | |
# This will run the link checker on all markdown files in the pages directory | |
- name: Link Checker | |
id: lychee | |
uses: lycheeverse/lychee-action@v1 | |
with: | |
args: --base https://tour.json-schema.org --verbose --no-progress --accept 200,204,429,403 './content/**/*.mdx' --cache --max-cache-age 1d https://tour.json-schema.org | |
token: ${{secrets.GITHUB_TOKEN}} | |
- name: Install Octokit | |
run: pnpm add @octokit/core@5.1.0 | |
# This will create an issue with the link checker report if it does not exist, otherwise it will update the existing issue. | |
- name: Create Issue | |
if: env.lychee_exit_code != 0 | |
uses: actions/github-script@v7 | |
env: | |
AUTH_TOKEN: ${{ steps.get_workflow_token.outputs.token }} | |
with: | |
script: | | |
const { Octokit } = require("@octokit/core"); | |
const octokit = new Octokit({ auth: process.env.AUTH_TOKEN }); | |
const allIssues = await octokit.request('GET /repos/{owner}/{repo}/issues', { | |
owner: context.repo.owner, | |
repo: context.repo.repo | |
}); | |
const existingIssue = allIssues.data.find(issue => issue.title === 'Link Checker Report'); | |
if (existingIssue) { | |
await octokit.request('PATCH /repos/{owner}/{repo}/issues/{issue_number}', { | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
issue_number: existingIssue.number, | |
body: '## Link Checker Report\n\n' + require('fs').readFileSync('./lychee/out.md', 'utf8') | |
}); | |
} else { | |
await octokit.request('POST /repos/{owner}/{repo}/issues', { | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
title: 'Link Checker Report', | |
body: '## Link Checker Report\n\n' + require('fs').readFileSync('./lychee/out.md', 'utf8') | |
}); | |
} |