Skip to main content

Prerequisites

  • Docker with buildx
  • BuildCharts installed
  • A repository root that contains a .sln or .slnx files

Scaffold a repository

Run buildcharts init from the repository root.
In a .NET repository, this command:
  • Creates build.yml
  • Creates charts/buildcharts/Chart.yaml
  • Creates .github/workflows/buildcharts.yml when the Git remote points to GitHub

Use the built-in .NET charts

BuildCharts ships with first-class .NET charts for common stage types. These are a practical starting point when you want working defaults before you introduce your own chart ecosystem. The built-in .NET chart set is documented here: The shipped Dockerfiles cover the common .NET workflows:
  • build runs dotnet build
  • test runs dotnet test and prepares test artifacts
  • nuget runs dotnet pack and prepares package output
  • publish runs dotnet publish
  • docker publishes the app and assembles the runtime image
These charts are implemented as reusable Dockerfiles behind the chart aliases you reference from build.yml.

Dependency chart

This file maps target aliases in build.yml to the built-in .NET charts.

Review the generated metadata

This shape matches the shipped samples:
You must define exactly one build target.

Parallelization: multiple targets vs dotnet test

build and test can also be placed directly on the solution target. This works well for .NET because dotnet build and dotnet test can run directly against a solution, so the solution can act as the shared source for both stages:
That shifts test parallelization to dotnet test, which then delegates to the test framework and runner, such as xUnit, NUnit, or MSTest. The tradeoff is execution strategy:
  • Solution-level test keeps the config simpler and matches normal .NET workflows
  • Separate test targets can let Docker Bake parallelize more work across targets
  • Separate targets may also benefit differently from Docker layer caching
Which model is faster depends on your solution shape, test layout, hardware, number of tests, and how test assemblies are distributed, so benchmark both if build time matters.
From .NET 9, tests for the same project run in parallel across different target frameworks.

Create a lock file (optional)

Pin chart digests to make generation repeatable and avoid accidental drift. When a lock file is present, buildcharts generate checks for mismatches against charts/buildcharts/Chart.yaml before generating the build plan. For details, see Lock files. Create the lock file with:

Generate and run the plan

Bash:
PowerShell:

Signature verification (optional)

The built-in .NET charts are published as OCI artifacts and signed with Cosign in GitHub Actions. You can verify a chart signature before using or trusting a chart digest. Install cosign and verify the chart by digest:
When using a lock file, the digest is available in charts/buildcharts/Chart.lock. That makes the lock file the natural source for verification input during CI or review.

Next steps

Last modified on June 2, 2026