github.com/jandre/docker@v1.7.0/project/RELEASE-CHECKLIST.md (about) 1 # Release Checklist 2 ## A maintainer's guide to releasing Docker 3 4 So you're in charge of a Docker release? Cool. Here's what to do. 5 6 If your experience deviates from this document, please document the changes 7 to keep it up-to-date. 8 9 It is important to note that this document assumes that the git remote in your 10 repository that corresponds to "https://github.com/docker/docker" is named 11 "origin". If yours is not (for example, if you've chosen to name it "upstream" 12 or something similar instead), be sure to adjust the listed snippets for your 13 local environment accordingly. If you are not sure what your upstream remote is 14 named, use a command like `git remote -v` to find out. 15 16 If you don't have an upstream remote, you can add one easily using something 17 like: 18 19 ```bash 20 export GITHUBUSER="YOUR_GITHUB_USER" 21 git remote add origin https://github.com/docker/docker.git 22 git remote add $GITHUBUSER git@github.com:$GITHUBUSER/docker.git 23 ``` 24 25 ### 1. Pull from master and create a release branch 26 27 Note: Even for major releases, all of X, Y and Z in vX.Y.Z must be specified (e.g. v1.0.0). 28 29 ```bash 30 export VERSION=vX.Y.Z 31 git fetch origin 32 git branch -D release || true 33 git checkout --track origin/release 34 git checkout -b bump_$VERSION 35 ``` 36 37 If it's a regular release, we usually merge master. 38 ```bash 39 git merge origin/master 40 ``` 41 42 Otherwise, if it is a hotfix release, we cherry-pick only the commits we want. 43 ```bash 44 # get the commits ids we want to cherry-pick 45 git log 46 # cherry-pick the commits starting from the oldest one, without including merge commits 47 git cherry-pick <commit-id> 48 git cherry-pick <commit-id> 49 ... 50 ``` 51 52 ### 2. Bump the API version on master 53 54 We don't want to stop contributions to master just because we are releasing. At 55 the same time, now that the release branch exists, we don't want API changes to 56 go to the now frozen API version. 57 58 Create a new entry in `docs/reference/api/` by copying the latest and 59 bumping the version number (in both the file's name and content), and submit 60 this in a PR against master. 61 62 ### 3. Update CHANGELOG.md 63 64 You can run this command for reference with git 2.0: 65 66 ```bash 67 git fetch --tags 68 LAST_VERSION=$(git tag -l --sort=-version:refname "v*" | grep -E 'v[0-9\.]+$' | head -1) 69 git log --stat $LAST_VERSION..bump_$VERSION 70 ``` 71 72 If you don't have git 2.0 but have a sort command that supports `-V`: 73 ```bash 74 git fetch --tags 75 LAST_VERSION=$(git tag -l | grep -E 'v[0-9\.]+$' | sort -rV | head -1) 76 git log --stat $LAST_VERSION..bump_$VERSION 77 ``` 78 79 If releasing a major version (X or Y increased in vX.Y.Z), simply listing notable user-facing features is sufficient. 80 ```markdown 81 #### Notable features since <last major version> 82 * New docker command to do something useful 83 * Remote API change (deprecating old version) 84 * Performance improvements in some usecases 85 * ... 86 ``` 87 88 For minor releases (only Z increases in vX.Y.Z), provide a list of user-facing changes. 89 Each change should be listed under a category heading formatted as `#### CATEGORY`. 90 91 `CATEGORY` should describe which part of the project is affected. 92 Valid categories are: 93 * Builder 94 * Documentation 95 * Hack 96 * Packaging 97 * Remote API 98 * Runtime 99 * Other (please use this category sparingly) 100 101 Each change should be formatted as `BULLET DESCRIPTION`, given: 102 103 * BULLET: either `-`, `+` or `*`, to indicate a bugfix, new feature or 104 upgrade, respectively. 105 106 * DESCRIPTION: a concise description of the change that is relevant to the 107 end-user, using the present tense. Changes should be described in terms 108 of how they affect the user, for example "Add new feature X which allows Y", 109 "Fix bug which caused X", "Increase performance of Y". 110 111 EXAMPLES: 112 113 ```markdown 114 ## 0.3.6 (1995-12-25) 115 116 #### Builder 117 118 + 'docker build -t FOO .' applies the tag FOO to the newly built image 119 120 #### Remote API 121 122 - Fix a bug in the optional unix socket transport 123 124 #### Runtime 125 126 * Improve detection of kernel version 127 ``` 128 129 If you need a list of contributors between the last major release and the 130 current bump branch, use something like: 131 ```bash 132 git log --format='%aN <%aE>' v0.7.0...bump_v0.8.0 | sort -uf 133 ``` 134 Obviously, you'll need to adjust version numbers as necessary. If you just need 135 a count, add a simple `| wc -l`. 136 137 ### 4. Change the contents of the VERSION file 138 139 Before the big thing, you'll want to make successive release candidates and get 140 people to test. The release candidate number `N` should be part of the version: 141 142 ```bash 143 export RC_VERSION=${VERSION}-rcN 144 echo ${RC_VERSION#v} > VERSION 145 ``` 146 147 ### 5. Test the docs 148 149 Make sure that your tree includes documentation for any modified or 150 new features, syntax or semantic changes. 151 152 To test locally: 153 154 ```bash 155 make docs 156 ``` 157 158 To make a shared test at https://beta-docs.docker.io: 159 160 (You will need the `awsconfig` file added to the `docs/` dir) 161 162 ```bash 163 make AWS_S3_BUCKET=beta-docs.docker.io BUILD_ROOT=yes docs-release 164 ``` 165 166 ### 6. Commit and create a pull request to the "release" branch 167 168 ```bash 169 git add VERSION CHANGELOG.md 170 git commit -m "Bump version to $VERSION" 171 git push $GITHUBUSER bump_$VERSION 172 echo "https://github.com/$GITHUBUSER/docker/compare/docker:release...$GITHUBUSER:bump_$VERSION?expand=1" 173 ``` 174 175 That last command will give you the proper link to visit to ensure that you 176 open the PR against the "release" branch instead of accidentally against 177 "master" (like so many brave souls before you already have). 178 179 ### 7. Publish release candidate binaries 180 181 To run this you will need access to the release credentials. Get them from the 182 Core maintainers. 183 184 Replace "..." with the respective credentials: 185 186 ```bash 187 docker build -t docker . 188 docker run \ 189 -e AWS_S3_BUCKET=test.docker.com \ 190 -e AWS_ACCESS_KEY="..." \ 191 -e AWS_SECRET_KEY="..." \ 192 -e GPG_PASSPHRASE="..." \ 193 -i -t --privileged \ 194 docker \ 195 hack/release.sh 196 ``` 197 198 It will run the test suite, build the binaries and packages, and upload to the 199 specified bucket, so this is a good time to verify that you're running against 200 **test**.docker.com. 201 202 After the binaries and packages are uploaded to test.docker.com, make sure 203 they get tested in both Ubuntu and Debian for any obvious installation 204 issues or runtime issues. 205 206 If everything looks good, it's time to create a git tag for this candidate: 207 208 ```bash 209 git tag -a $RC_VERSION -m $RC_VERSION bump_$VERSION 210 git push origin $RC_VERSION 211 ``` 212 213 Announcing on multiple medias is the best way to get some help testing! An easy 214 way to get some useful links for sharing: 215 216 ```bash 217 echo "Ubuntu/Debian: https://test.docker.com/ubuntu or curl -sSL https://test.docker.com/ | sh" 218 echo "Linux 64bit binary: https://test.docker.com/builds/Linux/x86_64/docker-${VERSION#v}" 219 echo "Darwin/OSX 64bit client binary: https://test.docker.com/builds/Darwin/x86_64/docker-${VERSION#v}" 220 echo "Darwin/OSX 32bit client binary: https://test.docker.com/builds/Darwin/i386/docker-${VERSION#v}" 221 echo "Linux 64bit tgz: https://test.docker.com/builds/Linux/x86_64/docker-${VERSION#v}.tgz" 222 ``` 223 224 We recommend announcing the release candidate on: 225 226 - IRC on #docker, #docker-dev, #docker-maintainers 227 - In a comment on the pull request to notify subscribed people on GitHub 228 - The [docker-dev](https://groups.google.com/forum/#!forum/docker-dev) group 229 - The [docker-maintainers](https://groups.google.com/a/dockerproject.org/forum/#!forum/maintainers) group 230 - Any social media that can bring some attention to the release candidate 231 232 ### 8. Iterate on successive release candidates 233 234 Spend several days along with the community explicitly investing time and 235 resources to try and break Docker in every possible way, documenting any 236 findings pertinent to the release. This time should be spent testing and 237 finding ways in which the release might have caused various features or upgrade 238 environments to have issues, not coding. During this time, the release is in 239 code freeze, and any additional code changes will be pushed out to the next 240 release. 241 242 It should include various levels of breaking Docker, beyond just using Docker 243 by the book. 244 245 Any issues found may still remain issues for this release, but they should be 246 documented and give appropriate warnings. 247 248 During this phase, the `bump_$VERSION` branch will keep evolving as you will 249 produce new release candidates. The frequency of new candidates is up to the 250 release manager: use your best judgement taking into account the severity of 251 reported issues, testers availability, and time to scheduled release date. 252 253 Each time you'll want to produce a new release candidate, you will start by 254 adding commits to the branch, usually by cherry-picking from master: 255 256 ```bash 257 git cherry-pick -x -m0 <commit_id> 258 ``` 259 260 You want your "bump commit" (the one that updates the CHANGELOG and VERSION 261 files) to remain on top, so you'll have to `git rebase -i` to bring it back up. 262 263 Now that your bump commit is back on top, you will need to update the CHANGELOG 264 file (if appropriate for this particular release candidate), and update the 265 VERSION file to increment the RC number: 266 267 ```bash 268 export RC_VERSION=$VERSION-rcN 269 echo $RC_VERSION > VERSION 270 ``` 271 272 You can now amend your last commit and update the bump branch: 273 274 ```bash 275 git commit --amend 276 git push -f $GITHUBUSER bump_$VERSION 277 ``` 278 279 Repeat step 6 to tag the code, publish new binaries, announce availability, and 280 get help testing. 281 282 ### 9. Finalize the bump branch 283 284 When you're happy with the quality of a release candidate, you can move on and 285 create the real thing. 286 287 You will first have to amend the "bump commit" to drop the release candidate 288 suffix in the VERSION file: 289 290 ```bash 291 echo $VERSION > VERSION 292 git add VERSION 293 git commit --amend 294 ``` 295 296 You will then repeat step 6 to publish the binaries to test 297 298 ### 10. Get 2 other maintainers to validate the pull request 299 300 ### 11. Publish final binaries 301 302 Once they're tested and reasonably believed to be working, run against 303 get.docker.com: 304 305 ```bash 306 docker run \ 307 -e AWS_S3_BUCKET=get.docker.com \ 308 -e AWS_ACCESS_KEY="..." \ 309 -e AWS_SECRET_KEY="..." \ 310 -e GPG_PASSPHRASE="..." \ 311 -i -t --privileged \ 312 docker \ 313 hack/release.sh 314 ``` 315 316 ### 12. Apply tag 317 318 It's very important that we don't make the tag until after the official 319 release is uploaded to get.docker.com! 320 321 ```bash 322 git tag -a $VERSION -m $VERSION bump_$VERSION 323 git push origin $VERSION 324 ``` 325 326 ### 13. Go to github to merge the `bump_$VERSION` branch into release 327 328 Don't forget to push that pretty blue button to delete the leftover 329 branch afterwards! 330 331 ### 14. Update the docs branch 332 333 If this is a MAJOR.MINOR.0 release, you need to make an branch for the previous release's 334 documentation: 335 336 ```bash 337 git checkout -b docs-$PREVIOUS_MAJOR_MINOR 338 git fetch 339 git reset --hard origin/docs 340 git push -f origin docs-$PREVIOUS_MAJOR_MINOR 341 ``` 342 343 You will need the `awsconfig` file added to the `docs/` directory to contain the 344 s3 credentials for the bucket you are deploying to. 345 346 ```bash 347 git checkout -b docs release || git checkout docs 348 git fetch 349 git reset --hard origin/release 350 git push -f origin docs 351 make AWS_S3_BUCKET=docs.docker.com BUILD_ROOT=yes DISTRIBUTION_ID=C2K6......FL2F docs-release 352 ``` 353 354 The docs will appear on https://docs.docker.com/ (though there may be cached 355 versions, so its worth checking http://docs.docker.com.s3-website-us-east-1.amazonaws.com/). 356 For more information about documentation releases, see `docs/README.md`. 357 358 Note that the new docs will not appear live on the site until the cache (a complex, 359 distributed CDN system) is flushed. The `make docs-release` command will do this 360 _if_ the `DISTRIBUTION_ID` is set correctly - this will take at least 15 minutes to run 361 and you can check its progress with the CDN Cloudfront Chrome addin. 362 363 ### 15. Create a new pull request to merge your bump commit back into master 364 365 ```bash 366 git checkout master 367 git fetch 368 git reset --hard origin/master 369 git cherry-pick $VERSION 370 git push $GITHUBUSER merge_release_$VERSION 371 echo "https://github.com/$GITHUBUSER/docker/compare/docker:master...$GITHUBUSER:merge_release_$VERSION?expand=1" 372 ``` 373 374 Again, get two maintainers to validate, then merge, then push that pretty 375 blue button to delete your branch. 376 377 ### 16. Update the VERSION files 378 379 Now that version X.Y.Z is out, time to start working on the next! Update the 380 content of the `VERSION` file to be the next minor (incrementing Y) and add the 381 `-dev` suffix. For example, after 1.5.0 release, the `VERSION` file gets 382 updated to `1.6.0-dev` (as in "1.6.0 in the making"). 383 384 ### 17. Rejoice and Evangelize! 385 386 Congratulations! You're done. 387 388 Go forth and announce the glad tidings of the new release in `#docker`, 389 `#docker-dev`, on the [dev mailing list](https://groups.google.com/forum/#!forum/docker-dev), 390 the [announce mailing list](https://groups.google.com/forum/#!forum/docker-announce), 391 and on Twitter!