Validating Azure Pipeline Changes
When modifying Azure DevOps pipeline files (YAML files in build/azure-pipelines/), you can validate changes locally using the Azure CLI before committing. This avoids the slow feedback loop of pushing changes, waiting for CI, and checking results.
Prerequisites
-
Check if Azure CLI is installed:
az --version
If not installed, install it:
brew install azure-cli
winget install Microsoft.AzureCLI
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
-
Check if the DevOps extension is installed:
az extension show --name azure-devops
If not installed, add it:
az extension add --name azure-devops
-
Authenticate:
az login
az devops configure --defaults organization=https://dev.azure.com/monacotools project=Monaco
VS Code Main Build
The main VS Code build pipeline:
VS Code Insider Scheduled Builds
Two Insider builds run automatically on a scheduled basis:
- Morning build: ~7:00 AM CET
- Evening build: ~7:00 PM CET
These scheduled builds use the same pipeline definition (111) but run on the main branch to produce Insider releases.
Queueing a Build
Use the queue command to queue a validation build:
node .github/skills/azure-pipelines/azure-pipeline.ts queue
node .github/skills/azure-pipelines/azure-pipeline.ts queue --branch my-feature-branch
node .github/skills/azure-pipelines/azure-pipeline.ts queue --parameter "VSCODE_BUILD_WEB=false" --parameter "VSCODE_PUBLISH=false"
node .github/skills/azure-pipelines/azure-pipeline.ts queue --parameter "VSCODE_BUILD_TYPE=Product Build"
Important: Before queueing a new build, cancel any previous builds on the same branch that you no longer need. This frees up build agents and reduces resource waste:
node .github/skills/azure-pipelines/azure-pipeline.ts status
node .github/skills/azure-pipelines/azure-pipeline.ts cancel --build-id <id>
node .github/skills/azure-pipelines/azure-pipeline.ts queue
Script Options
| Option |
Description |
--branch <name> |
Source branch to build (default: current git branch) |
--definition <id> |
Pipeline definition ID (default: 111) |
--parameter <entry> |
Pipeline parameter in KEY=value format (repeatable); use this when the value contains spaces |
--parameters <list> |
Space-separated parameters in KEY=value KEY2=value2 format; values must not contain spaces |
--dry-run |
Print the command without executing |
Product Build Queue Parameters (build/azure-pipelines/product-build.yml)
| Name |
Type |
Default |
Allowed Values |
Description |
VSCODE_QUALITY |
string |
insider |
exploration, insider, stable |
Build quality channel |
VSCODE_BUILD_TYPE |
string |
Product Build |
Product, CI |
Build mode for Product vs CI |
NPM_REGISTRY |
string |
https://pkgs.dev.azure.com/monacotools/Monaco/_packaging/vscode/npm/registry/ |
any URL |
Custom npm registry |
CARGO_REGISTRY |
string |
sparse+https://pkgs.dev.azure.com/monacotools/Monaco/_packaging/vscode/Cargo/index/ |
any URL |
Custom Cargo registry |
VSCODE_BUILD_WIN32 |
boolean |
true |
true, false |
Build Windows x64 |
VSCODE_BUILD_WIN32_ARM64 |
boolean |
true |
true, false |
Build Windows arm64 |
VSCODE_BUILD_LINUX |
boolean |
true |
true, false |
Build Linux x64 |
VSCODE_BUILD_LINUX_SNAP |
boolean |
true |
true, false |
Build Linux x64 Snap |
VSCODE_BUILD_LINUX_ARM64 |
boolean |
true |
true, false |
Build Linux arm64 |
VSCODE_BUILD_LINUX_ARMHF |
boolean |
true |
true, false |
Build Linux armhf |
VSCODE_BUILD_ALPINE |
boolean |
true |
true, false |
Build Alpine x64 |
VSCODE_BUILD_ALPINE_ARM64 |
boolean |
true |
true, false |
Build Alpine arm64 |
VSCODE_BUILD_MACOS |
boolean |
true |
true, false |
Build macOS x64 |
VSCODE_BUILD_MACOS_ARM64 |
boolean |
true |
true, false |
Build macOS arm64 |
VSCODE_BUILD_MACOS_UNIVERSAL |
boolean |
true |
true, false |
Build macOS universal (requires both macOS arches) |
VSCODE_BUILD_WEB |
boolean |
true |
true, false |
Build Web artifacts |
VSCODE_PUBLISH |
boolean |
true |
true, false |
Publish to builds.code.visualstudio.com |
VSCODE_RELEASE |
boolean |
false |
true, false |
Trigger release flow if successful |
VSCODE_STEP_ON_IT |
boolean |
false |
true, false |
Skip tests |
Example: run a quick CI-oriented validation with minimal publish/release side effects:
node .github/skills/azure-pipelines/azure-pipeline.ts queue \
--parameter "VSCODE_BUILD_TYPE=CI Build" \
--parameter "VSCODE_PUBLISH=false" \
--parameter "VSCODE_RELEASE=false"
Checking Build Status
Use the status command to monitor a running build:
node .github/skills/azure-pipelines/azure-pipeline.ts status
node .github/skills/azure-pipelines/azure-pipeline.ts status --build-id 123456
node .github/skills/azure-pipelines/azure-pipeline.ts status --watch
node .github/skills/azure-pipelines/azure-pipeline.ts status --watch 60
Script Options
| Option |
Description |
--build-id <id> |
Specific build ID (default: most recent on current branch) |
--branch <name> |
Filter builds by branch name (shows last 20 builds for branch) |
--reason <reason> |
Filter builds by reason: manual, individualCI, batchedCI, schedule, pullRequest |
--definition <id> |
Pipeline definition ID (default: 111) |
--watch [seconds] |
Continuously poll status until build completes (default: 30s) |
--download-log <id> |
Download a specific log to /tmp |
--download-artifact <name> |
Download artifact to /tmp |
--json |
Output raw JSON for programmatic consumption |
Cancelling a Build
Use the cancel command to stop a running build:
node .github/skills/azure-pipelines/azure-pipeline.ts cancel --build-id 123456
node .github/skills/azure-pipelines/azure-pipeline.ts cancel --build-id 123456 --dry-run
Script Options
| Option |
Description |
--build-id <id> |
Build ID to cancel (required) |
--definition <id> |
Pipeline definition ID (default: 111) |
--dry-run |
Print what would be cancelled without executing |
Testing Pipeline Changes
When the user asks to test changes in an Azure Pipelines build, follow this workflow:
- Queue a new build on the current branch
- Poll for completion by periodically checking the build status until it finishes
Polling for Build Completion
Use a shell loop with sleep to poll the build status. The sleep command works on all major operating systems:
node .github/skills/azure-pipelines/azure-pipeline.ts queue
while true; do
node .github/skills/azure-pipelines/azure-pipeline.ts status --build-id <BUILD_ID> --json 2>/dev/null | grep -q '"status": "completed"' && break
sleep 60
done
node .github/skills/azure-pipelines/azure-pipeline.ts status --build-id <BUILD_ID>
Alternatively, use the built-in --watch flag which handles polling automatically:
node .github/skills/azure-pipelines/azure-pipeline.ts queue
node .github/skills/azure-pipelines/azure-pipeline.ts status --build-id <BUILD_ID> --watch
Note: The --watch flag polls every 30 seconds by default. Use --watch 60 for a 60-second interval to reduce API calls.
Common Workflows
1. Quick Pipeline Validation
git add -A && git commit -m "test: pipeline changes"
git push origin HEAD
node .github/skills/azure-pipelines/azure-pipeline.ts status
node .github/skills/azure-pipelines/azure-pipeline.ts cancel --build-id <id>
node .github/skills/azure-pipelines/azure-pipeline.ts queue
node .github/skills/azure-pipelines/azure-pipeline.ts status --watch
2. Investigate a Build
node .github/skills/azure-pipelines/azure-pipeline.ts status --build-id 123456
node .github/skills/azure-pipelines/azure-pipeline.ts status --build-id 123456 --download-log 5
node .github/skills/azure-pipelines/azure-pipeline.ts status --build-id 123456 --download-artifact unsigned_vscode_cli_win32_x64_cli
3. Test with Modified Parameters
node .github/skills/azure-pipelines/azure-pipeline.ts queue \
--parameter "VSCODE_BUILD_TYPE=CI Build" \
--parameter "VSCODE_BUILD_WEB=false" \
--parameter "VSCODE_BUILD_ALPINE=false" \
--parameter "VSCODE_BUILD_ALPINE_ARM64=false" \
--parameter "VSCODE_PUBLISH=false"
4. Cancel a Running Build
node .github/skills/azure-pipelines/azure-pipeline.ts status
node .github/skills/azure-pipelines/azure-pipeline.ts cancel --build-id 123456