49 ReleaseProcess
Stan edited this page 2024-08-31 13:10:26 +02:00

Release Process Break-Down

Release Branching

After preparative checks, a release branch is created, and nightly builds and translation updates start following it. We start generating daily release candidates from the nightly builds. The next development cycle can start on the main branch. A Release Manager is desginated, only they can push to the release branch. It is forbidden to publish a fix in the release branch that is not a cherry-pick of a fix in main.

Test the tutorials

Candidates: Everyone

We must check the tutorials that are accessible from the main menu work and take into account the changes from the development cycle.

Organize a first staff match

Candidates: Anyone

A staff game session should be organized before the release. Often important bugs get discovered in such staff matches. Organizing the match means finding a good date and time and informing the other team members (or community members). All players must use a clean nightly build.

Prepare for branching

Candidates: Everyone

  • Ensure Alpha name and number have been updated in BuildLabel.xml, ProjectInformation.js, mod.json, and build_version.h.
  • Remove the "new" keyword from all maps of prior releases and add it to the maps of the current release.
  • Ensure the MUC room for the lobby in default.cfg is set to the current release.

Create a release-aXX branch

Candidate: Release Manager

Create a release branch in the format release-a27. Restrict pushing to this branch to the Release Manager.

Adapt Jenkins for the release

Candidates: Itms

Update the Jenkins configuration for the nightly build, so that it follows the release branch instead of the main branch. Update the configuration for the bundles build, so that it builds daily after the nightly generation. See also JenkinsSetup.

Prepare next multiplayer lobby in main

Candidates: Dunedan, user1

We can create a new lobby for the next development cycle, and update default.cfg on the main branch. This allows development of the lobby features to continue while features are freezed for the upcoming release.

  • Create a new MUC room for release+1
  • Set up bots and empty ratings database for release+1 according to https://github.com/0ad/lobby-infrastructure/
  • Set the existing lobby moderators as room administrators for release+1
  • Commit config changes to the main branch

Generate next signing key for mods in main

Candidates: Stan, Itms

The valid mods for the next version should be signed with a new key, and the associated public key must be put in the config for the next version. It is recommended to sign official mods (community balance, CJK, ...) with the new key at the same time, so that the mod downloader can be tested at any moment in the development process. To generate the keypair use minisign -G -p pubkey -s secretkey. Do not override the old keys.

Start writing release announcement

Candidates: Everyone

  • Write a release announcement that will be published on the website and other places like Moddb.
  • Describe new features, content and major bugfixes. If necessary ask people to provide descriptions.
  • Create one or more unique screenshots that fit well for this Alpha release (or find someone to create these).
  • Write a short description of the Alpha name and the reasons why we have chosen this name (historical term around the timeframe of 0 A.D.).

Start creating the release video

Candidates: Brynn, Stan, Vlad

An Alpha release video showcases the new features, content and major bugfixes of this version. It focuses more on the features that can be shown well in a video. Remember to upload the video on the play0ad youtube channel.

String Freeze

When the remaining fixes to be implemented are guaranteed not to touch the user-facing text, we publish an announcement for translators, and we strictly stop introducing any string changes in the release branch. A Translations Officer is nominated to assess the quality of translations during the release process. The rest of the team focuses on fixing bugs and preparing announcements.

Announce string freeze

Candidates: Stan

Translators should be informed about the String Freeze and the planned Full Freeze date (at least 10 days from now). The idea is to give them some time to polish the final translations for the release.

Long strings check

Candidates: Translations Officer

Using the debug "long" locale, go through as much parts of the GUI as possible, and see if some parts should and can be tweaked without changing the strings themselves. In case the fix needs to break String Freeze, fix only in main and/or create a ticket for the next release.

Commit Freeze

When all the fixes are in, we stop committing to the release branch, except for the listed exceptions below. The nightly builds continue to be generated every day with the newest translations.

Translation check

Candidates: Translations Officer

TODO: This should be done as part of CD throughout the entire development process.

Daily check the translations for "vandalism" and syntax breakage.

  • Against vandalism, it's really just checking if there are any strings that were added in bad intent and not about trying to improve translation quality. There's a script to check the translation files for URLs ([checkTranslations.py]source:ps/trunk/source/tools/i18n/checkTranslations.py), but this task also involves manual checking. Obviously we can't carefully read through all strings in all translations.
  • Syntax errors can happen when translators incorrectly copy sprintf calls and special GUI tags. Most of the errors are detected by Transifex, but sometimes translators ignore the warnings. So we have [lint-translations.sh]source:ps/trunk/build/jenkins/lint-translations.sh which detects broken sprintf calls, but it doesn't detect broken GUI tags. So manual checking is still necessary.

Decide on included translations

Candidates: Translations Officer

Depending on the completion status of translations, and their apparent quality, the Translations Officer is allowed to commit changes to source/tools/dist/remove-incomplete-translations.sh. The version of that file in the main branch should serve as a list of first-class languages we aim to support for each release in order to reach as many players as we reasonalbly can worldwide. The version in the release branch can be extended on a case-by-case basis, for each release. The Translations Officer can amend this file as many times as needed up until the full freeze. Make sure the list of Windows installer languages is always updated accordingly.

Organize another staff match

Candidates: Anyone

If all the tasks have been completed and we still have time before the announced Full Freeze, do another celebration staff match.

Full Freeze - Release Testing

If :

  • At least 10 days have passed since the string freeze announcement
  • Only the meta task for the release remains in the Milestone
  • All checkboxes are ticked up to the "Full Freeze" separation in the meta task

then, we stop the nightly builds. The official release candidate is generated from the latest nightly build, and published on https://releases.wildfiregames.com/rc. If an issue is found, we fix it and go back to Commit Freeze. If an issue is found that requires changing user-facing text, we fix it and go back to String Freeze.

Freeze Jenkins

Candidates: Itms

Deactivate the nightly-build job on Jenkins, and stop the scheduled builds for bundles. Upload the latest generated bundles to https://releases.wildfiregames.com/rc, generate their hashes, and sign them. If this is not the first RC, do not overwrite old RCs until the release happens.

Confirm full freeze

Candidates: Stan

Translators should be informed of the full freeze and that their changes will stop going into the release. Ask them to make sure their changes are indeed in the nightly builds and point them to the RC download page. Keep an eye on bug reports from them which may warrant a thaw.

Package East Asian mods

Candidates: Anyone

  • Get the latest version of Source Han Sans fonts for CJK languages.
  • For each East Asian language complete enough, select the font subset for the language under the SubsetOTF directory. The interesting fonts should be Normal size for most of our fonts and Medium size for the two bold ones.
  • Follow the steps from Adding_font_support in order to render the fonts. Don't do the font caching already.
  • Create a mod for each language, containing a mod.json, a fonts/ folder in which to place the rendered fonts and the licence text files, and a l10n folder. Place the .po files for the language in the latter.
  • Use the following command to build an archive for each mod (here is the example for ja): ./pyrogenesis -mod=mod -archivebuild-compress -archivebuild=/path/to/0ad/binaries/data/mods/ja-lang-0.0.XXX -archivebuild-output=/path/to/0ad/binaries/data/mods/ja-lang-0.0.XXX/ja-lang-0.0.XXX.zip
  • Generate a signature for checking the files when downloaded from mod.io (or from anywhere if people are careful): minisign -SHm ja-lang-0.0.XXX.zip -s private-key
  • Upload the file to mod.io and update the signature in the minisigs array in the metadata field.
  • Upload the file to https://releases.wildfiregames.com/rc.

Announce Release Candidates

Candidates: Anyone

Announce the RC on the forums and gather as many test feedback as possible. Decide on thawing the Full Freeze depending on found issues.

Release

If the latest RC seems to work as expected, we promote it to release. We publish release announcements, notify the maintainers of the game and the regular reporters.

Tag the release commit

Candidates: Release Manager

Tag the tip of the release branch, making sure this commit is indeed the one from which the good RCs were generated (the 5-char commit hash is displayed in the main menu). Push that tag to Gitea. Publish the associated release in the Gitea repo.

Create torrents and checksum files

Candidates: Itms, Stan, wraitii

On releases.wildfiregames.com:

  • Move the good RCs from www/rc/ to www/, and delete the others
  • Run ./update on the server

Upload to Sourceforge and IndieDB

Candidates: feneur, Itms

After all packages are created and tested, they can be uploaded to sourceforge.

rsync -v --progress -e ssh 0ad-0.0.N-*.{exe,gz,xz,dmg} username,zero-ad@frs.sourceforge.net:/home/frs/project/z/ze/zero-ad/releases/
rsync -v --progress -e ssh locales/*0.0.22.zip username,zero-ad@frs.sourceforge.net:/home/frs/project/z/ze/zero-ad/releases/locales/

They can also be uploaded to IndieDB & Itch.io for yet another download platform. Create a new file at https://www.indiedb.com/games/0-ad/downloads/add/ for Windows and macOS. Use the "upload by URL" system if you don't want to download the whole file locally.

Don't forget to login there and update the latest release as it is not done automatically.

Move the lobby

Candidates: Dunedan, user1

  • Migrate ratings from the release-1 room to release room
  • Disable the ratings bot for the release-1 room
  • Transfer the list of outlasted JIDs from the release-1 room to the release room
  • Change the topic of the release-1 MUC room to notify users that a new version is available

Publish announcement

Candidates: feneur, Stan, Jeru

Notify packagers

Candidates: Release Manager

Post-Release

Candidates: Release Manager

After a couple days have passed, cleanup the release:

  • Delete the release branch (its tip is tagged)
  • In Jenkins, re-target the nightly-build job to the main branch and re-enable it
  • Consider regenerating the nightly repo from scratch to save server space
  • In Jenkins, reset the bundle generation schedule to bi-weekly
  • In Gitea, check the final box in the meta issue and close it
  • In Gitea, set the milestone date to the release date and close it
  • ??
  • Profit