2020-07-01 17:26:49 +03:00
|
|
|
---
|
|
|
|
layout: developer-doc
|
|
|
|
title: Release Policy
|
|
|
|
category: distribution
|
|
|
|
tags: [distribution, release, release-policy, policy]
|
|
|
|
order: 3
|
|
|
|
---
|
|
|
|
|
|
|
|
# Release Policy
|
2020-07-21 15:59:40 +03:00
|
|
|
|
2020-07-01 17:26:49 +03:00
|
|
|
As an open-source project and programming language, it is incredibly important
|
|
|
|
that we have a well-defined release policy. This document defines said policy.
|
|
|
|
|
|
|
|
<!-- MarkdownTOC levels="2,3" autolink="true" -->
|
|
|
|
|
|
|
|
- [Versioning](#versioning)
|
2020-07-08 16:54:41 +03:00
|
|
|
- [Launcher Versioning](#launcher-versioning)
|
2020-07-01 17:26:49 +03:00
|
|
|
- [Release Branches](#release-branches)
|
|
|
|
- [Release Workflow](#release-workflow)
|
2020-07-08 16:54:41 +03:00
|
|
|
- [Tag Naming](#tag-naming)
|
|
|
|
- [GitHub Releases](#github-releases)
|
|
|
|
- [Release Notes](#release-notes)
|
2020-07-01 17:26:49 +03:00
|
|
|
- [Version Support](#version-support)
|
|
|
|
- [Working on the Current Release](#working-on-the-current-release)
|
|
|
|
- [Backporting Fixes](#backporting-fixes)
|
|
|
|
|
|
|
|
<!-- /MarkdownTOC -->
|
|
|
|
|
|
|
|
## Versioning
|
2020-07-21 15:59:40 +03:00
|
|
|
|
2020-07-01 17:26:49 +03:00
|
|
|
Releases of Enso are versioned using [semantic versioning](https://semver.org).
|
|
|
|
Where `a.b.c-tag` is the version string, `a` is the major version, `b`, is the
|
|
|
|
minor version, `c` is the patch version, and `tag` is additional metadata, the
|
|
|
|
following hold:
|
|
|
|
|
|
|
|
- Breaking changes to language behaviour or the public API will result in a
|
|
|
|
major version increase.
|
|
|
|
- Addition of functionality in a backwards-compatible manner will result in a
|
|
|
|
minor version increase.
|
|
|
|
- Backwards-compatible bug fixes will result in a patch version increase.
|
|
|
|
- The tag will indicate pre-release or beta versions, and will increase when any
|
|
|
|
pre-release change is made. These are not intended to be stable.
|
|
|
|
|
2020-07-08 16:54:41 +03:00
|
|
|
### Launcher Versioning
|
2020-07-21 15:59:40 +03:00
|
|
|
|
2020-07-08 16:54:41 +03:00
|
|
|
The launcher is released alongside Enso releases, so the launcher version is
|
|
|
|
tied to the Enso version that it is released with.
|
|
|
|
|
2020-07-01 17:26:49 +03:00
|
|
|
## Release Branches
|
2020-07-21 15:59:40 +03:00
|
|
|
|
2020-07-01 17:26:49 +03:00
|
|
|
A release branch in the Enso repository is a branch prefixed with `release/`.
|
|
|
|
Release branches obey the following rules:
|
|
|
|
|
|
|
|
- One release branch exists per major version, and is named `release/n.x`, where
|
|
|
|
`n` is the major version, and the rest is literal.
|
|
|
|
- A release branch must contain _tags_ corresponding to released versions of
|
|
|
|
Enso. Once a release has been made, no further changes may be made to that
|
|
|
|
release.
|
|
|
|
- A tagged release must contain a `CHANGELOG` file that describes the changes
|
|
|
|
contained in that release.
|
|
|
|
|
|
|
|
It should be noted that general development still takes place on the `main`
|
|
|
|
branch of the repository.
|
|
|
|
|
|
|
|
## Release Workflow
|
2020-07-21 15:59:40 +03:00
|
|
|
|
2020-07-01 17:26:49 +03:00
|
|
|
Cutting a release for Enso proceeds as follows:
|
|
|
|
|
|
|
|
1. If no release branch exists for the current major version, one should be
|
|
|
|
created.
|
|
|
|
2. Release notes should be made up to date.
|
|
|
|
3. A commit representing the release should be tagged, and the tag pushed to
|
|
|
|
GitHub.
|
|
|
|
4. CI will create a draft release for this tag, as well as build and upload the
|
|
|
|
appropriate artefacts.
|
|
|
|
5. The release notes for the version being released should be copied into the
|
|
|
|
release body on GitHub.
|
|
|
|
6. The release must be verified by two members of the engine team, and the QA
|
|
|
|
team.
|
|
|
|
7. Once approval has been gained from these members, the release may be made
|
|
|
|
official.
|
|
|
|
|
|
|
|
### Tag Naming
|
2020-07-21 15:59:40 +03:00
|
|
|
|
2020-07-01 17:26:49 +03:00
|
|
|
Tags for releases are named as follows `enso-version`, where `version` is the
|
|
|
|
semver string (see [versioning](#versioning)) representing the version being
|
|
|
|
released.
|
|
|
|
|
|
|
|
### GitHub Releases
|
2020-07-21 15:59:40 +03:00
|
|
|
|
2020-07-01 17:26:49 +03:00
|
|
|
A release is considered _official_ once it has been made into a release on
|
|
|
|
[GitHub](https://github.com/enso-org/enso/releases). Once official, a release
|
|
|
|
may not be changed in any way, except to mark it as broken.
|
|
|
|
|
2020-07-08 16:54:41 +03:00
|
|
|
#### Manifest File
|
2020-07-21 15:59:40 +03:00
|
|
|
|
2020-07-21 11:14:26 +03:00
|
|
|
Each GitHub release contains an asset named `manifest.yaml` which is a YAML file
|
|
|
|
containing metadata regarding the release. The manifest is also included in the
|
|
|
|
root of an Enso version package. It has at least the following fields:
|
2020-07-08 16:54:41 +03:00
|
|
|
|
|
|
|
- `minimum-launcher-version` - specifies the minimum version of the launcher
|
|
|
|
that should be used with this release of Enso,
|
|
|
|
- `graal-vm-version` - specifies the exact version of GraalVM that should be
|
|
|
|
used with this release of Enso,
|
|
|
|
- `graal-java-version` - as GraalVM versions may have different variants for
|
|
|
|
different Java versions, this specifies which variant to use.
|
|
|
|
|
2020-08-19 15:24:31 +03:00
|
|
|
It can also contain the following additional fields:
|
|
|
|
|
|
|
|
- `jvm-options` - specifies a list of options that should be passed to the JVM
|
|
|
|
running the engine. These options can be used to fine-tune version specific
|
|
|
|
optimization settings etc. Each option must have a key called `value` which
|
|
|
|
specifies what option should be passed. That value can include a variable
|
|
|
|
`$enginePackagePath` which is substituted with the absolute path to the root
|
|
|
|
of the engine package that is being launched. Optionally, the option may
|
|
|
|
define `os` which will restrict this option only to the provided operating
|
|
|
|
system. Possible `os` values are `linux`, `macos` and `windows`.
|
2020-09-01 13:03:48 +03:00
|
|
|
- `broken` - can be set to `true` to mark this release as broken. This field is
|
|
|
|
never set in a release. Instead, when the launcher is installing a release
|
|
|
|
marked as broken using the `broken` file, it adds this property to the
|
|
|
|
manifest to preserve that information.
|
2020-08-19 15:24:31 +03:00
|
|
|
|
2020-07-08 16:54:41 +03:00
|
|
|
For example:
|
2020-07-21 15:59:40 +03:00
|
|
|
|
2020-07-08 16:54:41 +03:00
|
|
|
```yaml
|
2020-07-10 13:57:42 +03:00
|
|
|
minimum-launcher-version: 0.0.1
|
2020-08-28 14:03:09 +03:00
|
|
|
graal-vm-version: 20.2.0
|
2020-08-10 13:14:39 +03:00
|
|
|
graal-java-version: 11
|
2020-08-19 15:24:31 +03:00
|
|
|
jvm-options:
|
|
|
|
- value: "-Dpolyglot.engine.IterativePartialEscape=true"
|
|
|
|
- value: "-Dtruffle.class.path.append=$enginePackagePath\\component\\runtime.jar"
|
|
|
|
os: "windows"
|
|
|
|
- value: "-Dtruffle.class.path.append=$enginePackagePath/component/runtime.jar"
|
|
|
|
os: "linux"
|
|
|
|
- value: "-Dtruffle.class.path.append=$enginePackagePath/component/runtime.jar"
|
|
|
|
os: "macos"
|
2020-07-08 16:54:41 +03:00
|
|
|
```
|
|
|
|
|
2020-07-10 13:57:42 +03:00
|
|
|
The `minimum-launcher-version` should be updated whenever a new version of Enso
|
|
|
|
introduces changes that require a more recent launcher version. This value is
|
|
|
|
stored in
|
2020-07-21 11:14:26 +03:00
|
|
|
[`distribution/manifest.template.yaml`](../../distribution/manifest.template.yaml)
|
2020-07-10 13:57:42 +03:00
|
|
|
and other values are added to this template at build time.
|
|
|
|
|
2020-07-08 16:54:41 +03:00
|
|
|
#### Release Assets Structure
|
2020-07-21 15:59:40 +03:00
|
|
|
|
2020-07-08 16:54:41 +03:00
|
|
|
Each release contains a build of the Enso engine and native launcher binaries
|
|
|
|
for each supported platform. Moreover, for convenience, it should include
|
|
|
|
bundles containing native launcher binaries and the latest engine build for each
|
|
|
|
platform. So each release should contain the following assets:
|
|
|
|
|
2020-08-07 12:18:09 +03:00
|
|
|
- `enso-bundle-<version>-linux-amd64.tar.gz`
|
|
|
|
- `enso-bundle-<version>-macos-amd64.tar.gz`
|
2020-07-08 16:54:41 +03:00
|
|
|
- `enso-bundle-<version>-windows-amd64.zip`
|
2020-08-07 12:18:09 +03:00
|
|
|
- `enso-engine-<version>-linux-amd64.tar.gz`
|
|
|
|
- `enso-engine-<version>-macos-amd64.tar.gz`
|
|
|
|
- `enso-engine-<version>-windows-amd64.zip`
|
|
|
|
- `enso-launcher-<version>-linux-amd64.tar.gz`
|
|
|
|
- `enso-launcher-<version>-macos-amd64.tar.gz`
|
2020-07-08 16:54:41 +03:00
|
|
|
- `enso-launcher-<version>-windows-amd64.zip`
|
2020-07-21 11:14:26 +03:00
|
|
|
- `manifest.yaml`
|
2020-07-08 16:54:41 +03:00
|
|
|
|
2020-07-01 17:26:49 +03:00
|
|
|
#### Marking a Release as Broken
|
2020-07-21 15:59:40 +03:00
|
|
|
|
2020-07-01 17:26:49 +03:00
|
|
|
We intend to _never_ delete a release from GitHub, as users may have projects
|
|
|
|
that depend on specific versions of Enso. Instead, we provide a mechanism for
|
|
|
|
marking releases as broken that works as follows:
|
|
|
|
|
|
|
|
- An empty file named `broken` is uploaded to the release.
|
|
|
|
- The release description is edited to visibly mark the release as broken.
|
|
|
|
|
2020-07-21 15:59:40 +03:00
|
|
|
A broken release is one that _must not_ be downloaded by the launcher unless a
|
|
|
|
project specifies _an exact version match_, and it _must not_ be used in new
|
2020-07-01 17:26:49 +03:00
|
|
|
projects by the launcher unless _explicitly_ specified by the user as an exact
|
|
|
|
version match.
|
|
|
|
|
|
|
|
### Release Notes
|
2020-07-21 15:59:40 +03:00
|
|
|
|
2020-07-01 17:26:49 +03:00
|
|
|
Release notes should contain a summary of the changes made between the last
|
|
|
|
release and the current release. They should follow the template given below:
|
|
|
|
|
|
|
|
```md
|
|
|
|
# Enso x.y.z (YYYY-MM-DD)
|
|
|
|
|
|
|
|
## Language
|
|
|
|
|
|
|
|
- A list of language-level changes.
|
|
|
|
|
|
|
|
## Type System
|
|
|
|
|
|
|
|
- A list of type-system changes.
|
|
|
|
|
|
|
|
## Interpreter
|
|
|
|
|
|
|
|
- A list of changes to the Enso interpreter.
|
|
|
|
|
|
|
|
## Runtime
|
|
|
|
|
|
|
|
- A list of changes to the Enso runtime.
|
|
|
|
|
|
|
|
## Tooling
|
|
|
|
|
|
|
|
- A list of changes to the Enso language tooling.
|
|
|
|
|
|
|
|
## Libraries
|
|
|
|
|
|
|
|
- A list of changes to the Enso core libraries.
|
|
|
|
|
|
|
|
## Stabilised Features
|
|
|
|
|
|
|
|
- A list of stabilised APIs and/or features.
|
|
|
|
|
|
|
|
## Misc
|
|
|
|
|
|
|
|
- A list of miscellaneous changes.
|
|
|
|
|
|
|
|
## Internal Only
|
|
|
|
|
|
|
|
- A list of changes that do not have user-facing impact, but represent
|
|
|
|
significant improvements to the internals of Enso and related tools.
|
|
|
|
```
|
|
|
|
|
|
|
|
If there are no changes for a section, the section should contain a bullet point
|
|
|
|
that reads "Nothing".
|
|
|
|
|
|
|
|
The changelog file is an ongoing record of changes, and may diverge between
|
|
|
|
`main` and the various release branches.
|
|
|
|
|
|
|
|
## Version Support
|
2020-07-21 15:59:40 +03:00
|
|
|
|
2020-07-01 17:26:49 +03:00
|
|
|
We aim to support a given major version for some period of time after the
|
|
|
|
release of the next major version. For a detailed breakdown of the major
|
|
|
|
versions that are currently supported, please see the [security](./security.md)
|
|
|
|
document.
|
|
|
|
|
|
|
|
## Working on the Current Release
|
2020-07-21 15:59:40 +03:00
|
|
|
|
2020-07-01 17:26:49 +03:00
|
|
|
When working on the current release, development should take place against the
|
|
|
|
`main` branch. When it is time to cut a release, the new commits on the main
|
|
|
|
branch are cherry-picked onto the current release branch. From there, the
|
|
|
|
release proceeds as described in [release workflow](#release-workflow) above.
|
|
|
|
|
|
|
|
## Backporting Fixes
|
2020-07-21 15:59:40 +03:00
|
|
|
|
2020-07-01 17:26:49 +03:00
|
|
|
Supporting a major version for some time after the release of the next major
|
|
|
|
version will sometimes require backporting a fix to the previous major version
|
|
|
|
from the current version or from `main`.
|
|
|
|
|
|
|
|
Backporting should only be used for applying _fixes_, not the addition of new
|
|
|
|
features.
|
|
|
|
|
|
|
|
The process for performing such a backport is as follows:
|
|
|
|
|
|
|
|
1. Create a new branch called `backport/version/fix-name`, where `version`
|
|
|
|
matches the version string of the corresponding release branch. This branch
|
|
|
|
should branch off the corresponding release branch.
|
|
|
|
2. Back-port the fix to the newly created `backport` branch. This can be done
|
|
|
|
by:
|
|
|
|
- Cherry-picking the commit and performing fixups (preferred).
|
|
|
|
- Re-implementing the fix manually (if cherry-picking will not work due to
|
|
|
|
progression of the codebase).
|
|
|
|
3. Submit your `backport/version/fix-name` branch for review as a pull-request
|
|
|
|
into the `release/version` branch.
|
|
|
|
4. Once the PR has passed CI and been approved by the appropriate reviewers, it
|
|
|
|
can be merged into the release branch.
|