github.com/koderover/helm@v2.17.0+incompatible/docs/release_checklist.md (about)

     1  # Release Checklist
     2  
     3  **IMPORTANT**: If your experience deviates from this document, please document the changes to keep it up-to-date.
     4  
     5  ## Release Meetings
     6  
     7  As part of the release process, two of the weekly developer calls will be co-opted as "release meetings."
     8  
     9  ### Start of the Release Cycle
    10  
    11  The first developer call after a release will be used as the release meeting to start the next release cycle.
    12  During this meeting, the following items must be identified:
    13  
    14  - Release date
    15  - Goals/Objectives for this release
    16  - The release manager (basically whoever is going to cut the release)
    17  - Any other important details for the community
    18  
    19  All of this information should be added to the GitHub milestone for the given release. This should give the
    20  community and maintainers a clear set of guidelines to follow when choosing whether or not to add issues and PRs to a
    21  given release.
    22  
    23  ### End (almost) of the Release Cycle
    24  
    25  The developer call closest to two weeks before the scheduled release date will be used to review any remaining PRs that
    26  should be pulled into the release. This is the place to debate whether or not we should wait before cutting a release
    27  and any other concerns. At the end of this meeting, if the release date has not been pushed out, the first RC should be
    28  cut. Subsequent developer calls in between this meeting and the release date should have some time set aside to see if
    29  any bugs were found. Once the release date is reached, the final release can be cut.
    30  
    31  ## A Maintainer's Guide to Releasing Helm
    32  
    33  So you're in charge of a new release for Helm? Cool. Here's what to do...
    34  
    35  ![TODO: Nothing](images/nothing.png)
    36  
    37  Just kidding! :trollface:
    38  
    39  All releases 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
    40  patch release number. This project strictly follows [semantic versioning](http://semver.org/) so following this step is
    41  critical.
    42  
    43  It is important to note that this document assumes that the git remote in your repository that corresponds to
    44  "https://github.com/helm/helm" is named "upstream". If yours is not (for example, if you've chosen to name it "origin"
    45  or something similar instead), be sure to adjust the listed snippets for your local environment accordingly. If you are
    46  not sure what your upstream remote is named, use a command like `git remote -v` to find out.
    47  
    48  If you don't have an upstream remote, you can add one easily using something like:
    49  
    50  ```shell
    51  git remote add upstream git@github.com:helm/helm.git
    52  ```
    53  
    54  In this doc, we are going to reference a few environment variables as well, which you may want to set for convenience.
    55  
    56  For major/minor releases, use the following:
    57  
    58  ```shell
    59  export RELEASE_NAME=vX.Y.0
    60  export RELEASE_BRANCH_NAME="release-X.Y"
    61  export RELEASE_CANDIDATE_NAME="$RELEASE_NAME-rc.1"
    62  ```
    63  
    64  If you are creating a patch release, you may want to use the following instead:
    65  
    66  ```shell
    67  export PREVIOUS_PATCH_RELEASE=vX.Y.Z
    68  export RELEASE_NAME=vX.Y.Z+1
    69  export RELEASE_BRANCH_NAME="release-X.Y"
    70  export RELEASE_CANDIDATE_NAME="$RELEASE_NAME-rc.1"
    71  ```
    72  
    73  We are also going to be adding security and verification of the release process by
    74  hashing the binaries and providing signature files. We perform this using
    75  [GitHub and GPG](https://help.github.com/en/articles/about-commit-signature-verification).
    76  If you do not have GPG already setup you can follow these steps:
    77  1. [Install GPG](https://gnupg.org/index.html)
    78  2. [Generate GPG key](https://help.github.com/en/articles/generating-a-new-gpg-key)
    79  3. [Add key to GitHub account](https://help.github.com/en/articles/adding-a-new-gpg-key-to-your-github-account)
    80  4. [Set signing key in Git](https://help.github.com/en/articles/telling-git-about-your-signing-key)
    81  
    82  Once you have a signing key you need to add it to the KEYS file at the root of
    83  the repository. The instructions for adding it to the KEYS file are in the file.
    84  If you have not done so already, you need to add your public key to the keyserver
    85  network. If you use GnuPG you can follow the [instructions provided by Debian](https://debian-administration.org/article/451/Submitting_your_GPG_key_to_a_keyserver).
    86  
    87  ## 1. Create the Release Branch
    88  
    89  ### Major/Minor Releases
    90  
    91  Major releases are for new feature additions and behavioral changes *that break backwards compatibility*. Minor releases
    92  are for new feature additions that do not break backwards compatibility. To create a major or minor release, start by
    93  creating a `release-vX.Y.0` branch from master.
    94  
    95  ```shell
    96  git fetch upstream
    97  git checkout upstream/master
    98  git checkout -b $RELEASE_BRANCH_NAME
    99  ```
   100  
   101  This new branch is going to be the base for the release, which we are going to iterate upon later.
   102  
   103  ### Patch releases
   104  
   105  Patch releases are a few critical cherry-picked fixes to existing releases. Start by creating a `release-vX.Y.Z` branch
   106  
   107  ```shell
   108  git fetch upstream
   109  git checkout -b $RELEASE_BRANCH_NAME upstream/$RELEASE_BRANCH_NAME
   110  ```
   111  
   112  From here, we can cherry-pick the commits we want to bring into the patch release:
   113  
   114  ```shell
   115  # get the commits ids we want to cherry-pick
   116  git log --oneline
   117  # cherry-pick the commits starting from the oldest one, without including merge commits
   118  git cherry-pick -x <commit-id>
   119  ```
   120  
   121  Finally, we create the tag for the patch on the branch and push upstream:
   122  
   123  ```shell
   124  git tag --sign --annotate "$RELEASE_NAME" --message "Helm release $RELEASE_NAME"
   125  git push upstream "$RELEASE_NAME"
   126  ```
   127  
   128  This new tag is going to be the base for the patch release.
   129  
   130  Make sure to check [helm on CircleCI](https://circleci.com/gh/helm/helm) and make sure the release passed CI before
   131  proceeding.
   132  
   133  ## 2. Major/Minor releases: Change the Version Number in Git
   134  
   135  When doing a minor release, make sure to update pkg/version/version.go with the new release version.
   136  
   137  ```shell
   138  $ git diff pkg/version/version.go
   139  diff --git a/pkg/version/version.go b/pkg/version/version.go
   140  index 2109a0a..6f5a1a4 100644
   141  --- a/pkg/version/version.go
   142  +++ b/pkg/version/version.go
   143  @@ -26,7 +26,7 @@ var (
   144          // Increment major number for new feature additions and behavioral changes.
   145          // Increment minor number for bug fixes and performance enhancements.
   146          // Increment patch number for critical fixes to existing releases.
   147  -       Version = "v2.6"
   148  +       Version = "v2.7"
   149  
   150          // BuildMetadata is extra build time data
   151          BuildMetadata = "unreleased"
   152  ```
   153  
   154  ```shell
   155  git add .
   156  git commit -m "bump version to $RELEASE_CANDIDATE_NAME"
   157  ```
   158  
   159  This will update it for the $RELEASE_BRANCH_NAME only. You will also need to pull
   160  this change into the master branch for when the next release is being created.
   161  
   162  ```shell
   163  # get the last commit id i.e. commit to bump the version
   164  git log --format="%H" -n 1
   165  
   166  # create new branch off master
   167  git checkout master
   168  git checkout -b bump-version-<release_version>
   169  
   170  # cherry pick the commit using id from first command
   171  git cherry-pick -x <commit-id>
   172  
   173  # commit the change
   174  git push origin bump-version-<release-version>
   175  ```
   176  
   177  ## 3. Major/Minor releases: Commit and Push the Release Branch
   178  
   179  In order for others to start testing, we can now push the release branch upstream and start the test process.
   180  
   181  ```shell
   182  git push upstream $RELEASE_BRANCH_NAME
   183  ```
   184  
   185  Make sure to check [helm on CircleCI](https://circleci.com/gh/helm/helm) and make sure the release passed CI before
   186  proceeding.
   187  
   188  If anyone is available, let others peer-review the branch before continuing to ensure that all the proper changes have
   189  been made and all of the commits for the release are there.
   190  
   191  ## 4. Major/Minor release: Create a Release Candidate
   192  
   193  Now that the release branch is out and ready, it is time to start creating and iterating on release candidates.
   194  
   195  ```shell
   196  git tag --sign --annotate "${RELEASE_CANDIDATE_NAME}" --message "Helm release ${RELEASE_CANDIDATE_NAME}"
   197  git push upstream $RELEASE_CANDIDATE_NAME
   198  ```
   199  
   200  CircleCI will automatically create a tagged release image and client binary to test with.
   201  
   202  For testers, the process to start testing after CircleCI finishes building the
   203  artifacts involves the following steps to grab the client:
   204  
   205  linux/amd64, using /bin/bash:
   206  
   207  ```shell
   208  wget https://get.helm.sh/helm-$RELEASE_CANDIDATE_NAME-linux-amd64.tar.gz
   209  ```
   210  
   211  darwin/amd64, using Terminal.app:
   212  
   213  ```shell
   214  wget https://get.helm.sh/helm-$RELEASE_CANDIDATE_NAME-darwin-amd64.tar.gz
   215  ```
   216  
   217  windows/amd64, using PowerShell:
   218  
   219  ```shell
   220  PS C:\> Invoke-WebRequest -Uri "https://get.helm.sh/helm-$RELEASE_CANDIDATE_NAME-windows-amd64.zip" -OutFile "helm-$ReleaseCandidateName-windows-amd64.zip"
   221  ```
   222  
   223  Then, unpack and move the binary to somewhere on your $PATH, or move it somewhere and add it to your $PATH
   224  (e.g. /usr/local/bin/helm for linux/macOS, C:\Program Files\helm\helm.exe for Windows).
   225  
   226  ## 5. Major/Minor release: Iterate on Successive Release Candidates
   227  
   228  Spend several days explicitly investing time and resources to try and break helm in every possible way, documenting any
   229  findings pertinent to the release. This time should be spent testing and finding ways in which the release might have
   230  caused various features or upgrade environments to have issues, not coding. During this time, the release is in code
   231  freeze, and any additional code changes will be pushed out to the next release.
   232  
   233  During this phase, the $RELEASE_BRANCH_NAME branch will keep evolving as you will produce new release candidates. The
   234  frequency of new candidates is up to the release manager: use your best judgement taking into account the severity of
   235  reported issues, testers' availability, and the release deadline date. Generally speaking, it is better to let a release
   236  roll over the deadline than to ship a broken release.
   237  
   238  Each time you'll want to produce a new release candidate, you will start by adding commits to the branch by
   239  cherry-picking from master:
   240  
   241  ```shell
   242  git cherry-pick -x <commit_id>
   243  ```
   244  
   245  You will also want to update the release version number and the CHANGELOG as we did in steps 2 and 3 as separate commits.
   246  
   247  After that, tag it and notify users of the new release candidate:
   248  
   249  ```shell
   250  export RELEASE_CANDIDATE_NAME="$RELEASE_NAME-rc.2"
   251  git tag --sign --annotate "${RELEASE_CANDIDATE_NAME}" --message "Helm release ${RELEASE_CANDIDATE_NAME}"
   252  git push upstream $RELEASE_CANDIDATE_NAME
   253  ```
   254  
   255  From here on just repeat this process, continuously testing until you're happy with the release candidate.
   256  
   257  ## 6. Major/Minor release: Finalize the Release
   258  
   259  When you're finally happy with the quality of a release candidate, you can move on and create the real thing.
   260  Double-check one last time to make sure everything is in order, then finally push the release tag.
   261  
   262  ```shell
   263  git checkout $RELEASE_BRANCH_NAME
   264  git tag --sign --annotate "${RELEASE_NAME}" --message "Helm release ${RELEASE_NAME}"
   265  git push upstream $RELEASE_NAME
   266  ```
   267  
   268  Verify that the release succeeded in CI. If not, you will need to fix the 
   269  release and push the release again.
   270  
   271  ## 7. PGP Sign the downloads
   272  
   273  While hashes provide a signature that the content of the downloads is what it was generated, signed packages provide
   274  traceability of where the package came from.
   275  
   276  To do this, run the following `make` commands:
   277  
   278  ```shell
   279  export VERSION="$RELEASE_NAME"
   280  make clean
   281  make fetch-dist
   282  make sign
   283  ```
   284  
   285  This will generate ascii armored signature files for each of the files pushed by CI.
   286  
   287  All of the signature files (`*.asc`) need to be uploaded to the release on GitHub.
   288  
   289  ## 8. Write the Release Notes
   290  
   291  We will auto-generate a changelog based on the commits that occurred during a release cycle, but it is usually more
   292  beneficial to the end-user if the release notes are hand-written by a human being/marketing team/dog.
   293  
   294  If you're releasing a major/minor release, listing notable user-facing features is usually sufficient. For patch
   295  releases, do the same, but make note of the symptoms and who is affected.
   296  
   297  An example release note for a minor release would look like this:
   298  
   299  ```markdown
   300  ## vX.Y.Z
   301  
   302  Helm vX.Y.Z is a feature release. This release, we focused on <insert focal point>. Users are encouraged to upgrade for the best experience.
   303  
   304  The community keeps growing, and we'd love to see you there!
   305  
   306  - Join the discussion in [Kubernetes Slack](https://kubernetes.slack.com):
   307    - `#helm-users` for questions and just to hang out
   308    - `#helm-dev` for discussing PRs, code, and bugs
   309  - Hang out at the Public Developer Call: Thursday, 9:30 Pacific via [Zoom](https://zoom.us/j/696660622)
   310  - Test, debug, and contribute charts: [GitHub/helm/charts](https://github.com/helm/charts)
   311  
   312  ## Installation and Upgrading
   313  
   314  Download Helm X.Y. The common platform binaries are here:
   315  
   316  - [MacOS amd64](https://get.helm.sh/helm-vX.Y.Z-darwin-amd64.tar.gz) ([checksum](https://get.helm.sh/helm-vX.Y.Z-darwin-amd64.tar.gz.sha256) / CHECKSUM_VAL)
   317  - [Linux amd64](https://get.helm.sh/helm-vX.Y.Z-linux-amd64.tar.gz) ([checksum](https://get.helm.sh/helm-vX.Y.Z-linux-amd64.tar.gz.sha256) / CHECKSUM_VAL)
   318  - [Linux arm](https://get.helm.sh/helm-vX.Y.Z-linux-arm.tar.gz) ([checksum](https://get.helm.sh/helm-vX.Y.Z-linux-arm.tar.gz.sha256) / CHECKSUM_VAL)
   319  - [Linux arm64](https://get.helm.sh/helm-vX.Y.Z-linux-arm64.tar.gz) ([checksum](https://get.helm.sh/helm-vX.Y.Z-linux-arm64.tar.gz.sha256) / CHECKSUM_VAL)
   320  - [Linux i386](https://get.helm.sh/helm-vX.Y.Z-linux-386.tar.gz) ([checksum](https://get.helm.sh/helm-vX.Y.Z-linux-386.tar.gz.sha256) / CHECKSUM_VAL)
   321  - [Linux ppc64le](https://get.helm.sh/helm-vX.Y.Z-linux-ppc64le.tar.gz) ([checksum](https://get.helm.sh/helm-vX.Y.Z-linux-ppc64le.tar.gz.sha256) / CHECKSUM_VAL)
   322  - [Linux s390x](https://get.helm.sh/helm-vX.Y.Z-linux-s390x.tar.gz) ([checksum](https://get.helm.sh/helm-vX.Y.Z-linux-s390x.tar.gz.sha256) / CHECKSUM_VAL)
   323  - [Windows amd64](https://get.helm.sh/helm-vX.Y.Z-windows-amd64.zip) ([checksum](https://get.helm.sh/helm-vX.Y.Z-windows-amd64.zip.sha256) / CHECKSUM_VAL)
   324  
   325  Once you have the client installed, upgrade Tiller with `helm init --upgrade`.
   326  
   327  The [Quickstart Guide](https://docs.helm.sh/using_helm/#quickstart-guide) will get you going from there. For **upgrade instructions** or detailed installation notes, check the [install guide](https://docs.helm.sh/using_helm/#installing-helm). You can also use a [script to install](https://raw.githubusercontent.com/helm/helm/master/scripts/get) on any system with `bash`.
   328  
   329  ## What's Next
   330  
   331  - vX.Y.Z+1 will contain only bug fixes.
   332  - vX.Y+1.Z is the next feature release. This release will focus on ...
   333  
   334  ## Changelog
   335  
   336  - chore(*): bump version to v2.7.0 08c1144f5eb3e3b636d9775617287cc26e53dba4 (Adam Reese)
   337  - fix circle not building tags f4f932fabd197f7e6d608c8672b33a483b4b76fa (Matthew Fisher)
   338  ```
   339  
   340  The changelog at the bottom of the release notes can be generated with this command:
   341  
   342  ```shell
   343  PREVIOUS_RELEASE=vX.Y.Z
   344  git log --no-merges --pretty=format:'- %s %H (%aN)' $PREVIOUS_RELEASE..$RELEASE_NAME
   345  ```
   346  
   347  Once finished, go into GitHub and edit the release notes for the tagged release with the notes written here. Remember to
   348  attach the ascii armored signatures generated in the previous step to the release notes.
   349  
   350  It is now worth getting other people to take a look at the release notes before the release is published. Send
   351  a request out to [#helm-dev](https://kubernetes.slack.com/messages/C51E88VDG) for review. It is always 
   352  beneficial as it can be easy to miss something.
   353  
   354  When you are ready to go, hit `publish`.
   355  
   356  ## 9. Evangelize
   357  
   358  Congratulations! You're done. Go grab yourself a $DRINK_OF_CHOICE. You've earned it.
   359  
   360  After enjoying a nice $DRINK_OF_CHOICE, go forth and announce the glad tidings of the new release in Slack and on Twitter.
   361  
   362  Optionally, write a blog post about the new release and showcase some of the new features on there!