RFC: the perfect release process
Decision Due Date: 2025-09-09
Context and Problem Statement
Usually, a release process consists of the following steps:
- decision a release is due
- preparation of release metadata (version bump, changelog, contributors etc)
- storing the release in VCS (commiting the metadata, creating a tag)
- creating of release artifacts (gem etc)
- publishing release artifacts (rubygems.org, GH release)
- notifying downstream consumers of the release (mail/blog/social announcement, packaging)
Ideally, most of these steps can be automated and human interaction is only needed to kick off the process (pipeline) and verify the steps were executed as expected.
The Foreman ecosystem consists of many projects, in different languages, and with different (release) workflows. This makes performing releases complicated and increases reliance on selected persons who know how to do them.
Proposal
To improve the current situation, the following changes are proposed:
- the release process is documented in a dedicated file –
release.md
orreleasing.md
in either the repository root or in the documentation subfolder: - there is a single command to prepare the release metadata
- optionally automated like prepare_release of voxpupuli which updates the version, generates a changelog and opens a PR
- creating and publishing the release artifacts happens via GitHub Actions
- Ruby projects use voxpupuli/ruby-release to build the gem and publish it to rubygems.org using Trusted Publishing when a tag is pushed
- Python projects use pypa/gh-action-pypi-publish to pypi.org using Trusted Publishing when a tag is pushed
- Puppet Module projects use voxpupuli/gha-puppet/release.yml when a tag is pushed
- release.yml of foreman-ansible-modules builds the collection and publishes it to Ansible Galaxy and GH Releases when a tag is pushed
Many Ruby projects already implement publishing via GitHub Actions, but are still using the less secure method of authentication with an API token. Updating those to Trusted Publishing should require very small changes.
Implementing a single command for release preparation can be challenging, depending on the actual project workflows, so we should aim to implement documentation and publishing first.
Decision Outcome
- A project MUST document its release process
- The release documentation SHOULD be in the repository itself using
RELEASE.md
- The release documentation SHOULD NOT be in the released artifact.
- A project SHOULD publish artifacts using GitHub Actions
- If the project publishes artifacts using GitHub Actions, the workflow file MUST be called
.github/workflows/release.yml
- A project MAY implement a single-command release process so developers can run
make release VERSION=x.y.z
To make it easier for projects, the Foreman project as a whole MUST provide a list of recommended GitHub Actions to publish artifacts.
MUST/SHOULD/MAY as described in RFC2119.
We implement “release documentation” and “GitHub Actions publishing” in 2025, with “single-command release process” being a long-term goal of the project.
Impacts
This proposal applies to all repositories in the theforeman
, Katello
, Apipie
, dynflow
, RedHatSatellite
, dm-drogeriemarkt
and markt-de
organizations that regularly produce artifacts.
We’ll create a GitHub project board to track this, and either Redmine or GH issues (depending on the project) for the documentation and publishing tasks. Maintainers, and everyone else who wishes to contribute, please pick up these and help us improve the release process. Ideally we can implement those changes by the end of 2025.