Release Procedure
This document is a guide for the core team, provided publicly to ensure transparency in the release process.
Versioning
Jellyfin uses semantic versioning. All releases will have versions in the X.Y.Z
format, starting from 10.0.0
. Note however that the 10.Y.Z
release chain represents the "cleanup" of the codebase, so it should be accepted that 10.Y.Z
breaks all compatibility, at some point, with previous Emby-compatible interfaces, and may also break compatibility with previous 10.Y
releases if required for later cleanup work. Our versioning will typically follow the patterns below:
X: Major Versions
- Breaks compatibility with the HTTP or plugin APIs
Y: Minor Versions
- Introduces new features
- Makes minor backwards-compatible API changes
Z: Hotfix Versions
- Critical bug fixes or minor changes
General Release Philosophy
Releases will generally be performed on Sundays "when ready". For Major/Minor releases, the "when ready" is generally quite flexible and is whenever the release is truly ready without major breaking bugs. After a major release, each Sunday the Admin team should review the recently merged PRs and, if backports are required, perform a Hotfix release containing those PRs.
Major Release Procedure
Preparation
-
Testing is ongoing via
master
nightly builds, somaster
should be generally unbroken before proceeding. The version ofmaster
should already reflect the upcoming major release version (i.e.X.Y.0
). -
Once
master
is in a generally stable state after extensive work, announce a "golden nightly" is incoming via the jellyfin-dev Matrix/Riot channel and Forum. -
Collect testing information and repeat as needed.
-
Once the release is considered stable and working, announce full PR freeze via the jellyfin-dev Matrix/Riot channel.
-
Allow one further "golden nightly" and at least 48 hours of testing time. Restart this process if major breaking bugs are found.
-
Once all testing is complete and the release remains stable, proceed.
Release Web Client
-
Create a release branch on the jellyfin-web repository via CLI from
master
, namedrelease-X.Y.z
, whereX
andY
are the new version number, andz
is a literalz
. Push the new branch to GitHub. -
Create a GitHub release for the new version, based on the newly-created
release-X.Y.z
branch. The tag should be namedvX.Y.Z
(i.e.vX.Y.0
) and the release named "Release X.Y.Z". The release body should contain the following link only, replacing the version as required:[Please see the release announcement on the main repository.](https://github.com/jellyfin/jellyfin/releases/tag/vX.Y.Z)
-
Publish the release.
Release Server
-
Create a release branch on the jellyfin repository via CLI from
master
, namedrelease-X.Y.z
, whereX
andY
are the new version number, andz
is a literalz
. Push the new branch to GitHub. -
Create a GitHub release for the new version, based on the newly-created
release-X.Y.z
branch. The tag should be namedvX.Y.Z
(i.e.vX.Y.0
) and the release named "Release X.Y.Z". The release body should contain the following components:a. A quick top blurb under a
# Jellyfin X.Y.Z
header.a. A list of features, including in-line links to Fider if available, under a
## New Features and Major Improvements
header.a. A list of known release notes, categorized by the relevant platform (e.g.
[All]
or[Windows]
), under a## Important Release Notes
header.a. If applicable, a set of release notes/comments about FFmpeg, under a
## FFmpeg
header.a. A full changelog, split by repository with
### [repo](https://github.com/jellyfin/repo)
subheaders, under a## Changelog
header. Each element should be a PR number and the PR title. -
Publish the release.
-
Wait for builds to complete.
-
Announce the new release in the jellyfin-announce Matrix/Riot channel and Forum.
Hotfix Release Procedure
-
During normal work on the
master
branch, select PRs suitable for backporting by tagging them with thestable-backport
label during the PR lifecycle. All PRs will targetmaster
and thus bugfixes for the stable release must include this label to be included. -
Collect the list of merged
stable-backport
PRs from all relevant repositories. -
For each repository, perform stable branch reconciliation for the relevant PRs:
-
For each PR slated for backport:
-
Grab the merge commit hash for the PR from
master
branch. -
Cherry-pick the merge commit into the
release-x.y.z
branch via:git cherry-pick -sx -m1 <merge-commit-hash>
. -
Fix any merge conflicts, generally keeping what's in the merge. If there are significant merge conflicts, this likely indicates that the fix is too large for backporting.
-
Finalize the cherry-pick via:
git add
andgit commit -v
.
-
-
For the main jellyfin repository, bump the version of the repository to the new hotfix version with the
bump_version
script and commit the result with the message "Bump version for X.Y.Z". -
Push the updated release branch to GitHub.
-
Web Client
-
Create a GitHub release for the new version, based on the relevant
release-X.Y.z
branch. The tag should be namedvX.Y.Z
and the release named "Release X.Y.Z". The release body should contain the following link only, replacing the version as required:[Please see the release announcement on the main repository.](https://github.com/jellyfin/jellyfin/releases/tag/vX.Y.Z)
-
Publish the release on GitHub and the archive repository.
Server
-
Create a GitHub release for the new version, based on the relevant
release-X.Y.z
branch. The tag should be namedvX.Y.Z
and the release named "Release X.Y.Z". The release body should contain the following components:a. A quick top blurb under a
# Jellyfin X.Y.Z
header.a. A list of known release notes, categorized by the relevant platform (e.g.
[All]
or[Windows]
), under a## Important Release Notes
header.a. If applicable, a set of release notes/comments about FFmpeg, under a
## FFmpeg
header.a. A full changelog, split by repository with
### [repo](https://github.com/jellyfin/repo)
subheaders, under a## Changelog
header. Each element should be a PR number and the PR title. -
Publish the release.
-
Wait for builds to complete.
-
Announce the new release in the jellyfin-announce channel and anywhere else as required.