File tree Expand file tree Collapse file tree 3 files changed +135
-0
lines changed Expand file tree Collapse file tree 3 files changed +135
-0
lines changed Original file line number Diff line number Diff line change 1+ name : Check links in AsciiDoc
2+
3+ on : [push, pull_request]
4+
5+ jobs :
6+ check-links :
7+ name : Check links in modified files
8+ runs-on : ubuntu-latest
9+
10+ steps :
11+ - uses : actions/checkout@v4
12+ with :
13+ fetch-depth : 0
14+
15+ - name : Install Asciidoctor
16+ run : |
17+ sudo apt-get update
18+ sudo apt-get install -y asciidoctor
19+
20+ - name : Make script executable
21+ run : chmod +x scripts/check-links.sh
22+
23+ - name : Fetch base branch
24+ run : git fetch origin main
25+
26+ - name : Check links in modified files
27+ shell : bash
28+ run : |
29+ MODIFIED_FILES=$(git diff --name-only origin/main...HEAD --diff-filter=d -- "*.adoc")
30+ CHECK_FILES=()
31+
32+ while IFS= read -r file; do
33+ [[ "$file" =~ ^assemblies/[^/]+\.adoc$ ]] && CHECK_FILES+=("$file")
34+ done <<< "$MODIFIED_FILES"
35+
36+ if [ ${#CHECK_FILES[@]} -eq 0 ]; then
37+ echo "No modified .adoc files found in assemblies/. Skipping link check."
38+ exit 0
39+ fi
40+
41+ for f in "${CHECK_FILES[@]}"; do
42+ ./scripts/check-links.sh "$f"
43+ done
Original file line number Diff line number Diff line change 1+ #! /bin/bash
2+ #
3+ # Checks for 404 links using Asciidoctor and curl
4+
5+ usage () {
6+ echo " Usage: $0 [<adoc_file>]"
7+ exit 1
8+ }
9+
10+ # Parse arguments
11+ INPUT_FILE=" "
12+
13+ # Check dependencies
14+ if ! asciidoctor -v > /dev/null 2>&1 ; then
15+ echo " Error: Asciidoctor is not installed" >&2
16+ exit 1
17+ fi
18+
19+ INPUT_FILE=" $1 "
20+
21+ if [ $# -eq 0 ]; then
22+ usage
23+ fi
24+
25+ # Create temp file for flagging broken links
26+ TMP_FILE=$( mktemp)
27+ echo " 0" > " $TMP_FILE "
28+
29+ # Load ignore patterns from external file
30+ IGNORE_FILE=" $( dirname " $0 " ) /links.ignore"
31+
32+ if [ ! -f " $IGNORE_FILE " ]; then
33+ echo " Error: Missing ignore patterns file: $IGNORE_FILE " >&2
34+ exit 1
35+ fi
36+
37+ mapfile -t IGNORE_PATTERNS < " $IGNORE_FILE "
38+ PATTERNS_DECL=$( declare -p IGNORE_PATTERNS)
39+
40+ check_url () {
41+ local URL=$1
42+ eval " $PATTERNS_DECL "
43+
44+ URL=${URL% [.,;:?!\]\) ]}
45+
46+ for PATTERN in " ${IGNORE_PATTERNS[@]} " ; do
47+ if [[ " $URL " =~ $PATTERN ]]; then
48+ exit 0
49+ fi
50+ done
51+
52+ STATUS=$( curl -Ls -o /dev/null -w " %{http_code}" --max-time 5 --connect-timeout 2 " $URL " )
53+
54+ if [[ " $STATUS " != " 000" && " $STATUS " != " 403" && ! " $STATUS " =~ ^(2| 3)[0-9]{2}$ ]]; then
55+ echo -e " Invalid URL (HTTP status $STATUS ): \n\033[31m$URL \033[0m"
56+ echo " 1" > " $TMP_FILE "
57+ fi
58+ }
59+
60+ export TMP_FILE
61+ export -f check_url
62+
63+ run_url_checks () {
64+ local FILE=" $1 "
65+ echo -e " \033[32mChecking: $FILE \033[0m"
66+ asciidoctor " $FILE " -a doctype=book -o - | \
67+ grep -Eo ' (http|https)://[a-zA-Z0-9./?=%_-]*' | \
68+ sort -u | \
69+ xargs -P 10 -n 1 bash -c " $PATTERNS_DECL ; check_url \"\$ 0\" "
70+ }
71+
72+ run_url_checks " $INPUT_FILE "
73+
74+ if [ " $( cat " $TMP_FILE " ) " -eq 1 ]; then
75+ echo " Errors found"
76+ exit 1
77+ fi
Original file line number Diff line number Diff line change 1+ # Add ignore link regexes one per line
2+ .*docs\.google\.com.*
3+ .*google\.com.*
4+ .*issues\.redhat\.com.*
5+ .*0\.0\.0\.0.*
6+ .*localhost.*
7+ .*registry\.redhat\.io.*
8+ .*example\.org.*
9+ .*github.com/example/myrepo\.git
10+ .*fonts\.googleapis\.com.*
11+ .*mixtral-my-project.apps\.my-cluster\.com.*
12+ .*openshiftapps\.com.*
13+ .*minio-cluster\.local.*
14+ .*codeflare-operator-webhook-service\.redhat-ods-applications\.svc
15+ .*example.com.*
You can’t perform that action at this time.
0 commit comments