Skip to content

Flavors

What Are Flavors?

Garden Linux's flavor system solves a fundamental challenge: how to create dozens of specialized operating system images for different platforms, architectures, and use cases without creating a maintainability nightmare. At its core, a flavor is not a standalone definition, but a composition of smaller, reusable components called features.

Imagine needing to create images for:

  • AWS, Azure, GCP, OpenStack, BareMetal ... platforms
  • Each with amd64 and arm64 architectures
  • Some with TPM2 and/or SecureBoot features
  • Most for the Gardener/Kubernetes use case
  • Some for different use cases

The combinatorial explosion of possibilities would be impossible to manage if each image variant required a complete, independent definition. The flavor system addresses this by separating concerns into three dimensions:

  1. Target - The platform or environment (e.g., aws, azure, baremetal)
  2. Features - Capabilities and configurations (e.g., gardener, _prod, _usi)

This compositional approach allows Garden Linux to generate many unique flavor variants from the simple YAML definitions in flavors.yaml.

The Composition Philosophy

The flavor system embodies Garden Linux's customizable design philosophy. Instead of creating separate, hand-crafted images for each use case, we compose images from standardized building blocks.

Feature-Based Design

Features are the primary building blocks. -python(Python),bare-nodejs(Node.js), andbare-sapmachine` (Java/SAP). These images have a minimal footprint and attack surface, omitting shells and package managers by design. A feature is not just a package list, but a complete configuration unit that may include:

  • Packages - APT packages to install
  • Configuration files - System configuration with appropriate defaults
  • Scripts - Setup and lifecycle scripts
  • Dependencies - A list of other Features to include/exclude

For example, the gardener feature doesn't just install containerd it also configures systemd services and includes other features as log to set up logging.

TIP

A complete list of features can be seen in the Features Reference.

Target Abstraction

Targets represent deployment platforms, but they're designed to minimize duplication. The aws target doesn't copy-paste all cloud-related configuration - it inherits base cloud configuration and adds AWS-specific elements like EC2 instance metadata handling and other AWS-specific settings-python(Python),bare-nodejs(Node.js), andbare-sapmachine` (Java/SAP). These images have a minimal footprint and attack surface, omitting shells and package managers by design. .

This hierarchical inheritance allows the flavor system to:

  • Promote consistency - Common cloud configurations are shared
  • Reduce errors - Changes to base cloud configuration propagate to all platforms
  • Simplify maintenance - Platform-specific issues are isolated

The Publication Pipeline

The flavor system not only defines what to build, but also manages the journey from development to production through the build/test/publish triad.

Selective Publication

Not all built flavors are published to end users. The publish flag in flavors.yaml controls distribution:

yaml
- features:
    - gardener
    - _prod
  arch: amd64
  build: true
  test: true
  test-platform: true
  publish: true

This separation enables several important workflows:

  • Internal testing of new configurations before public release
  • Restricted use of compliance images that have licensing constraints
  • Gradual rollout of stable images to production
  • Rapid iteration on experimental features without affecting users

TIP

More information can be looked up in the Flavors Configuration Reference

From Build to Publish

The publication pipeline follows a staged maturity model:

  1. Build: Create the image from feature components
  2. Test: Run validation suites across platforms (chroot, qemu, cloud)
  3. Publish: Distribute to public channels (S3, GHCR, GitHub)

Each stage acts as a gate. A flavor might have build: true but test: false during initial development. Once tests pass reliably, it can progress to test: true and eventually publish: true.

The CNAME System

As flavors progress through the pipeline, they receive a canonical name (CNAME) that uniquely identifies them. The CNAME format {target}-{features}-{arch}-{version}-{commit} serves several critical functions:

  • Unique identification: No two artifacts have the same name
  • Traceability: The CNAME contains all information needed to reproduce the build
  • Automation: CI/CD pipelines can programmatically reference specific image variants
  • Distribution: S3 paths and container tags are derived from the CNAME

The CNAME system ensures that what was tested is exactly what gets deployed.

Integration Points

The flavor system integrates with several other components in the Garden Linux ecosystem:

gl-flavors-parse Tool

The gl-flavors-parse command-line tool parses flavors.yaml and generates filtered output matrices. It's details can be looked up in the Python Library Command-lin Interface

bash
# Generate build matrix for publishable flavors
gl-flavors-parse --publish --json-by-arch

This parsing step transforms the static configuration into a dynamic build plan.