From 018a41e0e08d5fc8f034ff17cc9865869a81f924 Mon Sep 17 00:00:00 2001 From: Vince Prignano Date: Mon, 8 Apr 2024 08:43:35 -0700 Subject: [PATCH] Add github action to package envtest binaries in releases Signed-off-by: Vince Prignano --- .github/workflows/tools-releases.yml | 55 +++++++++------------------- .gitignore | 1 + Makefile | 47 ++++++++++++++++++++++++ cloudbuild.yaml | 20 ++++++++++ hack/envtest/_matrix/v1.28.0.yaml | 1 + hack/envtest/darwin/Dockerfile | 8 +++- hack/envtest/linux/Dockerfile | 8 +++- hack/envtest/windows/Dockerfile | 8 +++- 8 files changed, 107 insertions(+), 41 deletions(-) create mode 100644 cloudbuild.yaml diff --git a/.github/workflows/tools-releases.yml b/.github/workflows/tools-releases.yml index 7e195c387..475608ed6 100644 --- a/.github/workflows/tools-releases.yml +++ b/.github/workflows/tools-releases.yml @@ -4,31 +4,16 @@ on: push: branches: - main + - tools-releases paths: - 'hack/envtest/_matrix/*.yaml' permissions: - contents: read - packages: write + contents: write jobs: build-and-push: runs-on: ubuntu-latest - strategy: - matrix: - os: - - linux - - darwin - arch: - - amd64 - - arm64 - include: - - arch: ppc64le - os: linux - - arch: s390x - os: linux - - arch: amd64 - os: windows steps: - name: Checkout code uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # tag=v4.1.2 @@ -45,6 +30,7 @@ jobs: echo "One Kubernetes patch version files should be changed to create a package, found ${{ steps.changed-files.outputs.all_changed_files_count }}" exit 1 fi + for changed_file in ${{ steps.changed-files.outputs.all_changed_files }}; do export KUBERNETES_VERSION=$(echo "${changed_file}" | grep -oP '(?<=/)[^/]+(?=\.yaml)') echo "KUBERNETES_VERSION=$KUBERNETES_VERSION" >> $GITHUB_ENV @@ -55,25 +41,18 @@ jobs: ETCD_VERSION=$(yq eval '.etcd' $changed_file) echo "ETCD_VERSION=$ETCD_VERSION" >> $GITHUB_ENV done - - name: Set up Docker - uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # tag=v3.3.0 - - name: Log in to the Container registry - uses: docker/login-action@e92390c5fb421da1463c202d546fed0ec5c39f20 # tag=v3.1.0 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - name: Build and push Docker images - uses: docker/build-push-action@2cdde995de11925a030ce8070c3d77a52ffcf1c0 # tag=v5.3.0 + - name: Build packages + run: | + make release-package-envtest \ + KUBERNETES_VERSION=${{ env.KUBERNETES_VERSION }} \ + GO_VERSION=${{ env.GO_VERSION }} \ + ETCD_VERSION=${{ env.ETCD_VERSION }} + - name: Release + uses: softprops/action-gh-release@9d7c94cfd0a1f3ed45544c887983e9fa900f0564 # tag=v2.0.4 with: - context: . - file: ./hack/envtest/${{matrix.os}}/Dockerfile - build-args: | - GO_VERSION=${{env.GO_VERSION}} - KUBERNETES_VERSION=${{env.KUBERNETES_VERSION}} - ETCD_VERSION=${{env.ETCD_VERSION}} - OS=${{matrix.os}} - ARCH=${{matrix.arch}} - push: true - tags: | - ghcr.io/kubernetes-sigs/controller-tools/envtest:${{env.KUBERNETES_VERSION}}-${{matrix.os}}-${{matrix.arch}} + name: envtest/${{ env.KUBERNETES_VERSION }} + draft: true + prerelease: true + make_latest: false + files: out/* + fail_on_unmatched_files: true diff --git a/.gitignore b/.gitignore index 7a427bdbe..01a75264a 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ *~ # Tools binaries. +out hack/tools/bin junit-report.xml diff --git a/Makefile b/Makefile index 6bc225d3f..ed8fa49a5 100644 --- a/Makefile +++ b/Makefile @@ -92,3 +92,50 @@ clean: ## Cleanup. .PHONY: clean-bin clean-bin: ## Remove all generated binaries. rm -rf hack/tools/bin + +.PHONE: clean-release +clean-release: ## Remove all generated release binaries. + rm -rf $(RELEASE_DIR) + +## -------------------------------------- +## Envtest Build +## -------------------------------------- + +RELEASE_DIR := out + +.PHONY: $(RELEASE_DIR) +$(RELEASE_DIR): + mkdir -p $(RELEASE_DIR)/ + +.PHONY: release-envtest +release-envtest: + ./hack/envtest/build.sh + +.PHONY: release-package-envtest +release-package-envtest: clean-release ## Build the envtest binaries by operating system. + OS=linux ARCH=amd64 $(MAKE) release-envtest-docker-build + OS=linux ARCH=arm64 $(MAKE) release-envtest-docker-build + OS=linux ARCH=ppc64le $(MAKE) release-envtest-docker-build + OS=linux ARCH=s390x $(MAKE) release-envtest-docker-build + OS=darwin ARCH=amd64 $(MAKE) release-envtest-docker-build + OS=darwin ARCH=arm64 $(MAKE) release-envtest-docker-build + OS=windows ARCH=amd64 $(MAKE) release-envtest-docker-build + +.PHONY: release-envtest-docker-build +release-envtest-docker-build: $(RELEASE_DIR) ## Build the envtest binaries. + @: $(if $(GO_VERSION),,$(error GO_VERSION is not set)) + @: $(if $(KUBERNETES_VERSION),,$(error KUBERNETES_VERSION is not set)) + @: $(if $(ETCD_VERSION),,$(error ETCD_VERSION is not set)) + @: $(if $(OS),,$(error OS is not set)) + @: $(if $(ARCH),,$(error ARCH is not set)) + + docker buildx build \ + --file ./hack/envtest/$(OS)/Dockerfile \ + --build-arg GO_VERSION=$(GO_VERSION) \ + --build-arg KUBERNETES_VERSION=$(KUBERNETES_VERSION) \ + --build-arg ETCD_VERSION=$(ETCD_VERSION) \ + --build-arg OS=$(OS) \ + --build-arg ARCH=$(ARCH) \ + --tag sigs.k8s.io/controller-tools/envtest:$(KUBERNETES_VERSION)-$(OS)-$(ARCH) \ + --output type=local,dest=$(RELEASE_DIR) \ + . diff --git a/cloudbuild.yaml b/cloudbuild.yaml new file mode 100644 index 000000000..bca01b8f0 --- /dev/null +++ b/cloudbuild.yaml @@ -0,0 +1,20 @@ +# See https://cloud.google.com/cloud-build/docs/build-config +# See https://console.cloud.google.com/gcr/images/k8s-staging-test-infra/global/gcb-docker-gcloud +timeout: 2700s +options: + substitution_option: ALLOW_LOOSE + machineType: 'E2_HIGHCPU_8' +steps: + - name: 'gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20230522-312425ae46' + entrypoint: make + env: + - DOCKER_CLI_EXPERIMENTAL=enabled + - TAG=$_GIT_TAG + - PULL_BASE_REF=$_PULL_BASE_REF + - DOCKER_BUILDKIT=1 + args: ['release-envtest', '-j', '8'] +substitutions: + # _GIT_TAG will be filled with a git-based tag for the image, of the form vYYYYMMDD-hash, and + # can be used as a substitution + _GIT_TAG: '12345' + _PULL_BASE_REF: 'dev' diff --git a/hack/envtest/_matrix/v1.28.0.yaml b/hack/envtest/_matrix/v1.28.0.yaml index 83bf3ddd8..6a369c454 100644 --- a/hack/envtest/_matrix/v1.28.0.yaml +++ b/hack/envtest/_matrix/v1.28.0.yaml @@ -1,2 +1,3 @@ go: 1.21 etcd: v3.5.9 + diff --git a/hack/envtest/darwin/Dockerfile b/hack/envtest/darwin/Dockerfile index 8adf45ace..74f8a60c0 100644 --- a/hack/envtest/darwin/Dockerfile +++ b/hack/envtest/darwin/Dockerfile @@ -51,6 +51,12 @@ RUN curl -sfLO https://github.com/coreos/etcd/releases/download/${ETCD_VERSION}/ unzip -o ${ETCD_BASE_NAME}.zip && \ cp ${ETCD_BASE_NAME}/etcd $DEST +# Package into tarball. +RUN tar -czvf /envtest-${KUBERNETES_VERSION}-${OS}-${ARCH}.tar.gz $DEST + # Build the final image with the binaries. FROM scratch -COPY --from=builder /controller-tools/envtest /controller-tools/envtest +ARG OS +ARG ARCH +ARG KUBERNETES_VERSION +COPY --from=builder /envtest-${KUBERNETES_VERSION}-${OS}-${ARCH}.tar.gz / diff --git a/hack/envtest/linux/Dockerfile b/hack/envtest/linux/Dockerfile index d68072ec5..9625e17a2 100644 --- a/hack/envtest/linux/Dockerfile +++ b/hack/envtest/linux/Dockerfile @@ -45,6 +45,12 @@ RUN curl -sfLO https://github.com/coreos/etcd/releases/download/${ETCD_VERSION}/ tar xzf ${ETCD_BASE_NAME}.tar.gz && \ cp ${ETCD_BASE_NAME}/etcd $DEST +# Package into tarball. +RUN tar -czvf /envtest-${KUBERNETES_VERSION}-${OS}-${ARCH}.tar.gz $DEST + # Build the final image with the binaries. FROM scratch -COPY --from=builder /controller-tools/envtest /controller-tools/envtest +ARG OS +ARG ARCH +ARG KUBERNETES_VERSION +COPY --from=builder /envtest-${KUBERNETES_VERSION}-${OS}-${ARCH}.tar.gz / diff --git a/hack/envtest/windows/Dockerfile b/hack/envtest/windows/Dockerfile index a74a73c0d..b02c2bca1 100644 --- a/hack/envtest/windows/Dockerfile +++ b/hack/envtest/windows/Dockerfile @@ -51,6 +51,12 @@ RUN curl -sfLO https://github.com/coreos/etcd/releases/download/${ETCD_VERSION}/ unzip -o ${ETCD_BASE_NAME}.zip && \ cp ${ETCD_BASE_NAME}/etcd.exe $DEST +# Package into tarball. +RUN tar -czvf /envtest-${KUBERNETES_VERSION}-${OS}-${ARCH}.tar.gz $DEST + # Build the final image with the binaries. FROM scratch -COPY --from=builder /controller-tools/envtest /controller-tools/envtest +ARG OS +ARG ARCH +ARG KUBERNETES_VERSION +COPY --from=builder /envtest-${KUBERNETES_VERSION}-${OS}-${ARCH}.tar.gz /