Zulip server release checklist
This document has reminders of things one might forget to do when preparing a new release.
A week before the release
Major releases only (e.g. 4.0):
Upgrade all Python dependencies in
requirementsto latest upstream versions so they can burn in (usepip list --outdated).Upgrade all puppet dependencies in
puppet/deps.yamlUpgrade all puppet-installed dependencies (e.g. Smokescreen, go, etc) in
puppet/zulip/manifests/common.ppUpload strings to Transifex using
push-translations. Post a Transifex announcement notifying translators that we’re approaching a release.Merge draft updates to the changelog with changes since the last release. While doing so, take notes on things that might need follow-up work or documentation before we can happily advertise them in a release blog post.
Inspect all
TODO/compatibilitycomments for whether we can remove any backwards-compatibility code in this release.
Create a burn-down list of issues that need to be fixed before we can release, and make sure all of them are being worked on.
Draft the release blog post (a.k.a. the release notes) in Paper. In it, list the important changes in the release, from most to least notable.
Final release preparation
Update the Paper blog post draft with any new commits.
Download updated translation strings from Transifex and commit them. Use the
--branch 6.xparameter for maintenance releases.Use
build-release-tarballto generate a pre-release tarball.Test the new tarball extensively, both new install and upgrade from last release, on Ubuntu 20.04 or 22.04.
Repeat until release is ready.
Send around the Paper blog post draft for review.
Move the blog post draft to Astro:
Use “··· > Export > Markdown” to get a pretty good Markdown conversion, and save it in
src/postswith a filename appropriate for a URL slug.Add the needed YAML frontmatter.
Move any images into
publicand update their references.Proofread, especially for formatting.
If the draft post should remain secret until release, avoid using a guessable Git branch name for the pull request (the deployment preview URL is based on the branch name).
Major releases only (e.g. 4.0): Schedule team members to provide extra responsive #production help support following the release.
Executing the release
Create the release commit, on
main(for major releases) or on the release branch (for minor releases):Copy the Markdown release notes for the release into
docs/overview/changelog.md.Verify the changelog passes lint, and has the right release date.
Major releases only: Adjust the
changelog.mdheading to have the stable release series boilerplate.Update
ZULIP_VERSIONandLATEST_RELEASE_VERSIONinversion.py.Major releases only: Update
API_FEATURE_LEVELto a feature level for the final release, and document a reserved range.
Run
tools/releasewith the release version.Update the Docker image:
Commit the Docker updates:
Update
ZULIP_GIT_REFinDockerfileUpdate
README.mdUpdate the image in
docker-compose.yml, as well as theZULIP_GIT_REF
Commit the Helm updates:
Add a new entry to
kubernetes/chart/zulip/CHANGELOG.mdUpdate the
appVersioninkubernetes/chart/zulip/Chart.yamlUpdate the
taginkubernetes/chart/zulip/values.yamlUpdate the docs by running
helm-docsUpdate the
imageinkubernetes/manual/zulip-rc.yml
Build the image:
docker build . -t zulip/docker-zulip:4.11-0 --no-cacheAlso tag it with
latest:docker build . -t zulip/docker-zulip:latestPush those tags:
docker push zulip/docker-zulip:4.11-0; docker push zulip/docker-zulip:latestPush the commits to
main.
Merge the blog post PR.
Announce the release, pointing to the blog post, via:
Email to zulip-announce
Email to zulip-blog-announce
Message in #announce
Tweet from @zulip.
Toot from fosstodon.org/@zulip
Post-release
The DigitalOcean one-click image will report in an internal channel once it is built, and how to test it. Verify it, then publish it to DigitalOcean marketplace.
Major releases only:
Create a release branch (e.g.
4.x).On the release branch, update
ZULIP_VERSIONinversion.pyto the present release with a+gitsuffix, e.g.4.0+git.On
main, updateZULIP_VERSIONto the future major release with a-dev+gitsuffix, e.g.5.0-dev+git. Make a Git tag for this update commit with a-devsuffix, e.g.5.0-dev. Push the tag to both zulip.git and zulip-internal.git to get a correct version number for future Cloud deployments.Consider removing a few old releases from ReadTheDocs; we keep about two years of back-versions.
Update Transifex to add the new
4.xstyle release branch resources and archive the previous release branch’s resources with the “Translations can’t translate this resource” setting.Add a new CI production upgrade target:
Build a docker image:
cd tools/ci && docker build . -f Dockerfile.prod --build-arg=BASE_IMAGE=zulip/ci:bullseye --build-arg=VERSION=5.0 --tag=zulip/ci:bullseye-5.0 && docker push zulip/ci:bullseye-5.0Add a new line to the
production_upgradematrix in.github/workflows/production-suite.yml.
Minor releases only (e.g. 3.2):
On the release branch, update
ZULIP_VERSIONto the present release with a+gitsuffix, e.g.3.2+git.On main, update
LATEST_RELEASE_VERSIONwith the released version, as well as the changelog changes from the release branch.
Prereleases only (e.g. 7.0-beta3):
Atop the prerelease commit (e.g.
7.0-beta3), make a commit updatingZULIP_VERSIONto the prerelease version with a+gitsuffix, e.g.7.0-beta3+git. Push this tomain. (Ifmainhas already diverged from the prerelease, a merge commit will be needed here.)Delete the prerelease branch (e.g.
7.0-beta3-branch); it’s now an ancestor ofmainand thus unnecessary.