π¨ CRITICAL GUIDELINES
Windows File Path Requirements
MANDATORY: Always Use Backslashes on Windows for File Paths
When using Edit or Write tools on Windows, you MUST use backslashes (
) in file paths, NOT forward slashes (/
).
Examples:
-
β WRONG: D:/repos/project/file.tsx
-
β CORRECT: D:\repos\project\file.tsx
This applies to:
-
Edit tool file_path parameter
-
Write tool file_path parameter
-
All file operations on Windows systems
Documentation Guidelines
NEVER create new documentation files unless explicitly requested by the user.
-
Priority: Update existing README.md files rather than creating new documentation
-
Repository cleanliness: Keep repository root clean - only README.md unless user requests otherwise
-
Style: Documentation should be concise, direct, and professional - avoid AI-generated tone
-
User preference: Only create additional .md files when user specifically asks for documentation
Azure DevOps 2025 Latest Features (Sprints 254-262)
New Expression Functions (Sprint 248)
iif() - Ternary Conditional Operator
Syntax: iif(condition, valueIfTrue, valueIfFalse)
variables: environment: 'production'
Use iif for conditional values
instanceCount: ${{ iif(eq(variables.environment, 'production'), 10, 2) }} deploymentSlot: ${{ iif(eq(variables.environment, 'production'), 'production', 'staging') }}
steps:
- script: echo "Deploying ${{ variables.instanceCount }} instances to ${{ variables.deploymentSlot }}"
trim() - Remove Whitespace
parameters:
- name: branchName type: string default: ' feature/my-branch '
variables:
Remove leading/trailing whitespace
cleanBranch: ${{ trim(parameters.branchName) }}
Result: 'feature/my-branch' (no spaces)
New Predefined Variables (Sprint 253)
Build.StageRequestedBy
Who requested the stage execution:
stages:
- stage: Deploy
jobs:
-
job: DeployJob steps:
- script: | echo "Stage requested by: $(Build.StageRequestedBy)" echo "Stage requester ID: $(Build.StageRequestedById)" displayName: 'Log stage requester'
Use for approval notifications
- task: SendEmail@1 inputs: to: 'approvers@example.com' subject: 'Deployment requested by $(Build.StageRequestedBy)'
-
Stage Dependencies Visualization (Sprint 254)
View stage dependencies when stage is expanded in pipeline UI:
stages:
-
stage: Build jobs:
- job: BuildJob
steps:
- script: echo "Building..."
- job: BuildJob
steps:
-
stage: Test dependsOn: Build # Shown visually when expanded jobs:
- job: TestJob
steps:
- script: echo "Testing..."
- job: TestJob
steps:
-
stage: Deploy_USEast dependsOn: Test jobs:
- job: DeployJob
steps:
- script: echo "Deploying to US East..."
- job: DeployJob
steps:
-
stage: Deploy_EUWest dependsOn: Test # Parallel with Deploy_USEast - visualized clearly jobs:
- job: DeployJob
steps:
- script: echo "Deploying to EU West..."
- job: DeployJob
steps:
Benefits:
-
Visual dependency graph in UI
-
Easier debugging of complex pipelines
-
Clear multi-region deployment patterns
-
Identify parallel vs sequential stages
New OS Images
Ubuntu-24.04 (General Availability)
pool: vmImage: 'ubuntu-24.04' # Latest LTS - Recommended
OR use ubuntu-latest (will map to 24.04 soon)
vmImage: 'ubuntu-latest'
steps:
- script: |
lsb_release -a
Ubuntu 24.04 LTS (Noble Numbat)
Key Information:
-
Ubuntu 24.04 is now generally available
-
ubuntu-latest will soon map to ubuntu-24.04 (currently ubuntu-22.04 )
-
Ubuntu 20.04 fully removed April 30, 2025
Windows Server 2025 (Coming June 2025)
pool: vmImage: 'windows-2025' # GA: June 16, 2025
steps:
- pwsh: | Get-ComputerInfo | Select-Object WindowsProductName, WindowsVersion
Key Information:
-
General availability: June 16, 2025
-
windows-latest will map to windows-2025 starting September 2, 2025
-
Windows Server 2019 extended support until December 31, 2025
macOS-15 Sequoia (Available)
pool: vmImage: 'macOS-15' # Sequoia
steps:
- script: |
sw_vers
macOS 15.x (Sequoia)
Key Information:
-
macOS 13 Ventura deprecation starts September 1, 2025
-
macOS 13 retirement planned for December 4, 2025
-
Apple Silicon (ARM64) support in preview
β οΈ Deprecated and Retired Images
Fully Removed (2025):
-
Ubuntu 20.04 - Removed April 30, 2025
-
.NET 6 - Removed from Windows and Ubuntu images August 1, 2025
Extended Support:
-
Windows Server 2019 - Extended until December 31, 2025
-
Deprecation starts: June 1, 2025
-
Brownout periods: June 3-24, 2025
-
Final removal: December 31, 2025
Upcoming Deprecations:
- macOS 13 Ventura - Deprecation: September 1, 2025, Retirement: December 4, 2025
Migration Recommendations:
Ubuntu Migration
OLD (Removed)
pool: vmImage: 'ubuntu-20.04'
NEW (Recommended)
pool: vmImage: 'ubuntu-24.04' # Best: explicit version
OR
vmImage: 'ubuntu-latest' # Will map to 24.04 soon
Windows Migration
OLD (Being deprecated)
pool: vmImage: 'windows-2019'
NEW (Recommended)
pool: vmImage: 'windows-2022' # Current stable
OR wait for
vmImage: 'windows-2025' # GA June 2025
GitHub Integration Improvements
Auto-linked Pull Requests
GitHub branches linked to work items automatically link PRs:
When PR is created for branch linked to work item,
PR automatically appears in work item's Development section
trigger: branches: include: - feature/* - users/*
Work item auto-linking based on branch name pattern
AB#12345 in commits auto-links to work item 12345
"Integrated in build" Links
GitHub repos show which build integrated the PR:
pr: branches: include: - main - develop
After PR merged, work item shows:
"Integrated in build: Pipeline Name #123"
Direct link to build that deployed the change
Stage-Level Variables
stages:
-
stage: Build variables: buildConfiguration: 'Release' platform: 'x64' jobs:
- job: BuildJob
steps:
- script: echo "Building $(buildConfiguration) $(platform)"
- job: BuildJob
steps:
-
stage: Deploy variables: environment: 'production' region: 'eastus' jobs:
- job: DeployJob
steps:
- script: | echo "Stage: $(System.StageName)" echo "Requested by: $(Build.StageRequestedBy)" echo "Deploying to $(environment) in $(region)"
- job: DeployJob
steps:
Practical Examples
Multi-Region Deployment with New Features
parameters:
- name: deployToProd type: boolean default: false
variables:
Use iif for conditional values
targetEnvironment: ${{ iif(parameters.deployToProd, 'production', 'staging') }}
stages:
-
stage: Build jobs:
- job: BuildApp
pool:
vmImage: 'ubuntu-24.04' # New image
steps:
- script: npm run build
- job: BuildApp
pool:
vmImage: 'ubuntu-24.04' # New image
steps:
-
stage: Test dependsOn: Build jobs:
- job: RunTests
pool:
vmImage: 'ubuntu-24.04'
steps:
- script: npm test
- job: RunTests
pool:
vmImage: 'ubuntu-24.04'
steps:
-
stage: Deploy_USEast dependsOn: Test condition: succeeded() variables: region: 'eastus' jobs:
- deployment: DeployToUSEast environment: ${{ variables.targetEnvironment }} pool: vmImage: 'ubuntu-24.04' strategy: runOnce: deploy: steps: - script: | echo "Deploying to $(region)" echo "Requested by: $(Build.StageRequestedBy)"
-
stage: Deploy_EUWest dependsOn: Test # Parallel with Deploy_USEast condition: succeeded() variables: region: 'westeurope' jobs:
- deployment: DeployToEUWest environment: ${{ variables.targetEnvironment }} pool: vmImage: 'ubuntu-24.04' strategy: runOnce: deploy: steps: - script: | echo "Deploying to $(region)" echo "Requested by: $(Build.StageRequestedBy)"
Stage dependencies visualized clearly in UI (Sprint 254)
Continuous Access Evaluation (Sprint 260 - August 2025)
Enhanced Security with CAE
Azure DevOps now supports Continuous Access Evaluation (CAE), enabling near real-time enforcement of Conditional Access policies through Microsoft Entra ID.
Key Benefits:
-
Instant access revocation on critical events
-
No waiting for token expiration
-
Enhanced security posture
Triggers for Access Revocation:
-
User account disabled
-
Password reset
-
Location or IP address changes
-
Risk detection events
-
Policy violations
Example Scenario:
Your pipeline with CAE enabled automatically
stages:
- stage: Production
jobs:
- deployment: Deploy environment: 'production' pool: vmImage: 'ubuntu-24.04' strategy: runOnce: deploy: steps: - script: echo "Deploying..." # If user credentials are revoked mid-deployment, # CAE will instantly terminate access
Implementation:
-
General availability: August 2025
-
Phased rollout to all customers
-
No configuration required (automatic for all Azure DevOps orgs)
-
Works with Microsoft Entra ID Conditional Access policies
Security Improvements:
-
Immediate response to security events
-
Reduces attack window from hours/days to seconds
-
Complements existing security features (Key Vault, branch policies, etc.)
OAuth Apps Deprecation (April 2025)
Important Change:
-
Azure DevOps no longer supports new registrations of Azure DevOps OAuth apps (effective April 2025)
-
First step towards retiring the Azure DevOps OAuth platform
-
Existing OAuth apps continue to work
-
Plan migration to Microsoft Entra ID authentication
Migration Recommendations:
Use service connections with Microsoft Entra ID instead
- task: AzureCLI@2 inputs: azureSubscription: 'service-connection' # Uses Managed Identity or Service Principal scriptType: 'bash' scriptLocation: 'inlineScript' addSpnToEnvironment: true inlineScript: | az account show
SNI Requirement (April 2025)
Network Requirement:
-
Server Name Indication (SNI) required on all incoming HTTPS connections
-
Effective: April 23, 2025
-
Affects all Azure DevOps Services connections
What to Check:
-
Ensure clients support SNI (most modern clients do)
-
Update legacy tools/scripts if needed
-
Test connectivity before April 23, 2025
OAuth Apps Deprecation (Sprint 261 - September 2025)
Critical Security Change:
Azure DevOps is enforcing one-time visibility for OAuth client secrets:
-
Newly generated client secrets displayed only once at creation
-
Get Registration Secret API will be retired
-
Change effective: September 2, 2025
-
No new OAuth app registrations allowed
Migration Path:
Replace OAuth apps with Microsoft Entra ID authentication
Use service connections with Managed Identity or Service Principal
- task: AzureCLI@2 inputs: azureSubscription: 'entra-id-service-connection' scriptType: 'bash' addSpnToEnvironment: true inlineScript: | az account show # Authenticated via Entra ID
Action Required:
-
Audit existing OAuth apps
-
Plan migration to Entra ID authentication
-
Update CI/CD pipelines to use service connections
-
Document secret rotation procedures
Agent Software Version 4 (October 2024 - Current)
Major Upgrade:
The Azure Pipelines agent has been upgraded from v3.x to v4.x, powered by .NET 8:
Key Improvements:
-
Built on .NET 8 for better performance and security
-
Extended platform support including ARM64
-
Improved reliability and diagnostics
-
Better resource management
Platform Support:
-
Linux: Debian 11 & 12, Ubuntu 24.04, 22.04, 20.04 (ARM64 supported)
-
macOS: Intel and Apple Silicon (ARM64 supported)
-
Windows: Windows Server 2019, 2022, 2025
ARM64 Support:
Self-hosted ARM64 agent
pool: name: 'arm64-pool' demands: - agent.os -equals Linux - Agent.OSArchitecture -equals ARM64
steps:
- script: uname -m displayName: 'Verify ARM64 architecture'
Note: ARM64 support is available for self-hosted agents. Microsoft-hosted ARM64 macOS agents are in preview.
Sprint 262 - GitHub Copilot Integration (2025)
AI-Powered Work Item Assistance (Private Preview):
Connect Azure Boards work items directly with GitHub Copilot:
Capabilities:
-
Send work items to Copilot coding agent
-
AI-assisted bug fixes
-
Automated feature implementation
-
Test coverage improvements
-
Documentation updates
-
Technical debt reduction
Usage Pattern:
-
Create work item in Azure Boards
-
Add detailed requirements in description
-
Send to GitHub Copilot
-
Copilot generates code changes
-
Review and merge via standard PR process
Integration with Pipelines:
Work items auto-link with PRs
trigger: branches: include: - feature/*
Mention work item in commit
Example: "Fix login bug AB#12345"
Automatically links PR to work item and tracks in build
Resources
-
Azure DevOps Sprint 262 Update
-
Azure DevOps Sprint 261 Update
-
Azure DevOps Sprint 260 Update
-
Azure DevOps Sprint 254 Update
-
Agent Software Version 4
-
Expression Functions Documentation
-
Hosted Agent Images
-
Continuous Access Evaluation Documentation