# Release

## Preparing release version

1. Update the `version` defined in the code to the new version number.
   As of the time of writing, the version is defined in `pkg/buildinfo/version.go`.

## Kubernetes release
Is this release for a Kubernetes release?  If so, apply the following steps:

### Conformance images
Ensure the upstream conformance script is working appropriately:
  * Build the kind images for this new version.
    1. Checkout K8s locally at the tag in question
    1. Run `make check_kind_env` to ensure the repo/tag are correct
    1. Run `make kind_images`
    1. Run `make push_kind_images`
  * Update the `kind-config.yaml` file with the new image version [here](https://github.com/vmware-tanzu/sonobuoy/blob/main/kind-config.yaml).

### Setup e2e image registry for new version
Add the new list of E2E test images for the targed version.

Within `pkg/image/`, copy the latest `v1.x.go` file to a file which corresponds to the new Kubernetes release number.

For example, if the new Sonobuoy release corresponds to Kubernetes `v1.20`, copy the `v1.19.go` file to `v1.20.go`.

```
cd pkg/image
cp v1.{19,20}.go
```
         
This file will contain a function to return the list of test images via a `map[int]Config` value.
1. Update the name of the function accordingly. For example, if the file is for the v1.20 release, 
         ensure the function name is `v1_20`.
1. Copy all `map` entries stored in variable `configs` from upstream Kubernetes file [`kubernetes/test/utils/image/mafnifest`](https://github.com/kubernetes/kubernetes/blob/e19964183377d0ec2052d1f1fa930c4d7575bd50/test/utils/image/manifest.go#L202-L252). Remove the previous map entries and replace them wi the The copied entries.
2. Update the `GetImageConfigs` function within `pkg/image/manifest.go` and add a new `case` statement to the minor version check which will be the minor version of the new Kubernetes release.  In this new case, call the newly created function (e.g. `r.v1_20()`).
3. Add the new default image registry configuration by updating the function `GetDefaultImageRegistries` within `pkg/image/manifest.go` to return the default image registries for the new version.
    * Add a new case to the minor version check which will correspond the minor version of the new Kubernetes release.
    * Follow previous case statements (i.e. `case 19:`), return a new `RegistryList` object which includes only the registry keys used within the registry config for that version.
    Some registries are not applicable to include in this object as they are there to test specific image pull behavior such as pulling from a private or non-existent registry. This object should only include registries that can be successfully pulled from. The other registries are not used within the end-to-end tests.

## Updating the versioned docs
Explicit doc changes (if any) should be made to the appropriate files in directory `site/docs/master`.

Next, generate a set of versioned docs for v0.x.y. For instance, the new docs be generated by running the command:

```
./scripts/update_docs.sh v0.20.0
```

This will copy the current `master` docs into the version given and update
a few of the links in the README to be correct. It will also update
the website config to add the new version and consider it the newest
version of the docs.

## Create PR
1. Commit previous changes and open a new PR
2. Ensure your commits signed
3. Follow PR build progress in circleci.com
4. Once all checks passes, merge accordingly

## Tag release
This step will tag the code and triggers a release.

1. From your local branch, create an annotated `tag` for the commit that was merged:

    ```
    git tag -a v0.x.y -m "Release v0.x.y"
    ```

    > NOTE: Tag the new tip of `master`, not the branch you just merged.

1. Push the `tag` to the [`github.com/vmware-tanzu/sonobuoy`](https://github.com/vmware-tanzu/sonobuoy/) repository.
2. To ensure that the tag is pushed to the correct repository, check which remote corresponds to that repository using the following command:

     ```
     git remote -v
     ```
     The output of this command should include at least two configured remotes, typically `origin`, which refers to your personal fork, and `upstream` which refers to the upstream Sonobuoy repository.
     For example:

     ```
     origin	git@github.com:<username>/sonobuoy.git (fetch)
     origin	git@github.com:<username>/sonobuoy.git (push)
     upstream	https://github.com/vmware-tanzu/sonobuoy (fetch)
     upstream	https://github.com/vmware-tanzu/sonobuoy (push)
     ```
     For the following steps, use the remote configured for the `vmware-tanzu/sonobuoy` repository.
     The following instructions will use `upstream`.
1. Push the tag with the following command.
     > NOTE: This will push all tags.

     ```
     git push upstream --tags
     ```
     To push just one tag, use the following command format (replacing `v0.x.y` with the tag created in the previous step):

     ```
     git push upstream refs/tags/v0.x.y
     ```
     If there is a problem and you need to remove the tag, run the following commands:

     ```
     git tag -d v0.x.y
     git push upstream :refs/tags/v0.x.y
     ```
     > NOTE: The `:` preceding the tag ref is necessary to delete the tag from the remote repository.
     > Git refspecs have the format `<+><src>:<dst>`.
     > By pushing an empty `src` to the remote `dst`, it makes the destination ref empty, effectively deleting it.
     > For more details, see the [`git push` documentation](https://git-scm.com/docs/git-push) or [this concise explanation on Stack Overflow](https://stackoverflow.com/a/7303710).


## Release Validation
1. Open a browser tab and go to: https://circleci.com/gh/vmware-tanzu/sonobuoy and verify go releaser for tag v0.x.y completes successfully.
1. Upon successful completion of build job above, check the [releases tab of Sonobuoy](https://github.com/vmware-tanzu/sonobuoy/releases) and verify the artifacts and changelog were published correctly.
1. Run the following command to make sure the image was pushed correctly to [Docker Hub][dockerhub]:

   ```
   docker run -it sonobuoy/sonobuoy:v0.x.y /sonobuoy version
   ```
   The `Sonobuoy Version` in the output should match the release tag above.
1. Go to the [GitHub release page](https://github.com/vmware-tanzu/sonobuoy/releases) and download the release binaries and make sure the version matches the expected values.
2. Run a [Kind](https://github.com/kubernetes-sigs/kind) cluster locally and ensure that you can run `sonobuoy run --mode quick`.
   If this release corresponds to a new Kubernetes release as well, ensure:

    * you're using the correct Kubernetes context by checking the output from:

      ```
      kubectl config current-context
      ```

      and verifying that it is set to the context for the Kind cluster just created (`kind-kind` or `kind-<custom_cluster_name>`)
    * you're testing with the new Kind images by checking the output from:

      ```
      kubectl version --short
      ```

      and verifying that the server version matches the intended Kubernetes version.
    * you can run `sonobuoy images` and get a list of test images as expected
2. Update the release notes if desired on GitHub by editing the newly created release.

### Notes
1. Before releasing, ensure all parties are available to resolve any issues that come up. If not, just bump the release.

[gendocs]: #generating-a-new-set-of-versioned-docs
[dockerhub]: https://cloud.docker.com/u/sonobuoy/repository/docker/sonobuoy/sonobuoy/tags

2. If you are building a Windows release you must currently build/push the Windows image outside of CI and push the manifest to also include it. To do this you must:

 - Have built the Windows binaries (can be done on a Linux box and should be the default now)
 - Have a Windows machine available for the build. The steps below will assume a `docker context` which is a Windows machine.
 - (Recommended) Build the sample Windows plugin (in our examples directory) to test the image
 - (Recommended) Have a cluster with Windows available for testing

```
docker context use default
make build/windows/amd64/sonobuoy.exe
docker context use 2019-box
make windows_containers
PUSH_WINDOWS=true make push

```