# Release Process Documentation

## Release Process Overview

This describes the _technical_, theoretical steps of a release. (For all the _organizational_ steps and actual commands to execute, please refer to the [Detailed Release Process Documentation](#detailed-release-process-documentation) below.)

TODO maybe rewrite release-from-master focused with fallback "needs release branch" instead of release-from-branch focused.

- Decide on release type:   
  a) minor/major  
  b) patch
- Checkout correct branch:   
  - If minor/major: `master`  
  - If patch: existing release branch
- Prepare Release
  - If patch: _Cherry pick_ fixes from `master` (or create on release branch directly or via PR and _commit_)
  - [Code Maintenance](code-maintenance.md)
  - If major (and not bumped manually with breaking commit before): Bump major and _commit_
  - [Test](testing-releases.md)
    - Fix any regressions and _commit_
  - Create, curate Release Notes into `RELEASENOTES.md` and _commit_
- Release
  - Remove `-dev` suffix in version and Release Notes (and _commit_)
  - _Tag_
  - Apache: Create archive and upload to [`dist/dev`](https://dist.apache.org/repos/dist/dev/cordova/)
  - Bump patch + add `-dev` back (and _commit_)
  - If minor/major: _Create_ new release branch
  - _Push_ all changes, release branch and tag
- Vote
  - Other PMC members [test the release](testing-releases.md) and vote
- On success:
  - Apache: Promote from [`dist/dev`](https://dist.apache.org/repos/dist/dev/cordova/) to [`dist/release`](https://dist.apache.org/repos/dist/release/cordova/)
  - Apache: Add `rel/` tag
  - Publish archive (!) to npm
  - If patch: Cherry pick release notes and version bump commit from release branch to `master`
  - _Push_ changes and tag
- On failure:
  - Remove created tag (and _push_), delete uploaded archive from [`dist/dev`](https://dist.apache.org/repos/dist/dev/cordova/), unbump patch on release branch (and _commit_ and _push_)
    - TODO ALTERNATIVE: remove tag, delete archive, start from beginning with now a patch release
    - TODO ALTERNATIVE: https://github.com/apache/cordova-coho/blob/master/docs/platforms-release-process.md#if-the-vote-does-not-pass
  - Fix problem
  - Restart at "Release"

This list also does not include steps that are only required for one type of component:

- Platforms: Update `cordova.js`, propagate version number to other platform files (which those are depends on the platform), tag `master` of `cordova-js` with new platform version, make sure documentation is up to date or create PR that can be merged after release, Android only: Publish to Bintray
- Plugins: Make sure `README.md` is correct
- Tools: cordova-lib: Update `platformsConfig.json`, all: update cross dependencies between libraries, 

The detailed documentation below does include these at the appropriate locations.

## Detailed Release Process Documentation

This generalized release process is supported and partly automated by our `cordova-coho` CLI tool. As details of this process are different depending on what kind of package you want to release, we have individual detailed release process documentation that contains the actual commands to run:

- [Platforms](https://github.com/apache/cordova-coho/blob/master/docs/platforms-release-process.md)
- [Plugins](https://github.com/apache/cordova-coho/blob/master/docs/plugins-release-process.md)
- [Tooling](https://github.com/apache/cordova-coho/blob/master/docs/tools-release-process.md)
- [Hello World App](https://github.com/apache/cordova-coho/blob/master/docs/app-hello-world-release-process.md)
- [Coho](https://github.com/apache/cordova-coho/blob/master/docs/coho-release-process.md)
