diff --git a/.github/workflows/pr-link-check.yml b/.github/workflows/pr-link-check.yml index 0a9b48d2d..43f739b6e 100644 --- a/.github/workflows/pr-link-check.yml +++ b/.github/workflows/pr-link-check.yml @@ -12,18 +12,18 @@ jobs: link-check: name: Check links in affected files runs-on: ubuntu-latest - + steps: - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 - + - name: Detect content changes id: detect run: | echo "🔍 Detecting changes between ${{ github.base_ref }} and ${{ github.sha }}" - + # For PRs, use the GitHub Files API to get changed files if [[ "${{ github.event_name }}" == "pull_request" ]]; then echo "Using GitHub API to detect PR changes..." @@ -34,23 +34,23 @@ jobs: echo "Using git diff to detect changes..." git diff --name-only ${{ github.event.before }}..${{ github.sha }} > all_changed_files.txt fi - + # Filter for content markdown files CHANGED_FILES=$(grep '^content/.*\.md$' all_changed_files.txt || true) - + echo "📁 All changed files:" cat all_changed_files.txt echo "" echo "📝 Content markdown files:" echo "$CHANGED_FILES" - + if [[ -n "$CHANGED_FILES" ]]; then echo "✅ Found $(echo "$CHANGED_FILES" | wc -l) changed content file(s)" echo "has-changes=true" >> $GITHUB_OUTPUT echo "changed-content<> $GITHUB_OUTPUT echo "$CHANGED_FILES" >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT - + # Check if any shared content files were modified SHARED_CHANGES=$(echo "$CHANGED_FILES" | grep '^content/shared/' || true) if [[ -n "$SHARED_CHANGES" ]]; then @@ -64,57 +64,57 @@ jobs: echo "has-changes=false" >> $GITHUB_OUTPUT echo "has-shared-content=false" >> $GITHUB_OUTPUT fi - + - name: Skip if no content changes if: steps.detect.outputs.has-changes == 'false' run: | echo "No content changes detected in this PR - skipping link check" echo "✅ **No content changes detected** - link check skipped" >> $GITHUB_STEP_SUMMARY - + - name: Setup Node.js if: steps.detect.outputs.has-changes == 'true' uses: actions/setup-node@v4 with: node-version: '20' cache: 'yarn' - + - name: Install dependencies if: steps.detect.outputs.has-changes == 'true' run: yarn install --frozen-lockfile - + - name: Build Hugo site if: steps.detect.outputs.has-changes == 'true' run: npx hugo --minify - + - name: Download link-checker binary if: steps.detect.outputs.has-changes == 'true' run: | echo "Downloading link-checker binary from docs-v2 releases..." - + # Download from docs-v2's own releases (always accessible) curl -L -H "Accept: application/vnd.github+json" \ -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \ -o link-checker-info.json \ - "https://api.github.com/repos/influxdata/docs-v2/releases/tags/link-checker-v1.4.0" - + "https://api.github.com/repos/influxdata/docs-v2/releases/tags/link-checker-v1.5.0" + # Extract download URL for linux binary DOWNLOAD_URL=$(jq -r '.assets[] | select(.name | test("link-checker.*linux")) | .url' link-checker-info.json) - + if [[ "$DOWNLOAD_URL" == "null" || -z "$DOWNLOAD_URL" ]]; then echo "❌ No linux binary found in release" echo "Available assets:" jq -r '.assets[].name' link-checker-info.json exit 1 fi - + echo "📥 Downloading: $DOWNLOAD_URL" curl -L -H "Accept: application/octet-stream" \ -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \ -o link-checker "$DOWNLOAD_URL" - + chmod +x link-checker ./link-checker --version - + - name: Verify link checker config exists if: steps.detect.outputs.has-changes == 'true' run: | @@ -124,26 +124,26 @@ jobs: exit 1 fi echo "✅ Using configuration: .ci/link-checker/production.lycherc.toml" - + - name: Map changed content to public files if: steps.detect.outputs.has-changes == 'true' id: mapping run: | echo "Mapping changed content files to public HTML files..." - + # Create temporary file with changed content files echo "${{ steps.detect.outputs.changed-content }}" > changed-files.txt - + # Map content files to public files PUBLIC_FILES=$(cat changed-files.txt | xargs -r ./link-checker map --existing-only) - + if [[ -n "$PUBLIC_FILES" ]]; then echo "Found affected public files:" echo "$PUBLIC_FILES" echo "public-files<> $GITHUB_OUTPUT echo "$PUBLIC_FILES" >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT - + # Count files for summary FILE_COUNT=$(echo "$PUBLIC_FILES" | wc -l) echo "file-count=$FILE_COUNT" >> $GITHUB_OUTPUT @@ -152,26 +152,26 @@ jobs: echo "public-files=" >> $GITHUB_OUTPUT echo "file-count=0" >> $GITHUB_OUTPUT fi - + - name: Run link checker if: steps.detect.outputs.has-changes == 'true' && steps.mapping.outputs.public-files != '' id: link-check run: | echo "Checking links in ${{ steps.mapping.outputs.file-count }} affected files..." - + # Create temporary file with public files list echo "${{ steps.mapping.outputs.public-files }}" > public-files.txt - + # Run link checker with detailed JSON output set +e # Don't fail immediately on error - + cat public-files.txt | xargs -r ./link-checker check \ --config .ci/link-checker/production.lycherc.toml \ --format json \ --output link-check-results.json - + EXIT_CODE=$? - + if [[ -f link-check-results.json ]]; then # Parse results using actual v1.3.1 JSON structure ERROR_COUNT=$(jq -r '.summary.error_count // 0' link-check-results.json) @@ -216,7 +216,7 @@ jobs: fi exit $EXIT_CODE - + - name: Process and report results if: always() && steps.detect.outputs.has-changes == 'true' && steps.mapping.outputs.public-files != '' env: @@ -319,7 +319,7 @@ jobs: else echo "⚠️ **Link check could not complete** — no results file generated" >> $GITHUB_STEP_SUMMARY fi - + - name: Upload detailed results if: always() && steps.detect.outputs.has-changes == 'true' && steps.mapping.outputs.public-files != '' uses: actions/upload-artifact@v4 @@ -329,4 +329,4 @@ jobs: link-check-results.json changed-files.txt public-files.txt - retention-days: 30 \ No newline at end of file + retention-days: 30