Typed builds that feel like real C#.
ANDO executes a single build.ando file with top-level statements and typed operations. No YAML, no DSLs, no ceremony.
ANDO runs every workflow inside a Docker container for clean, reproducible builds. Your repo is mounted into /workspace, and the CLI manages container lifecycle.
shell
ando run
ando run --cold
ando run --image my-custom-image Example build.ando
A single C# file defines projects, tools, workflow settings, and operations.
build.ando
// Project references
var WebApi = Project.From("./src/WebApi/WebApi.csproj");
var Frontend = Project.From("./src/Frontend");
// Tools
var EfTool = Dotnet.Tool("dotnet-ef", version: "8.0.0");
var NodeTool = Node.Use(version: "20.11.0");
// Workflow
Workflow("ci", w =>
{
w.Configuration = Configuration.Release;
w.Verbosity = Verbosity.Minimal;
});
// Backend build
Dotnet.Restore(WebApi);
Dotnet.Build(WebApi);
Dotnet.Test(WebApi);
// Frontend build
Npm.Ci();
Npm.Run("build");
// Publish
Dotnet.Publish(WebApi, o => o
.Output(Context.Paths.Artifacts / "publish" / "api")); ANDO commands
The CLI provides a small, focused surface area.
| Command | Description |
|---|---|
ando | Run the build script (same as 'ando run'). |
ando run | Run the build script in a Docker container. |
ando clean | Remove artifacts, temp files, and containers. |
ando help | Show available commands and options. |
Run options
| Flag | Description |
|---|---|
--verbosity <level> | Set output verbosity (quiet|minimal|normal|detailed). |
--no-color | Disable colored output. |
--cold | Always create a fresh container (ignore warm cache). |
--image <image> | Use a custom Docker image. |
--dind | Mount Docker socket for Docker-in-Docker builds. |
Clean options
| Flag | Description |
|---|---|
--artifacts | Remove the artifacts directory. |
--temp | Remove temp directory. |
--cache | Remove NuGet and npm caches. |
--container | Remove the project's warm container. |
--all | Remove all of the above. |
All Operations
Each operation registers a deterministic step and runs inside the container.
| Operation | Description |
|---|---|
AppService.CreateSlot | Create a new deployment slot. |
AppService.DeleteSlot | Delete a deployment slot. |
AppService.DeployWithSwap | Deploy to a slot then swap to production (zero-downtime). |
AppService.DeployZip | Deploy an app service using zip deploy. |
AppService.ListSlots | List deployment slots for an app service. |
AppService.Restart | Restart an app service. |
AppService.Start | Start an app service. |
AppService.Stop | Stop an app service. |
AppService.SwapSlots | Swap deployment slots. |
Azure.CreateResourceGroup | Create a resource group if it doesn't exist. |
Azure.DeleteResourceGroup | Delete a resource group and all its resources. |
Azure.EnsureLoggedIn | Verify the user is logged in to Azure CLI. |
Azure.LoginWithManagedIdentity | Login with Managed Identity (for Azure-hosted environments). |
Azure.LoginWithServicePrincipal | Login with a Service Principal (for CI/CD). |
Azure.SetSubscription | Set the active Azure subscription. |
Azure.ShowAccount | Display current Azure account information. |
Bicep.Build | Compile a Bicep file to ARM JSON template. |
Bicep.DeployToResourceGroup | Deploy a Bicep template to a resource group. |
Bicep.DeployToSubscription | Deploy a Bicep template at subscription scope. |
Bicep.WhatIf | Preview what would be deployed (what-if analysis). |
Cloudflare.EnsureAuthenticated | Verify Cloudflare credentials. Prompts interactively if environment variables are not set. See authentication for setup. |
Cloudflare.InDirectory | Set the working directory for Cloudflare commands. |
Cloudflare.PagesCreateProject | Create a new Cloudflare Pages project. |
Cloudflare.PagesDeploy | Deploy the ./dist directory to Cloudflare Pages. |
Cloudflare.PagesDeployDirectory | Deploy a specific directory to Cloudflare Pages. |
Cloudflare.PagesListDeployments | List deployments for a Cloudflare Pages project. |
Cloudflare.PagesListProjects | List all Cloudflare Pages projects. |
Dotnet.Build | Compile a project with optional configuration. |
Dotnet.Publish | Create deployment artifacts with full publish options. |
Dotnet.Restore | Restore NuGet packages for a project. |
Dotnet.Test | Run unit tests for a project. |
Dotnet.Tool | Create a reference to a .NET CLI tool for installation. |
DotnetSdk.Install | Install .NET SDK globally in the container. Skips installation if already present (for warm containers). |
Ef.AddMigration | Create a new EF Core migration. |
Ef.DatabaseUpdate | Apply pending EF Core migrations to the database. |
Ef.DbContextFrom | Create a reference to a DbContext in a project. |
Ef.RemoveMigration | Remove the last migration. |
Ef.Script | Generate an idempotent SQL migration script. |
Functions.DeployWithSwap | Deploy to a slot then swap to production (zero-downtime). |
Functions.DeployZip | Deploy a function app using zip deploy. |
Functions.Publish | Publish using Azure Functions Core Tools. |
Functions.Restart | Restart a function app. |
Functions.Start | Start a function app. |
Functions.Stop | Stop a function app. |
Functions.SwapSlots | Swap deployment slots. |
Node.Install | Install Node.js globally in the container. Skips installation if already present (for warm containers). |
Npm.Build | Run 'npm run build'. |
Npm.Ci | Run 'npm ci' for clean, reproducible installs (preferred for CI). |
Npm.InDirectory | Set the working directory for npm commands. |
Npm.Install | Run 'npm install' to install dependencies. |
Npm.Run | Run an npm script from package.json. |
Npm.Test | Run 'npm test'. |
52 operations