|
| 1 | +# Releasing a new Deis version |
| 2 | + |
| 3 | +This document describes how to release a new Deis version. It's targetted toward the Deis core |
| 4 | +maintainers. |
| 5 | + |
| 6 | +The below sections present a step by step guide to releasing a new Deis Workflow. Throughout all |
| 7 | +examples, we'll be assuming that the below two environment variables are present in wherever |
| 8 | +you're working. Make sure to set them (e.g. by `export`ing them) before you get started. |
| 9 | + |
| 10 | +- `$DEIS_RELEASE` - the full name of this version. For example, `v2.0.0-beta2` |
| 11 | +- `$DEIS_RELEASE_SHORT` - The short name of this version. For example, `beta2` |
| 12 | + |
| 13 | +# What's a release? |
| 14 | + |
| 15 | +A release consists of the following artifacts: |
| 16 | + |
| 17 | +1. Docker images with `$DEIS_RELEASE` tags for each Deis Workflow component: |
| 18 | + - [builder](https://github.com/deis/builder) |
| 19 | + - [controller](https://github.com/deis/controller) |
| 20 | + - [dockerbuilder](https://github.com/deis/dockerbuilder) |
| 21 | + - [fluentd](https://github.com/deis/fluentd) |
| 22 | + - [logger](https://github.com/deis/logger) |
| 23 | + - [minio](https://github.com/deis/minio) |
| 24 | + - [postgres](https://github.com/deis/postgres) |
| 25 | + - [registry](https://github.com/deis/registry) |
| 26 | + - [router](https://github.com/deis/router) |
| 27 | + - [slugbuilder](https://github.com/deis/slugbuilder) |
| 28 | + - [slugrunner](https://github.com/deis/slugrunner) |
| 29 | + - [workflow](https://github.com/deis/worflow) |
| 30 | + - [workflow-e2e](https://github.com/deis/workflow-e2e) |
| 31 | + - [workflow-manager](https://github.com/deis/workflow-manager) (v2.0.0-beta1-8-g9ba6db7) |
| 32 | +2. A new [Helm chart for Deis](https://github.com/deis/charts) that references all of the new |
| 33 | +images referenced above. For example, if `$DEIS_RELEASE` is `2.0.0-beta2`, the new chart would |
| 34 | +be in a new directory called `workflow-beta2`. |
| 35 | + |
| 36 | +# Step 1: Get the status of all components |
| 37 | + |
| 38 | +First, we'll need to get the statuses of all repositories that house the components we're |
| 39 | +interested in upgrading. We'll use |
| 40 | +[sgoings/deis-workflow-group](https://github.com/sgoings/deis-workflow-group) to do that in one |
| 41 | +place. That repository is a group of git submodules with all of the applicable repositories in it, |
| 42 | +so that we can manage everything from one place. |
| 43 | + |
| 44 | +Clone that repository to any location on your local machine, update all submodules and list |
| 45 | +the latest commit for each submodule: |
| 46 | + |
| 47 | +```console |
| 48 | +git clone https://github.com/sgoings/deis-workflow-group |
| 49 | +cd deis-workflow-group |
| 50 | +make git-update |
| 51 | +git submodule status |
| 52 | +``` |
| 53 | + |
| 54 | +Keep the list of commit SHAs handy - you'll need it for later. |
| 55 | + |
| 56 | +# Step 2: Create a new Helm chart |
| 57 | + |
| 58 | +Next, we'll create a new [Helm](https://github.com/helm/helm) chart so that we can "stage" a |
| 59 | +version of our release for testing. The process is fairly simple: |
| 60 | + |
| 61 | +1. Create a new branch: `git checkout -b release-$DEIS_RELEASE` |
| 62 | +2. Copy an existing chart: `cp -r workflow-beta2 workflow-$DEIS_RELEASE_SHORT` |
| 63 | +3. Modify the `workflow-$DEIS_RELEASE_SHORT/tpl/generate_params.toml` file to ensure that all |
| 64 | +`dockerTag` values look like `git-$COMPONENT_SHA_SHORT`, where `$COMPONENT_SHA_SHORT` is the first |
| 65 | +7 characters of the applicable SHA that you got in the previous step. |
| 66 | +4. Commit your changes: `git commit -a -m "chore(workflow-$DEIS_RELEASE_SHORT): releasing workflow-$DEIS_RELEASE_SHORT"` |
| 67 | +5. Push your changes to your fork: `git push -u $YOUR_FORK_REMOTE release-$DEIS_RELEASE`. Note that |
| 68 | +`$YOUR_FORK_REMOTE` is the git URI to the remote of your `deis/charts` fork. Mine is `git@github.com:arschles/deis-charts.git`, for example. |
| 69 | +6. Do steps 2-5 with the `workflow-beta2-e2e` directory |
| 70 | +7. Open a pull request from your branch to merge into `master` on https://github.com/deis/charts |
| 71 | + |
| 72 | +# Step 3: Manual Testing |
| 73 | + |
| 74 | +After the chart is created with the immutable Docker image tags that represent the final images |
| 75 | +(i.e. the ones that will be re-tagged to the immutable release tag, such as `2.0.0-beta2`), it |
| 76 | +should be manually tested by as many people as possible. Special attention should be paid to the |
| 77 | +user experience, both from an operator and developer perspective. |
| 78 | + |
| 79 | +Our goal is to test with as many object storage and Kubernetes installation configurations as |
| 80 | +possible, to ensure there are no gaps in configuration or functionality. See below for a testing |
| 81 | +matrix. |
| 82 | + |
| 83 | +Object Storage / Kubernetes Install | Kube-Solo | Google Container Engine | AWS | Micro-Kube | Vagrant | |
| 84 | +----------------------------------- | --------- | ----------------------- | --- | ---------- | ------- | |
| 85 | +Default (Minio) | |
| 86 | +Google Cloud Storage | |
| 87 | +Amazon S3 | |
| 88 | + |
| 89 | +# Step 4: Tag and push Docker images |
| 90 | + |
| 91 | +After everyone has tested and determined that there are no showstopping problems for this release, |
| 92 | +it's time to tag each individual Docker image with `$DEIS_RELEASE`. |
| 93 | + |
| 94 | +To do so, simply go back to the directory where you checked out the `deis-workflow-group` repo |
| 95 | +and run the following two commands to tag and push updated docker images: |
| 96 | + |
| 97 | +```console |
| 98 | +TAG=$DEIS_RELEASE make docker-tag |
| 99 | +make docker-push |
| 100 | +``` |
| 101 | + |
| 102 | +# Step 5: Update Helm chart |
| 103 | + |
| 104 | +Now that new Docker images are on public Docker repositories, it's time to update the Helm chart |
| 105 | +to reference the official images. To do so, simply modify all `dockerTag` entries in the |
| 106 | +`generate_params.toml` files in the `workflow-$DEIS_RELEASE_SHORT` and |
| 107 | +`workflow-$DEIS_RELEASE_SHORT-e2e` to be `$DEIS_RELEASE` (instead of the ones based on git tags). |
| 108 | + |
| 109 | +When you're done, commit and push your changes. You should get your pull request reviewed and |
| 110 | +merged before continuing. |
| 111 | + |
| 112 | +# Step 6: Update Changelogs |
| 113 | + |
| 114 | +At this point, part of the first part and all of the second part of the release is complete. |
| 115 | +That is, the Helm chart for the new Deis version is done, and new Docker versions for all |
| 116 | +components are done. |
| 117 | + |
| 118 | +The remaining work is simply generating changelogs and tagging each component's GitHub repository. |
| 119 | + |
| 120 | +First, create a branch for the new changelog: |
| 121 | + |
| 122 | +```console |
| 123 | +git checkout -b release-$DEIS_RELEASE_SHORT |
| 124 | +``` |
| 125 | + |
| 126 | +To generate changelogs, run the below command in each repository. Ensure that `$PREVIOUS_TAG` is |
| 127 | +the previous tag that was generated in the repository. |
| 128 | + |
| 129 | +```console |
| 130 | +_scripts/generate_changelog.sh $PREVIOUS_TAG |
| 131 | +``` |
| 132 | + |
| 133 | +This command will output the new changelog entry to STDOUT. Copy it and prepend it to the |
| 134 | +existing `CHANGELOG.md` file, and make sure to change `HEAD` in the header of the entry |
| 135 | +to `$DEIS_RELEASE`. |
| 136 | + |
| 137 | +Finally, commit, push and submit a Pull Request for your changes: |
| 138 | + |
| 139 | +```console |
| 140 | +git commit CHANGELOG.md -m "doc(CHANGELOG.md): add entry for $DEIS_RELEASE_SHORT" |
| 141 | +git push -u $YOUR_FORK_REMOTE $DEIS_RELEASE_SHORT |
| 142 | +``` |
| 143 | + |
| 144 | +Before you continue, ensure pull requests in all applicable repositories are reviewed, and merge |
| 145 | +them. |
| 146 | + |
| 147 | +# Step 7: Tag and push git repos |
| 148 | + |
| 149 | +The final step of the release process is to tag each git repository, and push the tag to each |
| 150 | +GitHub project. To do so, simply run the below command in the `deis-workflow-group` repository: |
| 151 | + |
| 152 | +```console |
| 153 | +TAG=$DEIS_RELEASE TAG_MESSAGE="releasing workflow $DEIS_RELEASE" make git-tag |
| 154 | +make git-tag-push |
| 155 | +``` |
| 156 | + |
| 157 | +You are now done with the release |
0 commit comments