Skip to content
Latchkey

Deploy VitePress site to Pages workflow (microsoft/agent-academy)

The Deploy VitePress site to Pages workflow from microsoft/agent-academy, explained and optimized by Latchkey.

B

CI health: B - good

Point runs-on at Latchkey and get job timeouts, SHA-pinned actions, self-healing for flaky steps, and up to 58% lower cost, applied automatically.

Grade your own workflow free or run it on Latchkey →
Source: microsoft/agent-academy.github/workflows/deploy-vitepress.ymlLicense MITView source

What it does

This is the Deploy VitePress site to Pages workflow from the microsoft/agent-academy repository, a real project running GitHub Actions. It is shown here with attribution under its MIT license.

Below, Latchkey shows a faster, safer version produced by its optimization engine.

The workflow

workflow (.yml)
# Sample workflow for building and deploying a VitePress site to GitHub Pages
#
name: Deploy VitePress site to Pages

on:
    # Runs on pushes targeting the `main` branch. Change this to `master` if you're
    # using the `master` branch as the default branch.
    push:
        branches: [main]

    # Allows you to run this workflow manually from the Actions tab
    workflow_dispatch:

# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
    contents: read
    pages: write
    id-token: write

# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
concurrency:
    group: pages
    cancel-in-progress: false

jobs:
    # Build job
    build:
        if: github.repository_owner == 'microsoft'
        runs-on: ubuntu-latest
        steps:
            - name: Checkout
              uses: actions/checkout@v4
              with:
                  fetch-depth: 0
            # - uses: pnpm/action-setup@v3 # Uncomment this block if you're using pnpm
            #   with:
            #     version: 9 # Not needed if you've set "packageManager" in package.json
            # - uses: oven-sh/setup-bun@v1 # Uncomment this if you're using Bun
            - name: Setup Node
              uses: actions/setup-node@v4
              with:
                  node-version: 22
                  cache: npm # or pnpm / yarn
            - name: Setup Pages
              uses: actions/configure-pages@v4
            - name: Install dependencies
              run: npm ci # or pnpm install / yarn install / bun install
            - name: Build with VitePress
              run: npm run docs:build # or pnpm docs:build / yarn docs:build / bun run docs:build
            - name: Upload artifact
              uses: actions/upload-pages-artifact@v3
              with:
                  path: docs/.vitepress/dist

    # Deployment job
    deploy:
        environment:
            name: github-pages
            url: ${{ steps.deployment.outputs.page_url }}
        needs: build
        runs-on: ubuntu-latest
        name: Deploy
        steps:
            - name: Deploy to GitHub Pages
              id: deployment
              uses: actions/deploy-pages@v4

The same workflow, on Latchkey

Removes redundant runs and caps runaway jobs. Added and changed lines are highlighted.

# Sample workflow for building and deploying a VitePress site to GitHub Pages
#
name: Deploy VitePress site to Pages
 
on:
    # Runs on pushes targeting the `main` branch. Change this to `master` if you're
    # using the `master` branch as the default branch.
    push:
        branches: [main]
 
    # Allows you to run this workflow manually from the Actions tab
    workflow_dispatch:
 
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
    contents: read
    pages: write
    id-token: write
 
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
concurrency:
    group: pages
    cancel-in-progress: false
 
jobs:
    # Build job
    build:
        timeout-minutes: 30
        if: github.repository_owner == 'microsoft'
        runs-on: latchkey-small
        steps:
            - name: Checkout
              uses: actions/checkout@v4
              with:
                  fetch-depth: 0
            # - uses: pnpm/action-setup@v3 # Uncomment this block if you're using pnpm
            #   with:
            #     version: 9 # Not needed if you've set "packageManager" in package.json
            # - uses: oven-sh/setup-bun@v1 # Uncomment this if you're using Bun
            - name: Setup Node
              uses: actions/setup-node@v4
              with:
                  node-version: 22
                  cache: npm # or pnpm / yarn
            - name: Setup Pages
              uses: actions/configure-pages@v4
            - name: Install dependencies
              run: npm ci # or pnpm install / yarn install / bun install
            - name: Build with VitePress
              run: npm run docs:build # or pnpm docs:build / yarn docs:build / bun run docs:build
            - name: Upload artifact
              uses: actions/upload-pages-artifact@v3
              with:
                  path: docs/.vitepress/dist
 
    # Deployment job
    deploy:
        timeout-minutes: 30
        environment:
            name: github-pages
            url: ${{ steps.deployment.outputs.page_url }}
        needs: build
        runs-on: latchkey-small
        name: Deploy
        steps:
            - name: Deploy to GitHub Pages
              id: deployment
              uses: actions/deploy-pages@v4

What changed

2 third-party actions are referenced by a movable tag. Pin them to the commit SHA (Latchkey resolves and applies this automatically) so a repointed tag cannot change what runs.

What Latchkey heals here

This workflow has steps that commonly fail on transient issues (network, registries, flaky browsers). On Latchkey managed runners they are detected, retried, and self-healed instead of failing your build:

This workflow runs 2 jobs per trigger. On Latchkey the same minutes cost up to 58% less than GitHub-hosted, with zero queue time.

Actions used in this workflow