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
# Run the build script (reuses existing container for speed)
ando run

# Force a fresh container (useful for debugging)
ando run --cold

Example build.ando

A single C# file defines projects, tools, workflow settings, and operations.

build.ando
// Project and directory references
var WebApi = Project("./src/WebApi/WebApi.csproj");
var Frontend = Directory("./frontend");

// Backend build and publish
Dotnet.Restore(WebApi);
Dotnet.Build(WebApi);
Dotnet.Test(WebApi);
Dotnet.Publish(WebApi, o => o
  .Output(Root / "artifacts" / "api"));

// Deploy backend to Azure App Service
Azure.EnsureAuthenticated();
Artifact.Zip(Root / "artifacts" / "api", Root / "artifacts" / "api.zip");
AppService.DeployWithSwap("my-webapi", Root / "artifacts" / "api.zip");

// Frontend build and deploy
Npm.Ci(Frontend);
Npm.Run(Frontend, "build");

// Deploy frontend to Cloudflare Pages
Cloudflare.EnsureAuthenticated();
Cloudflare.PagesDeploy(Frontend, o => o
  .WithProjectName("my-frontend"));

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.EnsureAuthenticated Authenticate to Azure using the best available method. Checks for service principal credentials (AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_TENANT_ID), then falls back to existing CLI session or interactive login. Prompts to install Azure CLI if not available.
Azure.EnsureLoggedIn Verify the user is logged in to Azure CLI. Fails if not authenticated.
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.PagesCreateProject Create a new Cloudflare Pages project.
Cloudflare.PagesDeploy Deploy the ./dist directory to Cloudflare Pages.
Cloudflare.PagesDeployDirectory Deploy a specific output 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.Install Run 'npm install' to install dependencies.
Npm.Run Run an npm script from package.json.
Npm.Test Run 'npm test'.

51 operations