openMSX Release Process
=======================

This is a kind of recipe for doing releases. Having it written down
decreases the chance of forgetting a small but crucial step during the
hectic work of getting a release out.

Preparing for a release
-----------------------

- Tell all developers to commit only fixes.
- Sync with most recent C-BIOS release.
- Check that the "staticbindist" build still works, in particular on
  win32 and Mac OS X. This should be clear from the GitHub Actions at
  https://github.com/openMSX/openMSX/actions
- Verify the documentation is up-to-date.
  Currently most documentation is in "doc/manual".
- Write release notes in "doc/release-notes.txt".
- Add the change list to "doc/release-history.txt".

Note: An alternative approach would be to create a branch dedicated to the
      release and continue accepting any kind of commit on "master".
      To put the development focus on bug fixing, we haven't done this,
      but it is an approach that might be useful at some point.

Creating a release candidate
----------------------------

- If you're creating the very first release candidate for this release,
  use a version number that ends with -rc1, so 1.2.3-rc1. Only the final
  release will be without the -rc suffix (in both tag and version
  numbers.)
- Edit the version number in build/version.py:
    packageVersionNumber = '1.2.3'
  And set releaseFlag to True.
  Additionally, increase the androidReleaseVersionCode with 1.
  And update the copyright year in build/version.py
- Update the release date in "doc/release-notes.txt" and
  "doc/release-history.txt".
- Don't forget to commit and push all these last changes before tagging!
- Tag the git archive:
    git tag -a RELEASE_1_2_3 -m "Tagging release 1.2.3."
    git push --tags
- Create the distribution tar.gz file based on the new tag:
    build/gitdist.py RELEASE_1_2_3
- Save the created file somewhere you can find it again:
    mv derived/dist/openmsx-1.2.3.tar.gz <some_dir>/
  This is the release candidate.
- On GitHub Actions do a build based on the tagged code for platforms
  that can be built there: (note that the Windows build will NOT include
  Catapult!):
  https://github.com/openMSX/openMSX/actions/workflows/build_release_from_tag_via_tarball.yml
  click open "Run workflow" at the top right and for "Release tag to
  build" fill in "RELEASE_1_2_3" and click "Run workflow".
- NOTE: for a Windows build, you also need a RC of Catapult!

Sanity check on release candidate
---------------------------------

This is a small check to be performed by the release coordinator.

- Test build:
  * Compile and check for warnings:
      unset OPENMSX_FLAVOUR   (and any other OPENMSX_ flags you have set)
      make
  * Test installation:
      su
      make install
- Start openmsx with your usual config.
- Verify the version number in the title bar.

If the sanity check is passed, distribute tar.gz to fellow developers and
testers.

Full test of release candidate
------------------------------

- Check behaviour with empty ~/.openMSX dir.
- Check that the default config (C-BIOS_MSX2+) works.
- Check random other configs.
- Do extensive testing with things that are known to work and likely to
  give problems (like Unknown Reality, Metal Limit).
- Do some valgrind runs to make sure there are no hidden problems.
TODO: More standard tests?

Repeat until release worthy
---------------------------

Create and test release candidates until a satisfactory release candidate
is made, which will become the release.

If there are any last-minute patches, don't forget to set a new release
tag, such that the released code is based on exactly the tagged code.

Make the release public
-----------------------

Put the release on GitHub (refer to
https://help.github.com/articles/creating-releases/):
- Make sure you're logged in
- Go to https://github.com/openMSX/openMSX/releases. Click "Draft a new
  release"
- Select the tag version you made above: RELEASE_1_2_3
- Type 'openMSX' and the release number of the new release at "Release
  title":
  openMSX 1.2.3
- At the "Describe this release" box, describe the release, e.g. take the
  first few paragraphs of the release notes (before the list of changes
  starts).
- At "Attach binaries" select the files to upload, including our own
  tarballs.
  In short: all the files we used to upload for an SF.net release.
  Upload the relevant binaries that came out of the GitHub Actions build done
  based on the tarball, as described above. For some reason, these results are
  zipped or get an extra zip extension. Make sure to unzip (e.g. the dmg files)
  or strip the extra .zip file extension (e.g. the Linux build).
- Note: GitHub also generates a tarball and a zip file. Just ignore it for
  now. Do not use these in any links on our website or somewhere else.
  They contain a lot of unnecessary stuff.

Announce:
- Post change list to msx.org.
- Post news item on web site.
- Post news item on our Facebook page.
- Post news and/or change list to openmsx-devel and openmsx-user
  mailinglists (at least one packager uses it to get a trigger)

Finally:
- Update web site to point to new downloads.
- On the openMSX home page, update the lists "features of current release"
  and "features in development".
- Set releaseFlag to False in build/version.py
- Update libraries in the 3rd party build system to latest versions, so
  that next release will profit from this and you won't forget it. Just
  before the release is too late (unless it's some minor security fix)!
