enso/docs/distribution/release-policy.md

266 lines
9.7 KiB
Markdown
Raw Normal View History

---
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
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)
- [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)
- [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
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.
## Release Branches
2020-07-21 15:59:40 +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
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
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
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
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.
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`.
- `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-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
graal-java-version: 11
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
[`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`
- `manifest.yaml`
2020-07-08 16:54:41 +03:00
#### Marking a Release as Broken
2020-07-21 15:59:40 +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
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
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
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
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
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.