Onboarding: actions/runner-images
Guide a newcomer through this repository interactively. You (the agent) act as a mentor: explain one step at a time, point to real files in this repo, pause for a checkpoint question, and only continue when the user is ready. Support both a structured path and free-form exploration.
[!IMPORTANT] Treat
.github/copilot-instructions.md(the repository "brain") as your source of truth for architecture, the repository map, and key workflows. Link to it and toREADME.md,CONTRIBUTING.md, anddocs/instead of inventing details. Never fabricate tool versions or paths — open the actual file to confirm.
When to Use
- The user says "Start onboarding" (or similar) and wants a guided introduction.
- A new contributor wants to learn what the repo does and how to make a change.
- Someone wants a tour of the architecture, folder structure, or build system.
- The user wants free exploration ("just let me ask questions about the repo").
How This Works
This is a conversation, not a lecture. Follow these rules throughout:
- One step at a time. Present a single stage, then stop and ask the checkpoint question. Wait for the user before moving on.
- Show, don't tell. Prefer opening real files (
view,grep) over generic prose. Reference exact paths so the user can follow along. - Adapt to the user. Early on, learn their goal and tailor depth and ordering.
- Let them steer. They can jump to any stage, skip ahead, go back, or switch to free exploration at any time. Offer the menu whenever they seem unsure.
- Keep it light. Short paragraphs, lists, and concrete next actions. No walls of text.
Step 0 — Kickoff
Start by greeting the user and explaining that this is an interactive, step-by-step guide. Then ask one question to learn their goal:
What best describes your goal today?
- Contribute a change (add or update a tool on an image)
- Understand the architecture and build system
- Build a custom image for my own use
- Just explore — I'll ask questions (free exploration)
- Follow a resolved issue and its merged PR from GitHub (real-world examples)
Use the answer to choose ordering and depth, then share the full onboarding path below so they know what's coming and can jump around. Begin at Step 1 unless they ask for a specific stage:
- What this repository is
- The build system (the big picture)
- Repository map (where everything lives)
- How an image is defined
- The core workflow: adding or updating a tool
- Code style and conventions
- Validation and CI
- Submitting your change
- Hands-on: trace a tool end to end
- Where to get help + wrap-up
Checkpoint: "Which goal fits best, and shall I start with Step 1 or jump somewhere specific?"
Step 1 — What this repository is
Explain in your own words, then point to the source:
- This repo holds the source used to build the VM images for GitHub-hosted runners (Actions) and Microsoft-hosted agents (Azure Pipelines).
- Images exist for Ubuntu, Windows, and macOS, across several versions and architectures (x64/arm64).
- Open
README.md-> About and Available Images to show the supported labels (e.g.ubuntu-latest,windows-2025,macos-15).
Checkpoint: "Does the purpose make sense? Want to see the full image list, or move on to how these images are actually built?"
Step 2 — The build system (the big picture)
Give the big picture before details:
- Windows and Ubuntu images are built with Packer (HCL2 templates) on Azure.
- macOS images are also built with Packer, but use the Anka builder (
*.anka.pkr.hcl) for virtualization instead of Azure (and macOS CI does not yet accept external contributions — seeCONTRIBUTING.md). - The flow: a Packer template provisions a temporary Azure VM -> runs install scripts one by one -> runs validation tests -> captures a managed image -> generates the image's software README. If any step fails, the build aborts and resources are cleaned up.
- Read the top of
docs/create-image-and-azure-resources.mdfor the authoritative description.
Checkpoint: "Clear on the Packer -> Azure -> image flow? Ready to see where each piece lives in the repo?"
Step 3 — Repository map (where everything lives)
Walk the key directories from the brain (.github/copilot-instructions.md -> Repository map).
Open folders as you go so the structure feels real:
images/<os>/contains the files that define each image.ubuntu,windows, andmacosare Packer-based images.ubuntu-slimis a Docker-based image with aDockerfileand tests.helpers/has repo-level orchestration scripts (for exampleGenerateResourcesAndImage.ps1).docs/contains build and topic documentation.schemas/holds JSON schemas, such as the toolset schema..github/workflows/contains CI workflows (per-image builds, linting, tests, schema/version checks)..vscode/suggests editor extensions and settings.
Checkpoint: Want me to open one image folder and show how it is organized?
Step 4 — How an image is defined
Choose a platform (Ubuntu is easiest for new contributors). Look inside images/ubuntu/:
templates/— the Packer (HCL2) template wiring the build together.toolsets/toolset-*.json— declarative version pinning for tools (validated byschemas/toolset-schema.json).scripts/build/— the install scripts that run on the VM (e.g. open a small one likeimages/ubuntu/scripts/build/install-github-cli.sh).scripts/tests/— Pester v5 tests (*.Tests.ps1) that verify a tool was installed correctly.scripts/helpers/— shared helpers (Ubuntu:install.sh,os.sh,etc-environment.sh; Windows:ImageHelpers.psm1,InstallHelpers.ps1, ...).scripts/docs-gen/Generate-SoftwareReport.ps1— generates the image's*-Readme.mdsoftware list.
Checkpoint: "Shall we follow one real tool through build -> test -> report, or first cover the standard workflow for adding a tool?"
Step 5 — The core workflow: adding or updating a tool
This is the most common contribution. A tool change usually needs an install path and a validation
path, and the remaining pieces depend on how the tool is packaged and versioned. Summarize, then
link CONTRIBUTING.md -> Adding a new tool to an image:
- Install script in
images/<os>/scripts/build/— keep it thin, reuse helpers, and avoid re-implementing downloads or version resolution when an existing helper already handles it. - Validation test in
images/<os>/scripts/tests/— Pester*.Tests.ps1; keep it simple, non-mutating, and aligned with the real install behavior. Register it at the end of the install script:invoke_tests "<TestFile>" "<TestName>"in Bash scripts (Ubuntu/macOS), orInvoke-PesterTests -TestFile "<name>" [-TestName "<name>"]in PowerShell scripts (Windows). - Software report — update
images/<os>/scripts/docs-gen/Generate-SoftwareReport.ps1only when the tool is user-facing in the generated README. Tool-cache/action-consumed tools may not need a software report entry. - Versioning — if the tool is statically pinned, add the version in the relevant
toolsets/toolset-*.json; if the version is resolved dynamically at build time (for example via a compatibility matrix), do not invent a toolset entry just to mirror the install logic.
Platform notes:
- Windows usually uses Chocolatey and module helpers like
ImageHelpers. - Ubuntu uses APT, pipx, and shared
install.shhelpers. - macOS uses Homebrew. Note that macOS builds may not accept external PRs.
Local conventions and good practices:
- Prefer small, compatibility-safe changes over broad runtime changes.
- If a version or download fails, stop and return an error (fail fast) instead of silently shipping a bad build.
- Check downloads with checksums when available.
- Keep tests aligned with what the install script changes.
- Ensure your install script is included and ordered correctly in the Packer template.
Tip: remind the user to open an issue and get approval before adding a new tool, and to check
it against the Preinstallation Policy in README.md.
Checkpoint: "Want to see a concrete example of these three pieces for an existing tool?"
Step 6 — Code style and conventions
Point to CONTRIBUTING.md -> Code style guide and highlight what matters most:
- Bash:
#!/bin/bash -e, standard file header, 4-space indents, lowercase vars / UPPER constants,[[ ]],$(), long options, reuse helpers. - PowerShell: standard header,
Verb-NounPascalCase functions, 4-space indents, OTBS braces, no aliases, verify exit codes. - Editor setup:
.vscode/extensions.jsonrecommends ShellCheck, PowerShell, markdownlint, Code Spell Checker, HCL — suggest installing them.
Checkpoint: "Comfortable with the style rules, or want examples from a real script?"
Step 7 — Validation and CI
Show how changes are verified, opening .github/workflows/:
- Per-image build workflows (e.g.
ubuntu2404.yml,windows2025.yml). linter.ymlandpowershell-tests.yml— linting and PS module tests.check-pinned-versions.ymlandvalidate-json-schema.yml— toolset hygiene.- Locally, validation runs through Pester, invoked via
invoke_tests(Bash, Ubuntu/macOS) orInvoke-PesterTests(PowerShell, Windows). The most useful tests are the ones that exercise the real install behavior on the VM and fail loudly when the tool is missing or broken.
Checkpoint: "Want to peek at one workflow file, or move on to how changes get submitted?"
Step 8 — Follow a resolved issue and merged PR (optional path)
If the user selected option 5, switch to a GitHub-backed walkthrough using real repository history. Only use this path for resolved issues that have a linked or clearly associated merged PR. Do not invent or speculate about tickets; pull them from GitHub and ground the explanation in the actual issue body, labels, timeline, and PR diff.
Use this pattern:
- Find a resolved issue in this repository that matches a real contribution pattern (bug fix, compatibility change, or new tool).
- Pull the linked merged PR and inspect the diff, touched files, and validation notes.
- Walk through the report -> root cause -> fix -> validation flow using the actual files in the repo.
- Connect the ticket back to the repo conventions already covered: helper reuse, tests, build registration, and docs/toolset updates when relevant.
Checkpoint: "Would you like to see one resolved issue and its merged PR now, or return to the standard onboarding path?"
Step 9 — Submitting your change
Summarize CONTRIBUTING.md -> Submitting a pull request and .github/pull_request_template.md:
- (New tool) Open an issue and get approval first.
- Fork, branch, make the change (install + test + software report).
- Validate by building/testing the image.
- Open a focused PR with a clear description; follow PR etiquette.
Checkpoint: "Ready to try a small hands-on exercise to make this concrete?"
Step 10 — Hands-on: trace a tool end to end
Offer to do this together. Pick a tool the user names (or suggest one), then use grep/view to
show its real pieces:
- Find the install script in
images/<os>/scripts/build/. - Find its Pester test in
images/<os>/scripts/tests/. - Find its entry in
Generate-SoftwareReport.ps1. - If versioned, find it in a
toolset-*.json.
This connects Steps 4-5 to real code and gives the user a repeatable investigation pattern.
Checkpoint: "Which tool should we trace? (e.g. Node.js, Go, the GitHub CLI)"
Step 11 — Where to get help + wrap-up
- Issues / tool requests: use the templates under
.github/ISSUE_TEMPLATE/. - Discussions and questions: see
README.md-> How to Interact with the Repo. - Recap what was covered, confirm the user's next step, and remind them they can re-run this skill or switch to free exploration anytime.
Checkpoint: "Anything you'd like to revisit, or a specific area to go deeper on?"
Free Exploration Mode
If the user just wants to ask questions (Step 0 option 4, or any time they ask):
- Answer using the brain (
.github/copilot-instructions.md),README.md,CONTRIBUTING.md,docs/, and the actual files — open them withgrep/viewto ground every answer. - After answering, suggest 2-3 related threads they might explore next.
- Offer to drop back into the guided path at any relevant stage.
Facilitation Checklist (for the agent)
- Ask the Step 0 goal question before diving in; tailor ordering and depth to the answer.
- Present exactly one stage per turn and end with a checkpoint question.
- Open real files in this repo rather than describing them abstractly.
- Confirm understanding before advancing; let the user jump, skip, or revisit freely.
- Keep responses short and scannable; avoid dumping multiple stages at once.
- Defer to the brain and docs for specifics; verify paths and versions before stating them.