Skip to content

fix(snapshot): name the python3 prerequisite when sanitization cannot run #11308

fix(snapshot): name the python3 prerequisite when sanitization cannot run

fix(snapshot): name the python3 prerequisite when sanitization cannot run #11308

# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
name: Docs / Fern Preview
on:
pull_request:
branches: [main]
types: [opened, reopened, synchronize]
paths:
- "docs/**"
- "fern/**"
- "README.md"
- "package.json"
- "package-lock.json"
- "scripts/generate-starter-prompt.mts"
- "scripts/sync-agent-variant-docs.mts"
- ".github/workflows/docs-preview-pr.yaml"
concurrency:
group: fern-preview-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: read
pull-requests: write
env:
FERN_STAGING_INSTANCE: nvidia-nemoclaw-staging.docs.buildwithfern.com/nemoclaw
jobs:
preview:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Check Fern preview availability
id: fern-preview
env:
FERN_TOKEN: ${{ secrets.FERN_TOKEN }}
run: |
if [ -n "$FERN_TOKEN" ]; then
echo "enabled=true" >> "$GITHUB_OUTPUT"
else
echo "enabled=false" >> "$GITHUB_OUTPUT"
echo "::notice::Skipping Fern docs preview because FERN_TOKEN is unavailable. This is expected for fork PRs and repos without Fern preview credentials configured."
fi
- name: Setup Node.js
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: "24"
- name: Install docs dependencies
run: npm ci --ignore-scripts
- name: Prepare and validate docs
run: |
npm run docs:prepare
npm run docs:validate
- name: Generate preview URL
if: ${{ steps.fern-preview.outputs.enabled == 'true' }}
id: generate-docs
env:
FERN_TOKEN: ${{ secrets.FERN_TOKEN }}
PREVIEW_ID: pr-${{ github.event.pull_request.number }}
run: |
FERN_VERSION=$(node -p "require('./fern/fern.config.json').version")
set +e
OUTPUT=$(cd fern && npx --yes "fern-api@${FERN_VERSION}" generate --docs --instance "$FERN_STAGING_INSTANCE" --preview --id "$PREVIEW_ID" 2>&1)
STATUS=$?
set -e
echo "$OUTPUT"
URL=$(echo "$OUTPUT" | sed -nE 's/.*Published docs to (https?:\/\/[^[:space:]]+).*/\1/p' | head -n1)
if [ -z "$URL" ]; then
echo "::error::Failed to generate preview URL. See fern output above."
exit "$STATUS"
fi
FERN_ORG=$(node -p "require('./fern/fern.config.json').organization")
INSTANCE_PATH="${FERN_STAGING_INSTANCE#*/}"
if [[ "$INSTANCE_PATH" == "$FERN_STAGING_INSTANCE" ]]; then
INSTANCE_PATH=""
else
INSTANCE_PATH="/${INSTANCE_PATH}"
fi
EXPECTED_BASE="https://${FERN_ORG}-preview-${PREVIEW_ID}.docs.buildwithfern.com${INSTANCE_PATH}"
EXPECTED_PREFIX="${EXPECTED_BASE}/"
if [[ "$URL" != "$EXPECTED_BASE" && "$URL" != "${EXPECTED_PREFIX}"* ]]; then
echo "::error::Preview URL must match ${EXPECTED_BASE} or start with ${EXPECTED_PREFIX}; got ${URL}."
exit 1
fi
echo "preview_url=$URL" >> "$GITHUB_OUTPUT"
- name: Post or update PR comment
if: ${{ steps.fern-preview.outputs.enabled == 'true' }}
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_NUMBER: ${{ github.event.pull_request.number }}
PREVIEW_URL: ${{ steps.generate-docs.outputs.preview_url }}
run: |
BODY=":herb: **Preview your docs:** <${PREVIEW_URL}>"
MARKER="<!-- fern-preview-docs -->"
BODY="${BODY}
${MARKER}"
COMMENT_ID=$(gh api "repos/${{ github.repository }}/issues/${PR_NUMBER}/comments" \
--jq ".[] | select(.body | contains(\"${MARKER}\")) | .id" | head -1)
if [ -n "$COMMENT_ID" ]; then
gh api "repos/${{ github.repository }}/issues/comments/${COMMENT_ID}" \
-X PATCH -f body="$BODY"
else
gh api "repos/${{ github.repository }}/issues/${PR_NUMBER}/comments" \
-f body="$BODY"
fi