From 2dc58365ed0952c69efc888ee63fba0ff86b510d Mon Sep 17 00:00:00 2001 From: Vince Prignano Date: Fri, 5 Apr 2024 09:21:45 -0700 Subject: [PATCH] :sparkles: Build and publish Kubernetes envtest tools as packages Signed-off-by: Vince Prignano --- .github/workflows/tools-releases.yml | 56 +++++++++++++++++++++++++ hack/tools/envtest/darwin/Dockerfile | 60 +++++++++++++++++++++++++++ hack/tools/envtest/linux/Dockerfile | 49 ++++++++++++++++++++++ hack/tools/envtest/windows/Dockerfile | 60 +++++++++++++++++++++++++++ 4 files changed, 225 insertions(+) create mode 100644 .github/workflows/tools-releases.yml create mode 100644 hack/tools/envtest/darwin/Dockerfile create mode 100644 hack/tools/envtest/linux/Dockerfile create mode 100644 hack/tools/envtest/windows/Dockerfile diff --git a/.github/workflows/tools-releases.yml b/.github/workflows/tools-releases.yml new file mode 100644 index 000000000..4d2bc7e1f --- /dev/null +++ b/.github/workflows/tools-releases.yml @@ -0,0 +1,56 @@ +name: Kubernetes Tools Releases for controller-runtime envtest + +on: + push: + branches: + - tools-releases + +env: + KUBERNETES_VERSION: 1.28.0 + +permissions: + contents: read + packages: write + +jobs: + build-and-push: + runs-on: ubuntu-latest + strategy: + fail-fast: true + 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@v4 + - name: Set up Docker + uses: docker/setup-buildx-action@v3 + - name: Log in to the Container registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Build and push Docker images + uses: docker/build-push-action@v5 + with: + context: . + file: ./hack/tools/envtest/${{matrix.os}}/Dockerfile + build-args: | + KUBERNETES_VERSION=v${{env.KUBERNETES_VERSION}} + OS=${{matrix.os}} + ARCH=${{matrix.arch}} + push: true + tags: | + ghcr.io/kubernetes-sigs/controller-tools/x-kubernetes-${{matrix.os}}-${{matrix.arch}}:${{env.KUBERNETES_VERSION}}-experimental diff --git a/hack/tools/envtest/darwin/Dockerfile b/hack/tools/envtest/darwin/Dockerfile new file mode 100644 index 000000000..db58bae3b --- /dev/null +++ b/hack/tools/envtest/darwin/Dockerfile @@ -0,0 +1,60 @@ +# Copyright 2018 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Build or fetch the following binaries for darwin and then host them in a tar.gz file in an alpine image +# - kube-apiserver (build) +# - kubectl (fetch) +# - etcd (fetch) + +FROM golang:1.21 as builder + +# Version and platform args. +ARG KUBERNETES_VERSION +ARG ETCD_VERSION=v3.5.13 +ARG OS=darwin +ARG ARCH + +# Tools path. +ENV DEST=/controller-tools/envtest + +# Install dependencies. +RUN apt update && \ + apt install unzip rsync -y && \ + mkdir -p $DEST + +# kube-apiserver +WORKDIR /kubernetes +RUN git clone https://github.com/kubernetes/kubernetes . --depth=1 -b ${KUBERNETES_VERSION} +ENV CGO_ENABLED=0 +ENV KUBE_BUILD_PLATFORMS=${OS}/${ARCH} +RUN make WHAT=cmd/kube-apiserver && \ + cp _output/local/bin/${KUBE_BUILD_PLATFORMS}/kube-apiserver $DEST + +# kubectl +RUN /bin/bash -x -c ' \ + { curl -sfLO https://storage.googleapis.com/kubernetes-release/release/${KUBERNETES_VERSION}/bin/${OS}/${ARCH}/kubectl && \ + chmod +x kubectl && \ + cp kubectl $DEST; } || \ + { make WHAT=cmd/kubectl && \ + cp _output/local/bin/${KUBE_BUILD_PLATFORMS}/kubectl $DEST; }' + +# etcd +ENV ETCD_BASE_NAME=etcd-${ETCD_VERSION}-${OS}-${ARCH} +RUN curl -sfLO https://github.com/coreos/etcd/releases/download/${ETCD_VERSION}/${ETCD_BASE_NAME}.zip && \ + unzip -o ${ETCD_BASE_NAME}.zip && \ + cp ${ETCD_BASE_NAME}/etcd $DEST + +# Build the final image with the binaries. +FROM gcr.io/distroless/static:nonroot +COPY --from=builder /controller-tools/envtest /controller-tools/envtest diff --git a/hack/tools/envtest/linux/Dockerfile b/hack/tools/envtest/linux/Dockerfile new file mode 100644 index 000000000..af4265260 --- /dev/null +++ b/hack/tools/envtest/linux/Dockerfile @@ -0,0 +1,49 @@ +# Copyright 2018 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +FROM golang:1.21 as builder + +# Version and platform args. +ARG KUBERNETES_VERSION +ARG ETCD_VERSION=v3.5.13 +ARG OS=linux +ARG ARCH + +# Tools path. +ENV DEST=/controller-tools/envtest + +# Install dependencies. +RUN apt update && \ + apt install unzip rsync -y && \ + mkdir -p $DEST + +# kube-apiserver +RUN curl -sfLO https://dl.k8s.io/${KUBERNETES_VERSION}/bin/${OS}/${ARCH}/kube-apiserver && \ + chmod +x kube-apiserver && \ + cp kube-apiserver $DEST + +# kubectl +RUN curl -sfLO https://storage.googleapis.com/kubernetes-release/release/${KUBERNETES_VERSION}/bin/${OS}/${ARCH}/kubectl && \ + chmod +x kubectl && \ + cp kubectl $DEST + +# etcd +ENV ETCD_BASE_NAME=etcd-${ETCD_VERSION}-${OS}-${ARCH} +RUN curl -sfLO https://github.com/coreos/etcd/releases/download/${ETCD_VERSION}/${ETCD_BASE_NAME}.tar.gz && \ + tar xzf ${ETCD_BASE_NAME}.tar.gz && \ + cp ${ETCD_BASE_NAME}/etcd $DEST + +# Build the final image with the binaries. +FROM gcr.io/distroless/static:nonroot +COPY --from=builder /controller-tools/envtest /controller-tools/envtest diff --git a/hack/tools/envtest/windows/Dockerfile b/hack/tools/envtest/windows/Dockerfile new file mode 100644 index 000000000..023bede0f --- /dev/null +++ b/hack/tools/envtest/windows/Dockerfile @@ -0,0 +1,60 @@ +# Copyright 2018 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Build or fetch the following binaries for windows and then host them in a tar.gz file in an alpine image +# - kube-apiserver (build) +# - kubectl (fetch) +# - etcd (fetch) + +FROM golang:1.21 as builder + +# Version and platform args. +ARG KUBERNETES_VERSION +ARG ETCD_VERSION=v3.5.13 +ARG OS=windows +ARG ARCH + +# Tools path. +ENV DEST=/controller-tools/envtest + +# Install dependencies. +RUN apt update && \ + apt install unzip rsync -y && \ + mkdir -p $DEST + +# kube-apiserver +WORKDIR /kubernetes +RUN git clone https://github.com/kubernetes/kubernetes . --depth=1 -b ${KUBERNETES_VERSION} +ENV CGO_ENABLED=0 +ENV KUBE_BUILD_PLATFORMS=${OS}/${ARCH} +RUN make WHAT=cmd/kube-apiserver && \ + cp _output/local/bin/${KUBE_BUILD_PLATFORMS}/kube-apiserver.exe $DEST + +# kubectl +RUN /bin/bash -x -c ' \ + { curl -sfLO https://storage.googleapis.com/kubernetes-release/release/${KUBERNETES_VERSION}/bin/${OS}/${ARCH}/kubectl.exe && \ + chmod +x kubectl.exe && \ + cp kubectl.exe $DEST; } || \ + { make WHAT=cmd/kubectl && \ + cp _output/local/bin/${KUBE_BUILD_PLATFORMS}/kubectl.exe $DEST; }' + +# etcd +ENV ETCD_BASE_NAME=etcd-${ETCD_VERSION}-${OS}-${ARCH} +RUN curl -sfLO https://github.com/coreos/etcd/releases/download/${ETCD_VERSION}/${ETCD_BASE_NAME}.zip && \ + unzip -o ${ETCD_BASE_NAME}.zip && \ + cp ${ETCD_BASE_NAME}/etcd.exe $DEST + +# Build the final image with the binaries. +FROM gcr.io/distroless/static:nonroot +COPY --from=builder /controller-tools/envtest /controller-tools/envtest