project/RELEASE-CHECKLIST.md
b57051a7
 # Release Checklist
b5a48eae
 ## A maintainer's guide to releasing Docker
 
 So you're in charge of a Docker release? Cool. Here's what to do.
 
 If your experience deviates from this document, please document the changes
 to keep it up-to-date.
 
661cf32e
 It is important to note that this document assumes that the git remote in your
b3ee9ac7
 repository that corresponds to "https://github.com/docker/docker" is named
661cf32e
 "origin".  If yours is not (for example, if you've chosen to name it "upstream"
 or something similar instead), be sure to adjust the listed snippets for your
 local environment accordingly.  If you are not sure what your upstream remote is
 named, use a command like `git remote -v` to find out.
 
 If you don't have an upstream remote, you can add one easily using something
 like:
 
 ```bash
586e7221
 export GITHUBUSER="YOUR_GITHUB_USER"
b3ee9ac7
 git remote add origin https://github.com/docker/docker.git
586e7221
 git remote add $GITHUBUSER git@github.com:$GITHUBUSER/docker.git
661cf32e
 ```
 
b5a48eae
 ### 1. Pull from master and create a release branch
 
bca81591
 All releases version numbers will be of the form: vX.Y.Z  where X is the major
 version number, Y is the minor version number and Z is the patch release version number.
 
 #### Major releases
 
 The release branch name is just vX.Y because it's going to be the basis for all .Z releases.
586e7221
 
b5a48eae
 ```bash
bca81591
 export BASE=vX.Y
b57051a7
 export VERSION=vX.Y.Z
586e7221
 git fetch origin
bca81591
 git checkout --track origin/master
 git checkout -b release/$BASE
 ```
 
 This new branch is going to be the base for the release. We need to push it to origin so we
 can track the cherry-picked changes and the version bump:
 
 ```bash
 git push origin release/$BASE
 ```
 
 When you have the major release branch in origin, we need to create the bump fork branch
 that we'll push to our fork:
 
 ```bash
b5a48eae
 git checkout -b bump_$VERSION
751c7e0f
 ```
 
bca81591
 #### Patch releases
 
 If we have the release branch in origin, we can create the forked bump branch from it directly:
 
751c7e0f
 ```bash
bca81591
 export VERSION=vX.Y.Z
 export PATCH=vX.Y.Z+1
 git fetch origin
 git checkout --track origin/release/$BASE
 git checkout -b bump_$PATCH
b5a48eae
 ```
e1166861
 
bca81591
 We cherry-pick only the commits we want into the bump branch:
 
751c7e0f
 ```bash
e1166861
 # get the commits ids we want to cherry-pick
751c7e0f
 git log
e1166861
 # cherry-pick the commits starting from the oldest one, without including merge commits
751c7e0f
 git cherry-pick <commit-id>
 git cherry-pick <commit-id>
 ...
 ```
b5a48eae
 
a8253ec7
 ### 2. Bump the API version on master
 
 We don't want to stop contributions to master just because we are releasing. At
 the same time, now that the release branch exists, we don't want API changes to
 go to the now frozen API version.
 
3f4eeca6
 Create a new entry in `docs/reference/api/` by copying the latest and
a8253ec7
 bumping the version number (in both the file's name and content), and submit
 this in a PR against master.
 
 ### 3. Update CHANGELOG.md
b5a48eae
 
586e7221
 You can run this command for reference with git 2.0:
 
 ```bash
 git fetch --tags
 LAST_VERSION=$(git tag -l --sort=-version:refname "v*" | grep -E 'v[0-9\.]+$' | head -1)
 git log --stat $LAST_VERSION..bump_$VERSION
 ```
b5a48eae
 
586e7221
 If you don't have git 2.0 but have a sort command that supports `-V`:
b5a48eae
 ```bash
586e7221
 git fetch --tags
 LAST_VERSION=$(git tag -l | grep -E 'v[0-9\.]+$' | sort -rV | head -1)
 git log --stat $LAST_VERSION..bump_$VERSION
b5a48eae
 ```
 
586e7221
 If releasing a major version (X or Y increased in vX.Y.Z), simply listing notable user-facing features is sufficient.
 ```markdown
 #### Notable features since <last major version>
 * New docker command to do something useful
 * Remote API change (deprecating old version)
 * Performance improvements in some usecases
 * ...
 ```
 
 For minor releases (only Z increases in vX.Y.Z), provide a list of user-facing changes.
b57051a7
 Each change should be listed under a category heading formatted as `#### CATEGORY`.
b5a48eae
 
b57051a7
 `CATEGORY` should describe which part of the project is affected.
b5a48eae
   Valid categories are:
   * Builder
   * Documentation
   * Hack
   * Packaging
   * Remote API
   * Runtime
b57051a7
   * Other (please use this category sparingly)
 
 Each change should be formatted as `BULLET DESCRIPTION`, given:
b5a48eae
 
b57051a7
 * BULLET: either `-`, `+` or `*`, to indicate a bugfix, new feature or
   upgrade, respectively.
 
 * DESCRIPTION: a concise description of the change that is relevant to the
   end-user, using the present tense. Changes should be described in terms
   of how they affect the user, for example "Add new feature X which allows Y",
   "Fix bug which caused X", "Increase performance of Y".
b5a48eae
 
 EXAMPLES:
 
b57051a7
 ```markdown
 ## 0.3.6 (1995-12-25)
 
 #### Builder
 
a0505edc
 + 'docker build -t FOO .' applies the tag FOO to the newly built image
b57051a7
 
 #### Remote API
 
 - Fix a bug in the optional unix socket transport
 
 #### Runtime
 
 * Improve detection of kernel version
b5a48eae
 ```
 
bac7e741
 If you need a list of contributors between the last major release and the
 current bump branch, use something like:
 ```bash
 git log --format='%aN <%aE>' v0.7.0...bump_v0.8.0 | sort -uf
 ```
 Obviously, you'll need to adjust version numbers as necessary.  If you just need
 a count, add a simple `| wc -l`.
 
a8253ec7
 ### 4. Change the contents of the VERSION file
b5a48eae
 
d1b515dc
 Before the big thing, you'll want to make successive release candidates and get
 people to test. The release candidate number `N` should be part of the version:
 
37e00831
 ```bash
d1b515dc
 export RC_VERSION=${VERSION}-rcN
 echo ${RC_VERSION#v} > VERSION
37e00831
 ```
 
a8253ec7
 ### 5. Test the docs
cd455ca6
 
 Make sure that your tree includes documentation for any modified or
953abf6a
 new features, syntax or semantic changes.
 
 To test locally:
 
 ```bash
 make docs
 ```
 
5dc83233
 To make a shared test at https://beta-docs.docker.io:
953abf6a
 
 (You will need the `awsconfig` file added to the `docs/` dir)
 
 ```bash
4d109f61
 make AWS_S3_BUCKET=beta-docs.docker.io BUILD_ROOT=yes docs-release
953abf6a
 ```
cd455ca6
 
a8253ec7
 ### 6. Commit and create a pull request to the "release" branch
b5a48eae
 
 ```bash
9420e8de
 git add VERSION CHANGELOG.md
b5a48eae
 git commit -m "Bump version to $VERSION"
586e7221
 git push $GITHUBUSER bump_$VERSION
bca81591
 echo "https://github.com/$GITHUBUSER/docker/compare/docker:release/$BASE...$GITHUBUSER:bump_$VERSION?expand=1"
b5a48eae
 ```
 
b57051a7
 That last command will give you the proper link to visit to ensure that you
 open the PR against the "release" branch instead of accidentally against
 "master" (like so many brave souls before you already have).
 
d0a4b216
 ### 7. Build release candidate rpms and debs
 
 ```bash
 docker build -t docker .
 docker run \
     --rm -t --privileged \
     -v $(pwd)/bundles:/go/src/github.com/docker/docker/bundles \
     docker \
     hack/make.sh binary build-deb build-rpm
 ```
 
 ### 8. Publish release candidate binaries
b57051a7
 
d1b515dc
 To run this you will need access to the release credentials. Get them from the
 Core maintainers.
586e7221
 
 Replace "..." with the respective credentials:
b57051a7
 
 ```bash
 docker build -t docker .
bca81591
 
b57051a7
 docker run \
d0a4b216
     -e AWS_S3_BUCKET=test.docker.com \ # static binaries are still pushed to s3
     -e AWS_ACCESS_KEY="..." \
     -e AWS_SECRET_KEY="..." \
     -i -t --privileged \
     docker \
     hack/release.sh
b57051a7
 ```
 
d0a4b216
 It will run the test suite, build the binaries and upload to the specified bucket,
 so this is a good time to verify that you're running against **test**.docker.com.
b57051a7
 
d0a4b216
 After the binaries are uploaded to test.docker.com and the packages are on
 apt.dockerproject.org and yum.dockerproject.org, make sure
b57051a7
 they get tested in both Ubuntu and Debian for any obvious installation
 issues or runtime issues.
 
d1b515dc
 If everything looks good, it's time to create a git tag for this candidate:
 
 ```bash
 git tag -a $RC_VERSION -m $RC_VERSION bump_$VERSION
 git push origin $RC_VERSION
 ```
 
 Announcing on multiple medias is the best way to get some help testing! An easy
 way to get some useful links for sharing:
b57051a7
 
 ```bash
d0a4b216
 echo "Ubuntu/Debian: curl -sSL https://test.docker.com/ | sh"
80825765
 echo "Linux 64bit binary: https://test.docker.com/builds/Linux/x86_64/docker-${VERSION#v}"
 echo "Darwin/OSX 64bit client binary: https://test.docker.com/builds/Darwin/x86_64/docker-${VERSION#v}"
 echo "Linux 64bit tgz: https://test.docker.com/builds/Linux/x86_64/docker-${VERSION#v}.tgz"
814ce44d
 echo "Windows 64bit client binary: https://test.docker.com/builds/Windows/x86_64/docker-${VERSION#v}.exe"
 echo "Windows 32bit client binary: https://test.docker.com/builds/Windows/i386/docker-${VERSION#v}.exe"
b57051a7
 ```
 
d1b515dc
 We recommend announcing the release candidate on:
b57051a7
 
d1b515dc
 - IRC on #docker, #docker-dev, #docker-maintainers
 - In a comment on the pull request to notify subscribed people on GitHub
 - The [docker-dev](https://groups.google.com/forum/#!forum/docker-dev) group
 - The [docker-maintainers](https://groups.google.com/a/dockerproject.org/forum/#!forum/maintainers) group
8d138eb7
 - Any social media that can bring some attention to the release candidate
b57051a7
 
d0a4b216
 ### 9. Iterate on successive release candidates
6fc83eef
 
 Spend several days along with the community explicitly investing time and
 resources to try and break Docker in every possible way, documenting any
 findings pertinent to the release.  This time should be spent testing and
 finding ways in which the release might have caused various features or upgrade
 environments to have issues, not coding.  During this time, the release is in
 code freeze, and any additional code changes will be pushed out to the next
 release.
 
 It should include various levels of breaking Docker, beyond just using Docker
 by the book.
 
 Any issues found may still remain issues for this release, but they should be
 documented and give appropriate warnings.
 
d1b515dc
 During this phase, the `bump_$VERSION` branch will keep evolving as you will
 produce new release candidates. The frequency of new candidates is up to the
 release manager: use your best judgement taking into account the severity of
 reported issues, testers availability, and time to scheduled release date.
 
 Each time you'll want to produce a new release candidate, you will start by
 adding commits to the branch, usually by cherry-picking from master:
 
 ```bash
 git cherry-pick -x -m0 <commit_id>
 ```
 
 You want your "bump commit" (the one that updates the CHANGELOG and VERSION
 files) to remain on top, so you'll have to `git rebase -i` to bring it back up.
 
 Now that your bump commit is back on top, you will need to update the CHANGELOG
 file (if appropriate for this particular release candidate), and update the
 VERSION file to increment the RC number:
 
 ```bash
 export RC_VERSION=$VERSION-rcN
 echo $RC_VERSION > VERSION
 ```
 
 You can now amend your last commit and update the bump branch:
 
 ```bash
 git commit --amend
 git push -f $GITHUBUSER bump_$VERSION
 ```
 
 Repeat step 6 to tag the code, publish new binaries, announce availability, and
 get help testing.
 
d0a4b216
 ### 10. Finalize the bump branch
d1b515dc
 
 When you're happy with the quality of a release candidate, you can move on and
 create the real thing.
 
 You will first have to amend the "bump commit" to drop the release candidate
 suffix in the VERSION file:
 
 ```bash
 echo $VERSION > VERSION
 git add VERSION
 git commit --amend
 ```
 
 You will then repeat step 6 to publish the binaries to test
 
d0a4b216
 ### 11. Get 2 other maintainers to validate the pull request
d1b515dc
 
d0a4b216
 ### 12. Build final rpms and debs
 
 ```bash
 docker build -t docker .
 docker run \
     --rm -t --privileged \
     -v $(pwd)/bundles:/go/src/github.com/docker/docker/bundles \
     docker \
     hack/make.sh binary build-deb build-rpm
 ```
 
 ### 13. Publish final binaries
d1b515dc
 
 Once they're tested and reasonably believed to be working, run against
 get.docker.com:
 
 ```bash
d0a4b216
 docker build -t docker .
d1b515dc
 docker run \
d0a4b216
     -e AWS_S3_BUCKET=get.docker.com \ # static binaries are still pushed to s3
     -e AWS_ACCESS_KEY="..." \
     -e AWS_SECRET_KEY="..." \
     -i -t --privileged \
     docker \
     hack/release.sh
d1b515dc
 ```
 
d0a4b216
 ### 14. Apply tag and create release
586e7221
 
 It's very important that we don't make the tag until after the official
80825765
 release is uploaded to get.docker.com!
b5a48eae
 
 ```bash
37e00831
 git tag -a $VERSION -m $VERSION bump_$VERSION
 git push origin $VERSION
b5a48eae
 ```
 
1d0ee18d
 Once the tag is pushed, go to GitHub and create a [new release](https://github.com/docker/docker/releases/new).
 If the tag is for an RC make sure you check `This is a pre-release` at the bottom of the form.
 
 Select the tag that you just pushed as the version and paste the changelog in the description of the release.
 You can see examples in this two links:
 
 https://github.com/docker/docker/releases/tag/v1.8.0
 https://github.com/docker/docker/releases/tag/v1.8.0-rc3
 
d0a4b216
 ### 15. Go to github to merge the `bump_$VERSION` branch into release
b57051a7
 
0a819380
 Don't forget to push that pretty blue button to delete the leftover
 branch afterwards!
da3a5274
 
d0a4b216
 ### 16. Update the docs branch
da3a5274
 
1d0ee18d
 You will need to point the docs branch to the newly created release tag:
953abf6a
 
0a819380
 ```bash
1d0ee18d
 git checkout origin/docs
 git reset --hard origin/$VERSION
0a819380
 git push -f origin docs
 ```
9420e8de
 
5dc83233
 The docs will appear on https://docs.docker.com/ (though there may be cached
3472c006
 versions, so its worth checking http://docs.docker.com.s3-website-us-east-1.amazonaws.com/).
953abf6a
 For more information about documentation releases, see `docs/README.md`.
37e00831
 
cfaffd1a
 Note that the new docs will not appear live on the site until the cache (a complex,
 distributed CDN system) is flushed. The `make docs-release` command will do this
 _if_ the `DISTRIBUTION_ID` is set correctly - this will take at least 15 minutes to run
1d0ee18d
 and you can check its progress with the CDN Cloudfront Chrome addon.
3472c006
 
d0a4b216
 ### 17. Create a new pull request to merge your bump commit back into master
b5a48eae
 
 ```bash
b57051a7
 git checkout master
9420e8de
 git fetch
b57051a7
 git reset --hard origin/master
d1b515dc
 git cherry-pick $VERSION
586e7221
 git push $GITHUBUSER merge_release_$VERSION
b3ee9ac7
 echo "https://github.com/$GITHUBUSER/docker/compare/docker:master...$GITHUBUSER:merge_release_$VERSION?expand=1"
b5a48eae
 ```
 
b57051a7
 Again, get two maintainers to validate, then merge, then push that pretty
 blue button to delete your branch.
b5a48eae
 
d0a4b216
 ### 18. Update the VERSION files
f07ac127
 
 Now that version X.Y.Z is out, time to start working on the next! Update the
 content of the `VERSION` file to be the next minor (incrementing Y) and add the
 `-dev` suffix. For example, after 1.5.0 release, the `VERSION` file gets
 updated to `1.6.0-dev` (as in "1.6.0 in the making").
 
d0a4b216
 ### 19. Rejoice and Evangelize!
b5a48eae
 
 Congratulations! You're done.
37e00831
 
 Go forth and announce the glad tidings of the new release in `#docker`,
a1add90d
 `#docker-dev`, on the [dev mailing list](https://groups.google.com/forum/#!forum/docker-dev),
 the [announce mailing list](https://groups.google.com/forum/#!forum/docker-announce),
37e00831
 and on Twitter!