Skip to content

Creating Package Releases ​

This guide explains how to create Garden Linux Package releases.

Release Hierarchy ​

Garden Linux uses a three-tier release hierarchy to deliver a complete operating system.

This document is about the first tier, the Packaging.

Understanding Packaging ​

Please read the Packaging Explanation to get familiar with the concepts of Packaging.

Prerequisites ​

Before creating an OS release, ensure you have:

  • Write access to the gardenlinux/package-* repositories
  • git and gh CLI tool installed and configured

Phase 0: Preparation ​

Step 1: Decide What to Include ​

In tier one, individual packages will need updates based on e.g. recent CVEs. Check for potential upgrades in important packages, too:

  • golang
  • containerd
  • runc
  • curl
  • openssl
  • systemd
  • glibc
  • linux kernel

For each package requiring an update, we need to follow the Package Backporting Guide later.

  1. Navigate to the respective github.com/gardenlinux/package-{name} repository
  2. Create a new package release if needed (see package-build documentation for details)
  3. Note the new version tag for use in the APT repository release

The complexity of updating a package varies:

  • Simple: Packages that rebuild Debian packages with minimal adaptions
  • Complex: Packages with extensive adaptions that may not apply to newer versions, or packages built from upstream sources

For complex updates, thoroughly test the new package version before including it in a release.

Phase 1: Creating the Release ​

Step 1: Create APT Repository Release ​

In tier two, the APT repository must be created before building OS images.

For Major Releases:

Major releases automatically create APT repositories via the nightly update.yml workflow in the repo repository. The workflow:

  • Collects latest package versions from all package-* repositories
  • Creates a new Debian snapshot
  • Generates package-releases and .container files
  • Publishes the APT repository to S3

No manual action is required for major release APT repositories.

For Minor Releases:

Follow the comprehensive guide: Creating APT Repository Releases

Quick summary:

  1. Checkout the base APT repository release tag in the repo repository
  2. Modify package-releases and package-imports files
  3. Commit and create a new tag (e.g., 2150.1.0)
  4. Push the tag to trigger the build

Verify APT Repository:

  • Wait for the repo workflow to complete successfully
  • Verify the APT repository is published to S3

Step 2: Build Garden Linux OS ​

Once the APT repository is ready, we can build the OS images in tier three:

Checkout or Create Release Branch:

bash
# For major releases, create a new release branch from main
git checkout main
git pull
git checkout -b rel-MAJOR
git push origin rel-MAJOR

# For minor releases, checkout the existing release branch
git checkout rel-MAJOR
git pull

Update VERSION File:

bash
# Edit the VERSION file to contain the new version
echo "MAJOR.MINOR.0" > VERSION

# Example for minor release:
echo "2150.1.0" > VERSION

# Commit the change
git add VERSION
git commit -m "Bump version to MAJOR.MINOR.0"
git push origin rel-MAJOR

Trigger Build Workflow:

The build process varies depending on the Garden Linux version:

For releases 2016.0.0 and later (using SemVer):

Use the manual release workflow:

bash
# Using gh CLI:
gh workflow run "Build and publish a release" \
--ref rel-MAJOR \
-f target=release \
-f version=MAJOR.MINOR.0

# Example:
gh workflow run "Build and publish a release" \
--ref rel-2150 \
-f target=release \
-f version=2150.1.0

Or via the GitHub UI:

  1. Go to Actions → Build and publish a release
  2. Click "Run workflow"
  3. Select the rel-MAJOR branch
  4. Set version to MAJOR.MINOR.0
  5. Leave target release
  6. Leave other parameters at defaults

For older releases (1443, 1592 using non-SemVer):

Use the nightly workflow with version parameter:

bash
# Using gh CLI:
gh workflow run nightly.yml \
--ref rel-MAJOR \
-f version=MAJOR.MINOR

# Example for 1443:
gh workflow run nightly.yml \
--ref rel-1443 \
-f version=1443.3

Monitor the Build:

  • Watch the workflow progress in GitHub Actions
  • Verify all build jobs complete successfully
  • Check that artifacts are published

Step 3: Create GitHub Release ​

After the build completes, create the official GitHub release page:

bash
# Run from main branch (not the release branch!)
git checkout main

# Using gh CLI:
gh workflow run "release page" \
--ref main \
-f run_id=<BUILD-RUN-ID>
-f is_latest=true # if this is the latest major.minor.0 version

# Example:
gh workflow run "release page" \
--ref main \
-f run_id=23802291489 \
-f is_latest=true # if this is the latest major.minor.0 version

TIP

Get the "Run ID" from the URL of the "Build and publish a release" workflow run, e.g. https://github.com/gardenlinux/gardenlinux/actions/runs/23802291489

Or via the GitHub UI:

  1. Go to Actions → release page
  2. Click "Run workflow"
  3. Select main branch
  4. Set Build workflow run ID to BUILD-RUN-ID (e.g. 23802291489)

WARNING

Always review the generated release notes before publishing, especially the "Changes" section.

The "Changes" section lists:

  • Upgraded packages in the minor release
  • Fixed CVEs

This data is generated by glvd and may not be perfect. Verify:

  • CVE fixes match your expectations
  • Package upgrades are correctly listed
  • No unexpected changes appear

Tag Manifest for Non-SemVer Releases:

WARNING

For releases that do not use semantic versioning (e.g., 1877.5), add an extra tag for compatibility with Gardener (especially for USI images).

bash
# Example: Tag 1877.5 as 1877.5.0
oras tag ghcr.io/gardenlinux/gardenlinux:1877.5 1877.5.0

Step 4: [ONLY FOR MAJOR RELEASES] Create rel-MAJOR Branch in repo ​

DANGER

This step only applies to new major releases, not minor releases.

Create a release branch in the gardenlinux/repo repository based on the new release tag:

bash
cd /path/to/repo
git pull --tags
git checkout MAJOR.0.0
git checkout -b rel-MAJOR
git push -u origin rel-MAJOR

Example:

bash
cd /path/to/repo
git pull --tags
git checkout 2150.0.0
git checkout -b rel-2150
git push -u origin rel-2150

This branch is used for creating future minor releases of the APT repository.

Step 5: Generate CPE File ​

Generate the Common Platform Enumeration (CPE) file for the new release:

bash
# Run from main branch
gh workflow run "Generate and upload CPE to a release" \
--ref main \
-f version=MAJOR.MINOR.0

# Example:
gh workflow run "Generate and upload CPE to a release" \
--ref main \
-f version=2150.1.0

Or via GitHub UI:

  1. Go to Actions → Generate and upload CPE
  2. Click "Run workflow"
  3. Select main branch
  4. Set version to MAJOR.MINOR.0

Step 6: Update Garden Linux Documentation ​

INFO

TODO: add steps on how to update the documentation

Phase 2: Post-Release Work ​

Verify Release Completeness ​

  • Verify the GitHub release page is complete and accurate
  • Check that all expected artifacts are attached to the release
  • Confirm the CPE file was generated and uploaded
  • Test installation using the new release

Notify Stakeholders ​

  • Notify relevant teams about the new release
  • Gardener OS Extension Team
  • Update any documentation referencing supported versions