Release Procedure


The easiest way to produce a release of a GitHub-based open-source software is to tag the most recent commit on the master with the version number at regular intervals of time or once a previously agreed milestone is reached. However, this approach to releasing would rest on the assumption that each commit at the master branch can potentially be made into a release. We cannot provide the release-grade quality guarantees for each of the master commits, though.

Consequently, in Dotty, we are using the method above – releasing-by-tagging – to mark release candidates (RC’s) and not the stable releases. The stable releases are also marked by a tag, but we have a procedure to assure their quality.

An RC is promoted to a stable release in one release cycle after its creation. The idea is that this way, we have one release cycle's time to examine the release candidate and find critical issues which cannot be allowed into a stable release.

If such issues are found, their fixes end up on a separate branch dedicated to that release. In one release cycle after the RC creation, the RC, along with all its subsequent fixes, is promoted to a stable release by means of tagging it.


Say we want to release the 0.14.0 version. In this section we describe the process to do so (at a glance).

At the Dotty Repo

  1. Tag the latest master commit as 0.14.0-RC1. This commit is the release candidate for the 0.14.0 version.
  2. Create a branch from that commit called 0.14.x. This branch is intended to host the subsequent fixes to the RC for the issues that cannot be allowed in the 0.14.0 stable release.
  3. Up until the next release date, if we find some issues with 0.14.0-RC1 that cannot end up in the release, we push the fixes to the 0.14.x branch.
  4. At the next release date, we release 0.14.0 from the branch 0.14.x. We do so by tagging the latest commit at the 0.14.x branch as 0.14.0. Some things to note here:
  5. At this point, 0.14.x (the branch) and 0.14.0-RC1 (the tag at which 0.14.x branched from master) may differ, and the 0.14.x branch is a more mature version of the 0.14.0-RC1 tag.
  6. 0.14.0 is not the same as the master. Only the commits critical for the 0.14.0 release end up at 0.14.x branch. Not all of the commits made to the master during the release cycle are critical to 0.14.0. However, all of the commits from 0.14.x must end up on the master branch, so we merge 0.14.x into master.
  7. After the 0.14.0 version is released, we start the process for releasing 0.15.0 – repeat this algorithm from the beginning with the version set to 0.15.0-RC1 at step (1).

At the CI

CI is set to automatically detect the tags of the format discussed above and perform the required release operations. Precisely, it will do two things for the release tags:

The CI operation is entirely automatic provided you have tagged the release correctly. No need to do anything here.

Canceling CI builds

The below guidelines are needed only to speed up things. It is no mistake if you skip this section. However, if you do things wrong here, there may be trouble. So do it only if you feel yourself confident with the release cycle and the workings of the CI.

Note that after the first stage of the release cycle (see "Publishing artifacts to Maven via CI" section of the checklist below) only three test runs are required to be run at the CI:

However you may end up with as many as 6 tasks being run. The auxiliary tasks may include:


Release Procedure Checklist

Before we start the release procedure, we create an issue with a release checklist. As we go through the release, we update the checklist. To generate the checklist, run the following command:

bash <(curl -sL <stable_release>

Above, <stable_release> is the stable version being released. For example, if you are releasing 0.14.0 and 0.15.0-RC1, this variable is 14 and the command is as follows:

bash <(curl -sL 14

Copy and paste the output into the release issue.

The ecosystem update section for some projects also mentions a set of criteria upon which the project is to be marked in the checklist. When the Travis build status is specified next to the project's name, it is to be understood that this build must pass after all of the other criteria of that project are checked. Note that due to caching, the label image next to the link may not reflect the real status of the build. Therefore, to verify the status, click on the link and make sure that your recent commit passes.

When no criteria is specified, common sense is to be used.

GitHub Releases and Blog Post

After the release is done, we document it as follows:


After releasing a new version of Dotty, we need to make sure to update the following related projects:

For each need to do the following:

Procedure in Bash Scripts

The below procedure is compiled from this and this checklists. It assumes we want to publish the 0.14.0 given the 0.14.0-RC1 release candidate.

Note that at the same time we will also publish the 0.15.0-RC1 release. We publish two releases at the same time as per the logic outlined at the Example/At the Dotty Repo and the Model sections above: the step (5) in the algorithm outlined in the Example for the release cycle of 0.14.0 is the step (1) in the release cycle of 0.15.0.

The following commands assume a remote tracking repository named origin pointing to the main Dotty repository:

######## Publish the 0.14.0 stable version – end the release cycle for 0.14.0 ########
git checkout 0.14.x

# Change `val baseVersion = "0.14.0-RC1"` to `val baseVersion = "0.14.0"` in project/Build.scala

git commit -am 'Release Dotty 0.14.0'
git tag 0.14.0
git push origin 0.14.0

git checkout master
git merge 0.14.x

# Make sure the merge doesn't break anything. In doubt, create a PR to run the CL
git push origin master

######## Publish the 0.15.0-RC1 unstable version – begin the release cycle for 0.15.0 ########
# Move all the unfinished tasks from Milestone 15 to Milestone 16 on GitHub – see

git checkout -b 0.15.x

# Change val baseVersion = "0.15.0" to val baseVersion = "0.15.0-RC1"

git commit -am 'Release Dotty 0.15.0-RC1'
git tag 0.15.0-RC1
git push origin 0.15.x
git push origin 0.15.0-RC1

git checkout master

# Change val baseVersion = "0.15.0" to val baseVersion = "0.16.0" - this will be the next version after `0.15.0-RC1` is promoted to `0.15.0`.

git commit -am 'Set baseVersion to 0.16.0'
git push origin master