Skip to content

TestGrid Link Check

TestGrid Link Check #2

# Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Weekly link-integrity check for the recipe-health Evidence deep-links
# (RQ2 / #1284).
#
# Structurally a clone of bom-refresh.yaml (weekly schedule + workflow_dispatch,
# read-only GITHUB_TOKEN, ubuntu-latest, timeout-minutes) with one deliberate
# divergence: it never opens a PR and never edits a doc. Instead it runs
# tools/testgrid-link-check, which reads the committed dashboard presence
# manifest (pkg/testgrid/presence.yaml — the coordinates RQ1 deep-links) and
# fetches the live dashboard data with a bounded, origin-pinned HTTP client
# (off-origin redirects refused), then emits a Markdown report to
# $GITHUB_STEP_SUMMARY. A linked coordinate the live dashboard no longer serves
# is reported as a dead-link warning; a coordinate not yet linked is expected
# and not a warning.
#
# Advisory only, mirroring the warning-only recipe-evidence gate: it never
# blocks a merge (the job exits 0 even when warnings exist). Coordinate
# resolution against the live SPA is necessarily separate from lychee, which
# runs --offline and excludes design/ (fern-docs-ci.yaml) and so resolves no
# dynamic URLs at all — this is the right home, not a lychee tweak.
name: TestGrid Link Check
on:
schedule:
# Mondays 07:00 UTC, offset from bom-refresh (06:00) and recipe-health-refresh
# (06:30) so the three weekly jobs do not contend for runners at the same minute.
- cron: "0 7 * * 1"
workflow_dispatch: {}
# Serialize runs so a manual workflow_dispatch cannot race a scheduled run.
concurrency:
group: ${{ github.workflow }}
permissions:
contents: read
jobs:
check:
name: Verify recipe-health Evidence deep-links against the live dashboard
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Checkout Code
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Load versions
id: versions
uses: ./.github/actions/load-versions
- name: Set up Go
uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0
with:
go-version: ${{ steps.versions.outputs.go }}
cache: false
# No Helm setup: this job only reads an embedded manifest and fetches one
# JSON document — it templates no chart and touches no cluster.
- name: Check Evidence deep-links and write report to step summary
env:
GOFLAGS: -mod=vendor
# The tool exits 0 even when it finds dead links (warning-only), so the
# job never fails the weekly run; the report is the signal.
run: |
go run ./tools/testgrid-link-check -report-out "$GITHUB_STEP_SUMMARY"