CHANGELOG_BEGIN CHANGELOG_END
21 KiB
Making a Release
Valid commits for a release should come from either the main
branch or one
of the support release/a.b.x
branches (e.g. release/1.0.x
branch is for
patches we backport to the 1.0 release branch).
Important
: If the release fails, please delete it from the releases page and write how it failed on the PR.
First, you need to know which type of release you are making. At this point in time, these are the options, in rough order of likelihood/frequency:
- The weekly snapshot.
- A release candidate for a 2.x release.
- A stable 2.x release.
- A release candidate for a 1.x release.
- A stable 1.x release.
If you don't know which of these your current case fits in, or you think it
doesn't fit in any, please reach out on #team-daml
on Slack, preferably
mentioning @gary
.
The weekly snapshot
Note: You should not have to make any change to this repo.
-
Open a PR on the assembly repo using the most recent Canton snapshot. See the instructions in the README of the assembly repo for details.
-
Merge the PR and wait for the corresponding
main
build to finish. -
Go to the Testing section of this file.
2.x release candidate
In a perfect world, there is no need for a separate RC: the latest weekly snapshot can work. In the world we live in, though, we frequently want to add a few things, or patch previous minor rleases.
In those cases, we create release/
branches (e.g. release/2.0.x
). Those are
special branches, protected by GitHub rules and treated specially by CI.
When making a release candidate, you generally want to pick the tip of one of
those release branches. The release itself is always triggered from main
.
The process is similar to the weekly snapshot, except that both the daml and canton bundles have to be manually triggered. Specifically:
- Make sure all the changes you want are in the release branch.
- Start from latest
main
and run
The output will be a line that starts with a commit sha, followed by a snapshot release number. You need to take that line and add it to the$ ./release.sh snapshot origin/release/2.0.x 2.0.1
LATEST
file, addingSPLIT_RELEASE
at the end of that line. You should put that line in the file so as to preserve semver ordering, and overwrite any existing snapshot with the same prefix. - Make a PR against the
main
branch with just that one line added, touching no other file. Add theStandard-Change
label to that PR. - When the PR is merged, the build of the corresponding commit on
main
will create a "split release" bundle and push it to Artifactory. It should notify on#ci-failures-daml
on Slack. - The next step is to request a build from the Canton team (on
#team-canton
) that relies on the RC snapshot. Once you have a canton release, you can proceed. - Go to the assembly repo, and follow the instructions there to make a release
using the Canton version that was just created. The
LATEST
file on the assembly repo only contains one version; it is safe to overwrite it, and to "go backwards" if needed. - Once the
main
build of the assembly repo has finished, you should proceed with testing. You should open up this document in the branch of the release you're making, as testing instructions change over time. - If this was a main-branch release, bump the
NIGHTLY_PREFIX
file in the daml repo. - After testing, if everything went well, you should go on to turning the RC into a stable release. If something went wrong, make appropriate changes to the release branch and start over.
Stable 2.x
The overall process of coordinating a stable release is documented in the release planning document, including the relevant stakeholders and roles. Cutting and testing a release as documented here is part of that process.
Making a stable release follows the same steps as a snapshot RC, except that:
- You should not be choosing an arbitrary commit, you should pick the latest RC for the branch.
- Instead of adding a line to
LATEST
, remove the-snapshot
part of the version number for the existing RC. - Similarly, modifying the
LATEST
file on the assembly repo should amount to just removing the-
parts of the version numbers for both Canton and daml, but follow the instructions there. - You need a team lead to approve the PR on both the daml and assembly repos.
Once you have finished testing the release, communicate this to the relevant
stakeholder (send a message on #team-daml
if unsure) so that the process can
move on by removing the prerelease
marker on the releases page. (This is what
makes it available to daml install
.)
1.x release candidate
- Make sure all the changes you want are in the release branch.
- Start from latest
main
and run
The output will be a line that starts with a commit sha, followed by a snapshot release number. You need to take that line and add it to the$ ./release.sh snapshot origin/release/1.18.x 1.18.3
LATEST
file. You should put that line in the file so as to preserve semver ordering, and overwrite any existing snapshot with the same prefix. - Make a PR against the
main
branch with just that one line added, touching no other file. Add theStandard-Change
label to that PR. - Once the PR has built, check that it was considered a release build by our
CI. You can look at the output of the
check_for_release
job. - When the PR is merged, the build of the
main
branch will create the release, push it to GitHub releases, and announce it is ready for testing on#team-daml
. - Follow the testing instructions in this document, but from the tip of the release branch.
- After testing, if everything went well, you should go on to turning the RC into a stable release. If something went wrong, make appropriate changes to the release branch and start over.
Stable 1.x
Making a stable release follows the same steps as a snapshot RC, except that:
- You should not be choosing an arbitrary commit, you should pick the latest RC for the branch.
- Go through the checklist before making the release. Note that the checklist is not available publicly. Since 1.x are old patch releases at this point, you may have to adapt the checklist a bit. Usee your best judgement; if we're making a patch release on 1.x at this point there should be a specific reason for it, which should suggest specific additional tests (e.g. a speecific bug we want to fix).
- Instead of adding a line to
LATEST
, remove the-snapshot
part of the version number for the existing RC. - You need a team lead to approve the PR.
Once you have finished testing the release, coordinate with Product to decide
how to communicate around it and when to remove the prerelease
marker on the
releases page. (This is what makes it available to daml install
.)
Testing
This testing procedure starts once the release is listed on the releases page.
-
On Windows, install the new SDK using the installer on the releases page.
On macOS/Linux:
curl -sSL https://get.daml.com/ | sh -s "$VERSION"
where
$VERSION
is the full version tag of the new release you are making, i.e. the second column of theLATEST
file.Tips for Windows testing in an ad-hoc machine
If you are part of the release rotation, you can create Windows VMs through the ad-hoc project. The created machine is a bit raw, though, so here are a few tips to help you along.
ad-hoc.sh create windows
prints IP address, username and password for the created Windows VM. Save this output. You will need this information later when you create an RDP connection.‼️ After starting, it's going to take some time for the machine to be configured (see notes below).
If you're on a Mac, you can use Microsoft Remote Desktop to connect; on Linux, you can use Remmina.
Remmina notes: when creating an RDP connection, you may want to specify custom resolution. The default setting is to
use client resolution
. You may notice a failure due to color depth settings. You can adjust those in the settings panel right below the resolution settings.The ad-hoc machines take a bit of time to be available after being reported as created, so be patient for a bit if your first connection attempt(s) fail.
NOTE 1: Use Firefox for testing. Windows machines come with both Internet Explorer and Firefox installed. Do not make the mistake of trying to use Internet Explorer.
Ad-hoc machines also come with Node, VSCode and OpenJDK preinstalled, so you don't need to worry about those.
NOTE 2: After logging in, it takes some time for the machine to be configured. The script that installs Firefox, Node, VSCode and OpenJDK runs once the machine is available for login. The software you need should appear within about 10 minutes. (An easy way to check is to try to open
D:\
, as it is created after all the software is installed.)All of the commands mentioned in this document can be run from a simple DOS prompt (start menu -> type "cmd" -> click "Command prompt").
-
Prerequisites for running the tests:
- Visual Studio Code, Java-SDK
- Node.js
- Just the bare install; no need to build C dependencies.
create-daml-app
doesn't work with the latest version 17.x of node.js. If you havenix
installed, you can use a suitable version of nodejs by runningnix-shell -p nodejs-14_x
before running thenpm
commands below.
-
Run
daml version --assistant=yes
and verify that the new version is selected as the assistant version and the default version for new projects. -
Tests for the getting started guide (macOS/Linux and Windows). Note: if using a remote Windows VM and an RDP client that supports copy/paste, you can run through this on both Windows and your local unix in parallel fairly easily.
-
For these steps you will need the getting started documentation for the release you are about to make. You can either build the documentation locally (see
docs/README.md
), or, if you are sure that the Getting Started Guide didn't change since the last stable version, you can simply go to the live documentation. -
daml new create-daml-app --template create-daml-app
-
cd create-daml-app
daml start
-
In a new terminal, from the
ui
folder:-
npm install
-
npm start
-
-
Open two browser windows (you want to see them simultaneously ideally) at
localhost:3000
. -
Log in as
alice
in the first window, log in asbob
in the second window. -
In the first window, where you are logged in as
Alice
, followBob
by typing their name in the drop down (note that it will beBob
notbob
, the former is the global alias, the latter is the participant-local username). Verify thatBob
appears in the list of usersAlice
is following. Verify in the other browser window thatAlice
shows up inBob
’s network. -
In the second window, where you are logged in as
Bob
, followAlice
by selecting it in the drop down. Verify thatAlice
appears in the list of usersBob
is following. Verify in the other browser window thatBob
shows up inAlice
’s network. -
Open the your first feature section of the GSG, e.g., from https://docs.daml.com/getting-started/first-feature.html if you did not build docs locally.
-
Run
daml studio --replace=always
from the project root directory and openUser.daml
. -
Copy the
Message
template from the documentation to the end ofUser.daml
. -
Copy the
SendMessage
choice from the documentation to theUser
template below theFollow
choice. -
Close VSCode.
-
In the terminal where
daml start
is running, press 'r' respectively 'r' + 'Enter' on Windows. -
Run
code .
from the project root directory (the extension is already installed, no need to usedaml studio
). -
Create
MessageList.tsx
,MessageEdit.tsx
and modifyMainView.tsx
as described in the documentation. -
Verify that you do not see errors in the typescript code in VSCode.
-
Close VSCode.
-
As before, open two browser windows at
localhost:3000
and log in asalice
andbob
. -
Make
Alice
followBob
. -
From
Bob
, select Alice in theSelect a follower
drop down, inserthi alice
in the message field and click onSend
. -
Verify that
Alice
has received the message in the other window. -
Make
Bob
followAlice
. -
From
Alice
, select Bob in theSelect a follower
drop down, inserthi bob
in the message field and click onSend
. -
Verify that
Bob
has received the message in the other window. -
You can now close both browser windows and both running processes (
daml start
andnpm start
). -
Don't forget to run this on the other platform! E.g. if you just ran through on Linux or macOS, you still need to run on Windows, and vice versa.
-
-
Run through the following test plan on Windows. This is slightly shortened to make testing faster and since most issues are not platform specific.
- Run
daml new myproject
to create a new project and switch to it usingcd myproject
. - Run
daml start
. - Open your browser at
http://localhost:7500
, verify that you can login as alice and there is one contract, and that the template list containsMain:Asset
among other templates. - Kill
daml start
withCtrl-C
. - Run
daml studio --replace=always
and opendaml/Main.daml
. Verify that the script result appears within 30 seconds. - Add
+
at the end of line 26 after(PartyIdHint "Alice")
and verify that you get an error on line 27.
- Run
-
On your PR (the one that triggered the release process: on daml for 1.x releases, and on assembly for 2.x releases), add the comment:
Manual tests passed on Windows.
-
Tests for
quickstart-java
(Linux/macOS)While this is no longer the default getting started guide we still test it for now since it covers things not covered by the new GSG (Navigator, Scripts, Maven artifacts, …)
-
Create a new project with
daml new quickstart --template quickstart-java
and switch to it usingcd quickstart
. -
Verify the new version is specified in
daml.yaml
as thesdk-version
. -
Run
daml start
. Your browser should be opened automatically athttp://localhost:7500
. Login asalice
and verify that there is 1 contract, and that the templates list containsIou:Iou
,Iou:IouTransfer
, andIouTrade:IouTrade
among other templates. -
Close the tab and kill
daml start
usingCtrl-C
. -
Run
daml build
. -
In 3 separate terminals, run:
-
daml sandbox --port 6865
-
Each of the following:
-
daml ledger upload-dar --host localhost --port 6865 .daml/dist/quickstart-0.0.1.dar
-
daml script --ledger-host localhost --ledger-port 6865 --dar .daml/dist/quickstart-0.0.1.dar --script-name Main:initialize --output-file output.json
-
cat output.json
and verify that the output looks like this:["Alice::NAMESPACE", "EUR_Bank::NAMESPACE"]
where
NAMESPACE
is some randomly generated series of hex digits. -
daml navigator server localhost 6865 --port 7500
-
-
daml codegen java && mvn compile exec:java@run-quickstart -Dparty=$(cat output.json | sed 's/\[\"//' | sed 's/".*//')
Note that this step scrapes the
Alice::NAMESPACE
party name from theoutput.json
produced in the previous steps.Note: It takes some time (typically around half-an-hour) for our artifacts to be available on Maven Central. If you try running the last command before the artifacts are available, you will get a "not found" error. Trying to build again in the next 24 hours will result in:
Failure to find ... was cached in the local repository, resolution will not be reattempted until the update interval of digitalasset-releases has elapsed or updates are forced
This is Maven telling you it has locally cached that "not found" result and will consider it valid for 24h. To bypass that and force Maven to try the network call again, add a
-U
option, as inmvn compile exec:java@run-quickstart -U
. Note that this is required to bypass your local cache of the failure; it will not be required for a user trying to run the quickstart after the artifacts have been published.Another common problem is that artifacts fail to resolve because of custom Maven settings. Check your
~/.m2/settings.xml
configuration and try disabling them temporarily.
-
-
Point your browser to
http://localhost:7500
, login asalice
and verify that there is 1 contract, 1 owned IOU, and the templates list containsIou:Iou
,Iou:IouTransfer
, andIouTrade:IouTrade
among other templates. -
Check that
curl http://localhost:8080/iou
returns:{"0":{"issuer":"EUR_Bank::NAMESPACE","owner":"Alice::NAMESPACE","currency":"EUR","amount":100.0000000000,"observers":[]}}
where NAMESPACE is again the series of hex digits that you saw before.
-
Kill all processes.
-
Run
daml studio --replace=always
. This should open VSCode and trigger the Daml extension that's bundled with the new SDK version. (The new VSCode extension will not be in the marketplace at this point.) -
Open
daml/Main.daml
. -
Click on
Script results
aboveinitialize
and wait for the script results to appear. -
Add
+
at the end of line 14, after(PartyIdHint "Alice")
and confirm you get an error in line 15. -
Add
1
after the+
and confirm you get a type error in line 14, which says thatScript Party
does not matchInt
. -
Delete the
+1
and thee
in the second"Alice"
and verify that the script results are updated to the misspelled name. -
Right click on
eurBank
in line 28 and verify that "Go to Definition" takes you to the definition in line 17. -
Close all files.
Note: when running
daml studio --replace=always
, you force the installation of the VSCode extension bundled with the Daml SDK, and disable the autoupgrade mechanism in VSCode. To instruct VSCode to go back to the published version of the extension, including auto-upgrades, you can rundaml studio --replace=published
. -
-
On your PR (the one that triggered the release process: on daml for 1.x releases, and on assembly for 2.x releases), add the comment:
Manual tests passed on [Linux/macOS].
specifying which platform you tested on.
-
If the release is bad, delete the release from the releases page. Mention why it is bad as a comment on your PR, and stop the process here.
Note that the Standard-Change label must remain on the PR, even if the release has failed.
-
Announce the release on
#product-daml
on Slack. For a stable release, direct people to the release blog post; for a prerelease, you can include the raw output of theunreleased.sh
script in a thread after the announcement. If there were any errors during testing, but we decided to keep the release anyway, report those on the PR and include a link to the PR in the announcement.
For a stable release, you need to additionally:
-
Go to the releases page and remove the prerelease marker on the release. Also change the text to
See [the release notes blog]() for details.
adding in the direct link to this version's release notes. Documentation for this release will be added to docs.daml.com on the next hour. -
Coordinate with product (& marketing) for the relevant public announcements (Daml Forum, Twitter, etc.).
-
Documentation is published automatically once the release is public on GitHub, though this runs on an hourly cron.
Thanks for making a release!