5489de6 Merge pull request #174 from mauriciopoppe/bump-kind-version 0c675d4 Bump kind version to v0.11.1 ef69a88 Merge pull request #173 from nick5616/add-ws2022 44c710c added WS2022 to build platforms 0883be4 Merge pull request #171 from pohly/example-commands 02cda51 build.make: support binaries outside of cmd, with optional go.mod 65922ea Merge pull request #170 from pohly/canary-snapshot-controller c0bdfb3 prow.sh: deploy canary snapshot-controller in canary jobs 0438f15 Merge pull request #167 from c0va23/feature/release-armv7-image 4786f4d Merge pull request #168 from msau42/update-release-prereq 6a2dc64 Remove requirement to be top-level approver. Only maintainers membership is required to do a release 30a4f7b Release armv7 image ac8108f Merge pull request #165 from consideRatio/pr/update-github-links-ref-to-master-to-HEAD 999b483 docs: make github links reference HEAD instead of main fd67069 docs: make github links reference HEAD instead of master c0a4fb1 Merge pull request #164 from anubha-v-ardhan/patch-1 9c6a6c0 Master to main cleanup 682c686 Merge pull request #162 from pohly/pod-name-via-shell-command 36a29f5 Merge pull request #163 from pohly/remove-bazel 68e43ca prow.sh: remove Bazel build support c5f59c5 prow.sh: allow shell commands in CSI_PROW_SANITY_POD 71c810a Merge pull request #161 from pohly/mock-test-fixes 9e438f8 prow.sh: fix mock testing d7146c7 Merge pull request #160 from pohly/kind-update 4b6aa60 prow.sh: update to KinD v0.11.0 7cdc76f Merge pull request #159 from pohly/fix-deployment-selection ef8bd33 prow.sh: more flexible CSI_PROW_DEPLOYMENT, part II 204bc89 Merge pull request #158 from pohly/fix-deployment-selection 61538bb prow.sh: more flexible CSI_PROW_DEPLOYMENT 2b0e6db Merge pull request #157 from humblec/csi-release a2fcd6d Adding myself to csi reviewers group f325590 Merge pull request #149 from pohly/cluster-logs 4b03b30 Merge pull request #155 from pohly/owners a6453c8 owners: introduce aliases ad83def Merge pull request #153 from pohly/fix-image-builds 5561780 build.make: fix image publishng 29bd39b Merge pull request #152 from pohly/bump-csi-test bc42793 prow.sh: use csi-test v4.2.0 b546baa Merge pull request #150 from mauriciopoppe/windows-multiarch-args bfbb6f3 add parameter base_image and addon_image to BUILD_PARAMETERS 2d61d3b Merge pull request #151 from humblec/cm 48e71f0 Replace `which` command ( non standard) with `command -v` builtin feb20e2 prow.sh: collect cluster logs 7b96bea Merge pull request #148 from dobsonj/add-checkpathcmd-to-prow 2d2e03b prow.sh: enable -csi.checkpathcmd option in csi-sanity 09d4151 Merge pull request #147 from pohly/mock-testing 74cfbc9 prow.sh: support mock tests 4a3f110 prow.sh: remove obsolete test suppression 6616a6b Merge pull request #146 from pohly/kubernetes-1.21 510fb0f prow.sh: support Kubernetes 1.21 c63c61b prow.sh: add CSI_PROW_DEPLOYMENT_SUFFIX 51ac11c Merge pull request #144 from pohly/pull-jobs dd54c92 pull-test.sh: test importing csi-release-tools into other repo 7d2643a Merge pull request #143 from pohly/path-setup 6880b0c prow.sh: avoid creating paths unless really running tests bc0504a Merge pull request #140 from jsafrane/remove-unused-k8s-libs 5b1de1a go-get-kubernetes.sh: remove unused k8s libs 49b4269 Merge pull request #120 from pohly/add-kubernetes-release a1e1127 Merge pull request #139 from pohly/kind-for-kubernetes-latest 1c0fb09 prow.sh: use KinD main for latest Kubernetes 1d77cfc Merge pull request #138 from pohly/kind-update-0.10 bff2fb7 prow.sh: KinD 0.10.0 95eac33 Merge pull request #137 from pohly/fix-go-version-check 437e431 verify-go-version.sh: fix check after removal of travis.yml 1748b16 Merge pull request #136 from pohly/go-1.16 ec844ea remove travis.yml, Go 1.16 df76aba Merge pull request #134 from andyzhangx/add-build-arg e314a56 add build-arg ARCH for building multi-arch images, e.g. ARG ARCH FROM k8s.gcr.io/build-image/debian-base-${ARCH}:v2.1.3 7bc70e5 Merge pull request #129 from pohly/squash-documentation e0b02e7 README.md: document usage of --squash 316cb95 Merge pull request #132 from yiyang5055/bugfix/boilerplate 26e2ab1 fix: default boilerplate path 1add8c1 Merge pull request #133 from pohly/kubernetes-1.20-tag 3e811d6 prow.sh: fix "on-master" prow jobs 1d60e77 Merge pull request #131 from pohly/kubernetes-1.20-tag 9f10459 prow.sh: support building Kubernetes for a specific version f7e7ee4 docs: steps for adding testing against new Kubernetes release fe1f284 Merge pull request #121 from kvaps/namespace-check 8fdf0f7 Merge pull request #128 from fengzixu/master 1c94220 fix: fix a bug of csi-sanity a4c41e6 Merge pull request #127 from pohly/fix-boilerplate ece0f50 check namespace for snapshot-controller dbd8967 verify-boilerplate.sh: fix path to script 9289fd1 Merge pull request #125 from sachinkumarsingh092/optional-spelling-boilerplate-checks ad29307 Make the spelling and boilerplate checks optional 5f06d02 Merge pull request #124 from sachinkumarsingh092/fix-spellcheck-boilerplate-tests 48186eb Fix spelling and boilerplate errors 71690af Merge pull request #122 from sachinkumarsingh092/include-spellcheck-boilerplate-tests 981be3f Adding spelling and boilerplate checks. 2bb7525 Merge pull request #117 from fengzixu/master 4ab8b15 use the tag to replace commit of csi-test 5d74e45 change the csi-test import path to v4 7dcd0a9 upgrade csi-test to v4.0.2 git-subtree-dir: release-tools git-subtree-split: 5489de6e743cf8362e5ab8275988cc748d0758b0
178 lines
7.4 KiB
Markdown
178 lines
7.4 KiB
Markdown
# [csi-release-tools](https://github.com/kubernetes-csi/csi-release-tools)
|
|
|
|
These build and test rules can be shared between different Go projects
|
|
without modifications. Customization for the different projects happen
|
|
in the top-level Makefile.
|
|
|
|
The rules include support for building and pushing Docker images, with
|
|
the following features:
|
|
- one or more command and image per project
|
|
- push canary and/or tagged release images
|
|
- automatically derive the image tag(s) from repo tags
|
|
- the source code revision is stored in a "revision" image label
|
|
- never overwrites an existing release image
|
|
|
|
Usage
|
|
-----
|
|
|
|
The expected repository layout is:
|
|
- `cmd/*/*.go` - source code for each command
|
|
- `cmd/*/Dockerfile` - docker file for each command or
|
|
Dockerfile in the root when only building a single command
|
|
- `Makefile` - includes `release-tools/build.make` and sets
|
|
configuration variables
|
|
- `.prow.sh` script which imports `release-tools/prow.sh`
|
|
and may contain further customization
|
|
- `.cloudbuild.sh` and `cloudbuild.yaml` as symlinks to
|
|
the corresponding files in `release-tools` or (if necessary)
|
|
as custom files
|
|
|
|
To create a release, tag a certain revision with a name that
|
|
starts with `v`, for example `v1.0.0`, then `make push`
|
|
while that commit is checked out.
|
|
|
|
It does not matter on which branch that revision exists, i.e. it is
|
|
possible to create releases directly from master. A release branch can
|
|
still be created for maintenance releases later if needed.
|
|
|
|
Release branches are expected to be named `release-x.y` for releases
|
|
`x.y.z`. Building from such a branch creates `x.y-canary`
|
|
images. Building from master creates the main `canary` image.
|
|
|
|
Sharing and updating
|
|
--------------------
|
|
|
|
[`git subtree`](https://github.com/git/git/blob/HEAD/contrib/subtree/git-subtree.txt)
|
|
is the recommended way of maintaining a copy of the rules inside the
|
|
`release-tools` directory of a project. This way, it is possible to make
|
|
changes also locally, test them and then push them back to the shared
|
|
repository at a later time.
|
|
|
|
We no longer care about importing the full commit history, so `--squash` should be used
|
|
when submitting a `release-tools` update. Also make sure that the PR for that
|
|
contains the automatically generated commit message in the PR description.
|
|
It contains the list of individual commits that were squashed. The script from
|
|
https://github.com/kubernetes-csi/csi-release-tools/issues/7 can create such
|
|
PRs automatically.
|
|
|
|
Cheat sheet:
|
|
|
|
- `git subtree add --squash --prefix=release-tools https://github.com/kubernetes-csi/csi-release-tools.git master` - add release tools to a repo which does not have them yet (only once)
|
|
- `git subtree pull --squash --prefix=release-tools https://github.com/kubernetes-csi/csi-release-tools.git master` - update local copy to latest upstream (whenever upstream changes)
|
|
- edit, `git commit`, `git subtree push --prefix=release-tools git@github.com:<user>/csi-release-tools.git <my-new-or-existing-branch>` - push to a new branch before submitting a PR
|
|
|
|
verify-shellcheck.sh
|
|
--------------------
|
|
|
|
The [verify-shellcheck.sh](./verify-shellcheck.sh) script in this repo
|
|
is a stripped down copy of the [corresponding
|
|
script](https://github.com/kubernetes/kubernetes/blob/release-1.14/hack/verify-shellcheck.sh)
|
|
in the Kubernetes repository. It can be used to check for certain
|
|
errors shell scripts, like missing quotation marks. The default
|
|
`test-shellcheck` target in [build.make](./build.make) only checks the
|
|
scripts in this directory. Components can add more directories to
|
|
`TEST_SHELLCHECK_DIRS` to check also other scripts.
|
|
|
|
End-to-end testing
|
|
------------------
|
|
|
|
A repo that wants to opt into testing via Prow must set up a top-level
|
|
`.prow.sh`. Typically that will source `prow.sh` and then transfer
|
|
control to it:
|
|
|
|
``` bash
|
|
#! /bin/bash -e
|
|
|
|
. release-tools/prow.sh
|
|
main
|
|
```
|
|
|
|
All Kubernetes-CSI repos are expected to switch to Prow. For details
|
|
on what is enabled in Prow, see
|
|
https://github.com/kubernetes/test-infra/tree/HEAD/config/jobs/kubernetes-csi
|
|
|
|
Test results for periodic jobs are visible in
|
|
https://testgrid.k8s.io/sig-storage-csi-ci
|
|
|
|
It is possible to reproduce the Prow testing locally on a suitable machine:
|
|
- Linux host
|
|
- Docker installed
|
|
- code to be tested checkout out in `$GOPATH/src/<import path>`
|
|
- `cd $GOPATH/src/<import path> && ./.prow.sh`
|
|
|
|
Beware that the script intentionally doesn't clean up after itself and
|
|
modifies the content of `$GOPATH`, in particular the `kubernetes` and
|
|
`kind` repositories there. Better run it in an empty, disposable
|
|
`$GOPATH`.
|
|
|
|
When it terminates, the following command can be used to get access to
|
|
the Kubernetes cluster that was brought up for testing (assuming that
|
|
this step succeeded):
|
|
|
|
export KUBECONFIG="$(kind get kubeconfig-path --name="csi-prow")"
|
|
|
|
It is possible to control the execution via environment variables. See
|
|
`prow.sh` for details. Particularly useful is testing against different
|
|
Kubernetes releases:
|
|
|
|
CSI_PROW_KUBERNETES_VERSION=1.13.3 ./.prow.sh
|
|
CSI_PROW_KUBERNETES_VERSION=latest ./.prow.sh
|
|
|
|
Dependencies and vendoring
|
|
--------------------------
|
|
|
|
Most projects will (eventually) use `go mod` to manage
|
|
dependencies. `dep` is also still supported by `csi-release-tools`,
|
|
but not documented here because it's not recommended anymore.
|
|
|
|
The usual instructions for using [go
|
|
modules](https://github.com/golang/go/wiki/Modules) apply. Here's a cheat sheet
|
|
for some of the relevant commands:
|
|
- list available updates: `GO111MODULE=on go list -u -m all`
|
|
- update or add a single dependency: `GO111MODULE=on go get <package>`
|
|
- update all dependencies to their next minor or patch release:
|
|
`GO111MODULE=on go get ./...` (add `-u=patch` to limit to patch
|
|
releases)
|
|
- lock onto a specific version: `GO111MODULE=on go get <package>@<version>`
|
|
- clean up `go.mod`: `GO111MODULE=on go mod tidy`
|
|
- update vendor directory: `GO111MODULE=on go mod vendor`
|
|
|
|
`GO111MODULE=on` can be left out when using Go >= 1.13 or when the
|
|
source is checked out outside of `$GOPATH`.
|
|
|
|
`go mod tidy` must be used to ensure that the listed dependencies are
|
|
really still needed. Changing import statements or a tentative `go
|
|
get` can result in stale dependencies.
|
|
|
|
The `test-vendor` verifies that it was used when run locally or in a
|
|
pre-merge CI job. If a `vendor` directory is present, it will also
|
|
verify that it's content is up-to-date.
|
|
|
|
The `vendor` directory is optional. It is still present in projects
|
|
because it avoids downloading sources during CI builds. If this is no
|
|
longer deemed necessary, then a project can also remove the directory.
|
|
|
|
Conversion of a repository that uses `dep` to `go mod` can be done with:
|
|
|
|
GO111MODULE=on go mod init
|
|
release-tools/go-get-kubernetes.sh <current Kubernetes version from Gopkg.toml>
|
|
GO111MODULE=on go mod tidy
|
|
GO111MODULE=on go mod vendor
|
|
git rm -f Gopkg.toml Gopkg.lock
|
|
git add go.mod go.sum vendor
|
|
|
|
### Updating Kubernetes dependencies
|
|
|
|
When using packages that are part of the Kubernetes source code, the
|
|
commands above are not enough because the [lack of semantic
|
|
versioning](https://github.com/kubernetes/kubernetes/issues/72638)
|
|
prevents `go mod` from finding newer releases. Importing directly from
|
|
`kubernetes/kubernetes` also needs `replace` statements to override
|
|
the fake `v0.0.0` versions
|
|
(https://github.com/kubernetes/kubernetes/issues/79384). The
|
|
`go-get-kubernetes.sh` script can be used to update all packages in
|
|
lockstep to a different Kubernetes version. Example usage:
|
|
```
|
|
$ ./release-tools/go-get-kubernetes.sh 1.16.4
|
|
```
|