# OpenTofu release manual > [!WARNING] > This manual is intended for OpenTofu core and fork maintainers. If you are looking for the normal contribution guide, see [this file](CONTRIBUTING.md). This manual describes how to create an OpenTofu release. OpenTofu has two kinds of releases. Alpha and Beta releases are created from the `main` branch, while we split off a version (e.g. `v1.8`) branch before creating an `rc` or `stable` release. --- ## Naming in this document - **Alpha** is an early preview release. This is versioned `X.Y.0-alphaW`, where `X`,`Y` and `W` are numbers, such as `1.2.0-alpha1`. - **Beta** is a semi-stable preview release. This is versioned `X.Y.0-betaW`, where `X`,`Y` and `W` are numbers, such as `1.2.0-beta1`. - **RC** is a release candidate which does not have new features over a beta. This is versioned `X.Y.0-rcW`, where `X`,`Y` and `W` are numbers, such as `1.2.0-rc1`. - **Stable** is a release that has no new features and bug fixes over an RC. This is versioned `X.Y.0`, where `X` and `Y` are numbers, such as `1.2.0`. - **Point release** is a release that contains bugfixes only on top of a stable release. This is versioned `X.Y.Z` where `X`, `Y` and `Z` are numbers, such as `1.2.3`. --- ## Gathering the team for a release To create a release, make sure you have people on standby with the following credentials: - Cloudflare - PackageCloud - Snapcraft - Linkedin - X --- ## Preparing public relations collaterals for a release Before you start creating a release, make sure you have the following marketing collaterals ready to be published:
### Alpha version (`X.Y.0-alphaW`) - Feature Preview video for upcoming flagship features (see https://www.youtube.com/@opentofu for examples) - "Help us test..." blog post (see https://opentofu.org/blog/ for examples) - Community Slack announcement - Linkedin and X posts
### Beta (`X.Y.0-betaW`) - "Get ready for..." blog post (see https://opentofu.org/blog/ for examples) - Community Slack announcement - Linkedin and X posts
### Release Candidate (`X.Y.0-rcW`) - Community Slack announcement - Linkedin and X posts
### Stable release (`X.Y.0`) - Release blog post with the feature and community highlights since the last release (see https://opentofu.org/blog/ for examples) - Community Slack announcement - Linkedin and X posts
### Point release (`X.Y.Z`) - Community Slack announcement
--- ## Preparing the repository for a release Before you can create a release, you need to make sure the following files are up to date: - [CHANGELOG.md](CHANGELOG.md) (Note: do not remove the `(unreleased)` string from the version number before the stable release.) - [version/VERSION](version/VERSION) Ideally, make sure these changes go in as the last PR before the release. --- ## Tagging the release Now that you have the files up to date, do the following: 1. On your computer, make sure you have checked out the correct branch: * `main` for `alpha` and `beta` releases * `vX.Y` for any other releases (assuming you are releasing version `X.Y.Z`) 2. Make sure the branch is up-to-date by running `git pull` 3. Create the correct tag: `git tag -m "X.Y.Z" vX.Y.Z` (assuming you are releasing version `X.Y.Z`) * If you have a GPG key, consider adding the `-s` option to create a GPG-signed tag 4. Push the tag: `git push origin vX.Y.Z` --- ## Creating the release Now comes the big step, creating the actual release. 1. Head on over to the [Actions tab](https://github.com/opentofu/opentofu/actions) on the main repository 2. Select the `release` workflow on the left side 3. Click the `Run workflow` button, which opens a popup menu 4. Select the correct branch: * For `alpha` releases, select the `main` branch * For all other releases, select the appropriate version branch 5. Enter the correct git tag name: `vX.Y.Z` 6. If you are releasing the latest `X.Y` version, check the `Release as latest?` option. 7. If you are releasing an `alpha`, `beta` or `rc` version, check the `Release as prerelease?` option. 8. Click the `Run workflow` button. Now the release process will commence and create a *draft* release on GitHub. If you did not check the prerelease option, it will also publish to Snapcraft and PackageCloud. --- ## Publishing the GitHub release The release process takes about 30 minutes. When it is complete, head over to the [Releases section](https://github.com/opentofu/opentofu/releases) of the main repository and find the new draft release. Change the following settings - Edit the text (see the examples below). - Check `Set as a pre-release` if you are releasing an alpha, beta, or release candidate. - Check `Set as the latest release` if you are releasing a stable or point release for the latest major version. Do not check this checkbox if you are releasing a point release for an older major version. - Check `Create a discussion for this release` if you are releasing a stable (`X.Y.0`) version. - Click `Publish release`
### Alpha, beta, or release candidate Create a text highlighting how users can test the new features, for example: ```markdown ⚠️ Do not use this release for production workloads! ⚠️ It's time for the first prerelease of the 1.9.0 version! This includes a lot of major and minor new features, as well as a ton of community contributions! The highlights are: * **`for_each` in provider configuration blocks:** An alternate (aka "aliased") provider configuration can now have multiple dynamically-chosen instances using the `for_each` argument: ```hcl provider "aws" { alias = "by_region" for_each = var.aws_regions region = each.key } ``` Each instance of a resource can also potentially select a different instance of the associated provider configuration, making it easier to declare infrastructure that ought to be duplicated for each region. ```
### Stable release (`X.Y.0`) Create a more elaborate text explaining the flagship features of this release, ideally linking to the blog post and/or video for the release, for example: ```markdown We're proud to announce that OpenTofu 1.8.0 is now officially out! 🎉 ## What's New? * Early variable/locals evaluation * Provider mocking in `tofu test` * Resource overrides in `tofu test` * Override files for OpenTofu: keeping compatibility * Deprecation: `use_legacy_workflow` has been removed from the S3 backend-backend See the launch post on our blog: https://opentofu.org/blog/opentofu-1-8-0/ For all the features, see the [detailed changelog](https://github.com/opentofu/opentofu/blob/v1.8.0/CHANGELOG.md). You can find the full diff [here](https://github.com/opentofu/opentofu/compare/v1.7..v1.8.0). ```
### Point release (`X.Y.Z`) For point releases, simply copy the section from the [CHANGELOG.md](CHANGELOG.md) file.
--- ## Updating `get.opentofu.org` In order for the installer script to work, you will need to update the https://get.opentofu.org/tofu/api.json file. You can do this by logging in to Cloudflare and go to the [`opentofu-get` project in Cloudflare Pages](https://dash.cloudflare.com/84161f72ecc1f0274ab2fa7241f64249/pages/view/opentofu-get). Here click the three dots on the latest production deployment and click `Retry deployment`. --- ## Updating the website/documentation Depending on the release type, you will need to update the [opentofu.org](https://github.com/opentofu/opentofu.org) repository. Before you begin, make sure that all submodules are up to date by running: ``` git submodule init git submodule update ``` > [!WARNING] > If you are using Windows, make sure your system supports symlinks by enabling developer mode and enabling symlinks in git.
### Alpha (`X.Y.Z-alphaW`), Beta (`X.Y.Z-betaW`) and Release Candidate (`X.Y.Z-rcW`) We do not release documentation for non-stable releases. There is no action needed beyond publishing the blog post.
### Stable (`X.Y.0`) 1. Add a submodule for the new release to the website repository: ``` git submodule add -b vX.Y https://github.com/opentofu/opentofu opentofu-repo/vX.Y ``` 2. After you have done this, open the [`docusaurus.config.ts`](https://github.com/opentofu/opentofu.org/blob/main/docusaurus.config.ts) file and `presets` section. 3. Here, locate the previous latest version: ``` "vX.Y-1": { label: "X.Y-1.x", path: "", }, ``` Change it to: ``` "vX.Y-1": { label: "X.Y-1.x", path: "vX.Y-1", banner: "none", }, ``` 4. Now add the new version you are releasing: ``` "vX.Y": { label: "X.Y.x", path: "", }, ``` 5. After this is set, change the `lastVersion` option to point to your version. 6. Now locate any version that is no longer supported and remove the following line to add a deprecation warning: ``` banner: "none", ``` 7. Finally, locate the `navbar` option and `Docs` dropdown to reflect the new version list. It should look something like this: ``` items: [ { label: "vX.Y.x (current)", href: "/docs/" }, { label: "vX.Y-1.x", href: "/docs/vX.Y-1/" }, // ... { label: "Development", href: "/docs/main/" }, ], ```
### Point release (`X.Y.Z`) For a point release, you merely need to make sure that the submodules for the supported versions are up to date. You can do this by running the following script: ```bash cd opentofu-repo for ver in $(ls); do cd "${ver}" git pull origin "${ver}" cd .. git add "${ver}" done ``` Now you can commit your changes and open a pull request. > **Note:** You can safely run the script above anytime you need to update the documentation independently of a release. It's ok for the website to have minor doc fixes that are not in line with OpenTofu releases.
--- ## Testing the release Make sure you have a Linux box with Snapcraft installed and download the installer shell script from `https://get.opentofu.org/install-opentofu.sh`. Now test the following 3 installation methods to make sure all distribution points are up to date. 1. Snapcraft (stable and point releases only): * `sudo snap install opentofu --classic` * `tofu --version` * `sudo snap uninstall opentofu` 2. Deb (stable and point releases only) * `./install-opentofu.sh --install-method deb` * `tofu --version` * `apt remove --purge tofu` 3. Standalone: * `./install-opentofu.sh --install-method standalone --opentofu-version X.Y.Z` * `/usr/local/bin/tofu --version` * `sudo rm -rf /opt/opentofu /usr/local/bin/tofu` --- ## Posting the announcement Once you are happy that the release works, post the announcements to the following places: - Alpha: Community Slack, Linkedin, X, Blog, YouTube - Beta: Community Slack, Linkedin, X, Blog - Stable: Community Slack, Linkedin, X, Blog - Point release: Community Slack