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