Release Process
This page is intended for Release Managers and describes the release process used by Tenstorrent firmware.
Overview
The following steps are required to be followed by firmware release engineers when creating a new Tenstorrent firmware release.
The release process consists of the following high level steps:
Create a release branch from main, and increment the version on main to the next minor version.
Create a release candidate (RC) from the release branch and post it to GitHub.
Announce the RC via internal channels, providing a link to the GitHub release page.
Sync with qualification team to kick off qualification testing on the RC.
Backport any critical fixes to the release branch.
Create new RCs as needed until the RC is validated by the qualification team.
Once the final RC has been validated, create a final release and post it to GitHub.
Announce the release via internal channels, providing a link to the GitHub release page.
Release Flow
This is the sequential process for taking a release from an initial release candidate through to a validated final release. Each step below references the Shared Building Blocks where appropriate.
Creating the Release Branch and First RC
Firmware follows a release candidate (RC) process. The RC process is used to allow for testing and validation of firmware before a final release is made. Each RC is tagged and posted to GitHub as a pre-release, and the final release is tagged and posted to GitHub as a stable release.
There are two ways to create the release branch and first RC: an automated script (recommended for the common case), or the manual steps below (useful for understanding what the script does, or when a step needs manual intervention). Both paths produce the same result.
Option 1: Automated (Recommended)
Note
The steps below require the GitHub CLI tool to be installed and
authenticated. You can verify that you are authenticated by running
gh auth status and checking that you have access to the repository.
Installation instructions for the GitHub CLI can be found here:
GitHub CLI - Installation
The manual steps below can be automated using the
scripts/create-release-candidate.sh script, which will create the release
branch, increment the version on main, tag the RC, and push the changes to
GitHub. For example:
# You can specify a different remote (i.e. a personal fork) in order to test
# the script without pushing to the main tt-system-firmware repository. You
# can also specify the --dry-run flag to create all relevant branches and
# tags locally without pushing to GitHub.
./scripts/create-release-candidate.sh git@github.com:tenstorrent/tt-system-firmware.git
Once the script has pushed the branch and RC tag, follow Posting a Release to GitHub to publish the RC as a pre-release.
Option 2: Manual Steps
To start the RC process manually, perform the following steps:
Release Branch Creation - Create a release branch from main with the name
vX.Y-branchwhere X and Y are the major and minor version numbers of the release.Main Version Bump - Immediately after creating the release branch, post a PR incrementing the next minor version on main, and merge after CI is successful. For example, if the release branch is
v19.9-branch, then the version on main should be incremented to 19.10. This step can be performed using the command./scripts/update_versions.sh post-branch, then creating a PR with the commits it creates. Do this as soon as the branch exists, so that commits merged to main after the branch point are not stamped with the release’s version number. This PR can proceed in parallel with the RC steps below; it does not need to block them.RC Version Update - Update the MINOR version field, and set the EXTRAVERSION field to “rc1” in the release branch. For example, if the release branch is
v19.9-branch, then the MINOR version should be set to 9 and the EXTRAVERSION field should be set to “rc1”. This step can be performed using the command./scripts/update_versions.sh rc.RC Tagging - Tag the release branch with the first RC tag, following the format
vX.Y.Z-rc1where X, Y and Z are the major, minor and patch version numbers of the release. For example, if the release branch isv19.9-branch, then the first RC tag should bev19.9.0-rc1. The tag can be created with the commandgit tag -s vX.Y.Z-rc1 -m "tt-system-firmware vX.Y.Z-rc1", where X, Y and Z are the major, minor and patch version numbers of the release.Push to GitHub - Push the release branch and RC tag to GitHub. This will start the CI process for the release from the tag. Once this is complete, follow Posting a Release to GitHub steps to post the RC to GitHub as a published pre-release.
Backports and Validation
Once the RC is posted to GitHub, it is the responsibility of the release manager to work with the qualification team to validate the RC. During the RC process, the following changes are candidates for backporting to the release branch:
Note
No changes (except version increments) should be made to the release branch without also being made to main.
Critical bug fixes that are required for the RC to pass qualification testing. These should be backported to the release branch and included in the next RC.
Documentation updates for features included in the release. These do not require creation of a new RC for validation.
Features, at the discretion of the release manager and qualification team.
Backports should be made via PRs against the release branch. Any change that is not documentation updates should trigger a new RC to be created for validation.
Creating Additional RCs
To create a new RC for validation after the first RC, follow these steps:
RC Version Update - Update the EXTRAVERSION field in the release branch to the next RC version (e.g. “rc2”, “rc3”, etc). This step can be performed using the command
./scripts/update_versions.sh update-rc.Merge Version Bump - Create a PR to the release branch with the change, and merge after CI is successful.
RC Tagging - Tag the release branch with the new RC tag, following the format
vX.Y.Z-rcNwhere X, Y and Z are the major, minor and patch version numbers of the release, and N is the RC version number. For example, if the release branch isv19.9-branchand this is the second RC, then the new RC tag should bev19.9.0-rc2. The tag can be created with the commandgit tag -s vX.Y.Z-rcN -m "tt-system-firmware vX.Y.Z-rcN", where X, Y and Z are the major, minor and patch version numbers of the release, and N is the RC version number.Push to GitHub - Push the new RC tag to GitHub. This will start the CI process for the release from the new RC tag. Once this is complete, follow Posting a Release to GitHub steps to post the new RC to GitHub as a published pre-release.
Creating the Final Release
Once a final RC has been validated by the qualification team, the release manager can create the final release. To create the final release, follow these steps:
Version Finalization - Update the EXTRAVERSION field in the release branch to be empty. This step can be performed using the command
./scripts/update_versions.sh pre-release.Release Tagging - Tag the release branch with the final release tag, following the format
vX.Y.Zwhere X, Y and Z are the major, minor and patch version numbers of the release. For example, if the release branch isv19.9-branch, then the final release tag should bev19.9.0. The tag can be created with the commandgit tag -s vX.Y.Z -m "tt-system-firmware vX.Y.Z", where X, Y and Z are the major, minor and patch version numbers of the release.Push to GitHub - Push the release branch and final release tag to GitHub. This will start the CI process for the release from the final release tag. Once this is complete, follow Posting a Release to GitHub steps to post the final release to GitHub as a published stable release.
Testing the Release Process in a Fork
The release process can be tested by creating a release candidate from a release branch in a personal fork of the repository, and posting the RC to GitHub as a pre-release. This allows you to verify that the RC creation and posting process works correctly, without affecting the main tt-system-firmware repository.
To do so, follow the steps in the Creating the Release Branch and First RC section, but push the release branch and RC tag to a personal fork of the repository instead of the main tt-system-firmware repository. For example,
# Run automated RC creation script, specifying your personal fork as the remote
./scripts/create-release-candidate.sh git@github.com:<username>/tt-system-firmware.git
Note that the release process requires a few secrets to function correctly. These can be added within the “Settings > Secrets and variables > Actions” page of the repository on GitHub. For testing purposes, you can add these secrets to your personal fork as well.
SIGNATURE_KEY: This should be the private key used to sign DMFW and CMFWduring release. To generate, run
openssl genrsa -out private_key.pem 2048 && base64 -i private_key.pem
PKG_SIGNING_KEY_DEB: This should be an ASCII-armored GPG key used tosign Debian packages during release. To generate, run
gpg --gen-keyand follow the prompts to create a new GPG key, then export the key withgpg --armor --export <key-id>. Note: the key cannot have a passphrase set- just leave the passphrase blank when creating the key.