diff --git a/docs/development/releasing.md b/docs/development/releasing.md new file mode 100644 index 0000000000..5abeac4580 --- /dev/null +++ b/docs/development/releasing.md @@ -0,0 +1,100 @@ +# Releasing + +This document describes the process for releasing a new version of Electron. + +## Compile release notes + +The current process is to maintain a local file, keeping track of notable changes as pull requests are merged. For examples of how to format the notes, see previous releases on [the releases page]. + +## Create a temporary branch + +Create a new branch from `master` named `release`. + +```sh +git checkout master +git pull +git checkout -b release +``` + +This branch is created as a precaution to prevent any merged PRs from sneaking into a release between the time the temporary release branch is created and the CI builds are complete. + +## Bump the version + +Run the `bump-version` script, passing `major`, `minor`, or `patch` as an argument: + +```sh +npm run bump-version -- patch +``` + +This will bump the version number in several files. See [this bump commit] for an example. + +Most releases will be `patch` level. Upgrades to Chrome or other major changes should use `minor`. For more info, see [electron-versioning]. + +## Edit the release draft + +1. Visit [the releases page] and you'll see a new draft release with placeholder release notes. +1. Edit the release and add release notes. +1. Click 'Save draft'. **Do not click 'Publish release'!** +1. Wait for all the builds to pass. :hourglass_flowing_sand: + +## Merge temporary branch + +Merge the temporary back into master, without creating a merge commit: + +```sh +git merge release master --no-commit +git push origin master +``` + +If this fails, rebase with master and rebuild: + +```sh +git pull +git checkout release +git rebase master +git push origin HEAD +``` + +## Run local debug build + +Run local debug build to verify that you are actually building the version you want. Sometimes you thought you were doing a release for a new version, but you're actually not. + +```sh +npm run build +npm start +``` + +Verify the window is displaying the current updated version. + +## Set environment variables + +You'll need to set the following environment variables to publish a release. Ask another team member for these credentials. + +- `ELECTRON_S3_BUCKET` +- `ELECTRON_S3_ACCESS_KEY` +- `ELECTRON_S3_SECRET_KEY` +- `ELECTRON_GITHUB_TOKEN` - A personal access token with "repo" scope. + +You will only need to do this once. + +## Publish the release + +This script will download the binaries and generate the node headers and the .lib linker used on Windows by node-gyp to build native modules. + +```sh +npm run release +``` + +Note: Many distributions of Python still ship with old HTTPS certificates. You may see a `InsecureRequestWarning`, but it can be disregarded. + +## Delete the temporary branch + +```sh +git checkout master +git branch -D release # delete local branch +git push origin :release # delete remote branch +``` + +[the releases page]: https://github.com/electron/electron/releases +[this bump commit]: https://github.com/electron/electron/commit/78ec1b8f89b3886b856377a1756a51617bc33f5a +[electron-versioning]: /docs/tutorial/electron-versioning.md diff --git a/package.json b/package.json index 3550dad4c3..06a5d9596b 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "scripts": { "bootstrap": "python ./script/bootstrap.py", "browserify": "browserify", + "bump-version": "./script/bump-version.py", "build": "python ./script/build.py -c D", "clean": "python ./script/clean.py", "coverage": "npm run instrument-code-coverage && npm test -- --use-instrumented-asar", @@ -38,6 +39,7 @@ "lint-api-docs-js": "standard-markdown docs && standard-markdown docs-translations", "lint-api-docs": "electron-docs-linter docs/api --version=$npm_package_version --outfile=out/electron-api.json", "preinstall": "node -e 'process.exit(0)'", + "release": "./script/upload.py -p", "repl": "python ./script/start.py --interactive", "start": "python ./script/start.py", "test": "python ./script/test.py"