# Release Process The kops project is released on an as-needed basis. The process is as follows: 1. An issue is proposing a new release with a changelog since the last release 1. All [OWNERS](https://github.com/kubernetes/kops/blob/master/OWNERS) must LGTM this release 1. An OWNER runs `git tag -s $VERSION` and inserts the changelog and pushes the tag with `git push $VERSION` 1. The release issue is closed 1. An announcement email is sent to `kubernetes-dev@googlegroups.com` with the subject `[ANNOUNCE] kops $VERSION is released` ## Branches We maintain a `release-1.16` branch for kops 1.16.X, `release-1.17` for kops 1.17.X etc. `master` is where development happens. We create new branches from master as a new kops version is released, or in preparation for a new release. As we are preparing for a new kubernetes release, we will try to advance the master branch to focus on the new functionality, and start cherry-picking back more selectively to the release branches only as needed. Generally we don't encourage users to run older kops versions, or older branches, because newer versions of kops should remain compatible with older versions of Kubernetes. Releases should be done from the `release-1.X` branch. The tags should be made on the release branches. We do currently maintain a `release` branch which should point to the same tag as the current `release-1.X` tag. ## Update versions See [1.5.0-alpha4 commit](https://github.com/kubernetes/kops/commit/a60d7982e04c273139674edebcb03c9608ba26a0) for example * Use the hack/set-version script to update versions: `hack/set-version 1.20.0 1.20.1` The syntax is `hack/set-version ` `new-release-version` is the version you are releasing. `new-ci-version` is the version you are releasing "plus one"; this is used to avoid CI jobs being out of semver order. Examples: | new-release-version | new-ci-version | ---------------------| --------------- | 1.20.1 | 1.20.2 | 1.21.0-alpha.1 | 1.21.0-alpha.2 | 1.21.0-beta.1 | 1.21.0-beta.2 * Update the golden tests: `hack/update-expected.sh` * Commit the changes (without pushing yet): `git commit -m "Release 1.X.Y"` ## Check builds OK ``` rm -rf .build/ .bazelbuild/ make ci ``` ## Push new kops-controller / dns-controller images ``` # For versions prior to 1.18: make dns-controller-push DOCKER_REGISTRY=kope make dns-controller-push DOCKER_IMAGE_PREFIX=kope/ DOCKER_REGISTRY=index.docker.io make kops-controller-push DOCKER_IMAGE_PREFIX=kope/ DOCKER_REGISTRY=index.docker.io ``` ## Upload new version ``` # export AWS_PROFILE=??? # If needed make upload UPLOAD_DEST=s3://kubeupv2 ``` ## Tag new version Make sure you are on the release branch `git checkout release-1.X` ``` make release-tag git push git@github.com:kubernetes/kops git push --tags git@github.com:kubernetes/kops # Sync the origin alias back up git fetch origin ``` ## Update release branch For the time being, we are also maintaining a release branch. We push released versions to that. `git push git@github.com:kubernetes/kops release-1.17:release` ## Pull request to master branch (for release commit) ## Upload to github Use [shipbot](https://github.com/kopeio/shipbot) to upload the release: ``` make release-github ``` ## Compile release notes e.g. ``` FROM=1.14.0 TO=1.14.1 DOC=1.14 git log ${FROM}..${TO} --oneline | grep Merge.pull | cut -f 5 -d ' ' | tac > /tmp/prs echo -e "\n## ${FROM} to ${TO}\n" >> docs/releases/${DOC}-NOTES.md relnotes -config .shipbot.yaml < /tmp/prs >> docs/releases/${DOC}-NOTES.md ``` ## On github * Download release * Validate it * Add notes * Publish it ## Update the alpha channel and/or stable channel Once we are satisfied the release is sound: * Bump the kops recommended version in the alpha channel Once we are satisfied the release is stable: * Bump the kops recommended version in the stable channel ## Update conformance results with CNCF Use the following instructions: https://github.com/cncf/k8s-conformance/blob/master/instructions.md