Arcade SDK is the core infrastructure tooling used across the .NET ecosystem for consistent build, test, packaging, signing, and deployment processes. This repository contains over 50 projects providing MSBuild tasks, SDK components, Helix testing infrastructure, SignTool, and shared build tooling.
Always reference these instructions first and fallback to search or bash commands only when you encounter unexpected information that does not match the info here.
- NEVER install an SDK. It is installed by building the repository.
- CRITICAL: Requires access to Azure DevOps package feeds (dev.azure.com/dnceng)
- If build fails with "Unable to load service index" errors, network access to Azure feeds is blocked
- Key feeds: dotnet-public, dotnet-tools, dotnet-eng, dotnet9, dotnet10 (see NuGet.config)
NEVER CANCEL BUILDS OR TESTS - they may take 90+ minutes. Always use appropriate timeouts.
# Full restore, build, and test - TAKES 90+ MINUTES - NEVER CANCEL
timeout 6000 ./build.sh --restore --build
# Set timeout to 100+ minutes (6000 seconds) for build commands
# Test execution - TAKES 30+ MINUTES - NEVER CANCEL
timeout 2400 ./build.sh --restore --build --test
# Set timeout to 40+ minutes (2400 seconds) for test commands
# Restore only (faster for dependency checks)
timeout 1800 ./build.sh --restore
# Set timeout to 30+ minutes (1800 seconds) for restore
# Clean build artifacts
./build.sh --clean- Linux/macOS:
./build.sh,./test.sh,./restore.sh - Windows:
Build.cmd,Test.cmd,Restore.cmd - All commands use
eng/common/build.shoreng/common/Build.ps1internally
- Microsoft.DotNet.Arcade.Sdk: Core MSBuild SDK with props/targets for consistent builds
- Microsoft.DotNet.Helix: Distributed testing infrastructure (Client, JobSender, Sdk)
- Microsoft.DotNet.SignTool: Code signing automation and certificate management
- Microsoft.DotNet.Build.Tasks.Feed: NuGet package publishing and feed management
- Microsoft.DotNet.Build.Tasks.Packaging: NuGet package creation and validation
- Microsoft.DotNet.Build.Tasks.Installers: MSI/PKG installer generation
- Microsoft.DotNet.Build.Tasks.Workloads: .NET workload packaging
- Microsoft.DotNet.Build.Tasks.VisualStudio: VSIX and VS insertion support
- Microsoft.DotNet.XUnitExtensions: Enhanced XUnit capabilities for .NET testing
- Microsoft.DotNet.RemoteExecutor: Cross-platform process execution for tests
- Microsoft.DotNet.PackageTesting: Automated package validation testing
artifacts/
├── bin/ # Compiled binaries by project/configuration
├── packages/ # Generated NuGet packages (Shipping/NonShipping)
├── TestResults/ # Unit and integration test results
├── log/ # Build logs and binary logs (.binlog)
├── tmp/ # Temporary build artifacts
└── toolset/ # Downloaded build tools and dependencies
After making changes, ALWAYS run complete validation scenarios:
# Build validation - NEVER CANCEL - 90+ minute timeout
timeout 6000 ./build.sh --restore --build --configuration Release --test- Unit Tests: Individual project test suites (tests/*.Tests.csproj)
- Integration Tests: Cross-component validation via Helix
- SDK Tests: Validate Arcade SDK works in sample projects
- Packaging Tests: Ensure generated packages are valid
- Create new project under
src/Microsoft.DotNet.Build.Tasks.* - Reference
Microsoft.Build.Utilities.CoreandMicrosoft.Build.Framework - Add props/targets files for MSBuild integration
- Include in
Arcade.slnxsolution file - ALWAYS add unit tests for new tasks
- Follow naming convention:
Microsoft.DotNet.* - Update
eng/Versions.propswith version dependencies - Add to appropriate
Directory.Packages.propsif needed - Validate packaging via:
./build.sh --pack --configuration Release
- Create test projects targeting
$(BundledNETCoreAppTargetFramework)framework - Configure in
tests/UnitTests.projfor Helix execution - Use XUnit with
Microsoft.DotNet.XUnitExtensionsfor enhanced capabilities - Test timeout default: 300 seconds (override with XUnitWorkitemTimeout)
- "Could not resolve SDK Microsoft.DotNet.Arcade.Sdk": Network connectivity to Azure feeds issue
- Wrong .NET version: Run
./eng/common/dotnet.shto install correct SDK - MSBuild errors: Check
artifacts/log/for detailed binary logs (.binlog)
- Check
artifacts/TestResults/for detailed test output - Use
--verbosity diagnosticfor detailed MSBuild logging - Helix test failures: Check Azure DevOps Helix console for distributed test results
- IDE: Use Visual Studio 2019+ or VS Code with C# extension
- Required: MSBuild 16.8+ (included with correct .NET SDK)
- Recommended: Install .NET Upgrade Assistant for migration scenarios
- Azure DevOps Feeds: Required for package restore (dnceng organization)
- Maestro/BAR: Dependency flow automation (internal Microsoft systems)
- MicroBuild: Code signing and compliance (Microsoft internal)
- NuGet.org: For third-party packages (when not source-mapped)
- GitHub: Source code and issue tracking
- Build artifacts: Published to Azure blob storage
- PR Validation:
azure-pipelines-pr.yml(90-minute timeout) - Official Builds:
azure-pipelines.yml(90-minute timeout + validation) - Daily Builds:
azure-pipelines-daily.yaml(extended validation)
- Build: Restore, build, pack (90 minutes)
- Test: Unit and integration tests (30 minutes)
- Validate SDK: Test against sample projects (90 minutes)
- Publish: Package publishing and signing (varies)
- Build Times: Expect 45-90 minutes for full builds, 15-30 minutes for tests
- Timeouts: Always set 90+ minute timeouts for builds, 30+ minutes for tests
- Cancellation: NEVER CANCEL long-running operations - they will complete
- Dependencies: This repo builds infrastructure used by 100+ .NET repositories
- Servicing: Changes affect the entire .NET ecosystem - test thoroughly
- Validation: Manual testing required - automated tests don't cover all scenarios
- Issues: File in dotnet/arcade repository for all infrastructure problems
- Discussions: Use dotnet/arcade discussions for questions
- Documentation: See
/Documentation/folder for detailed guides - Contact: @dotnet/dnceng team for infrastructure issues