From 1dc9d9883347cf9552630785b89872a2ab754ef3 Mon Sep 17 00:00:00 2001 From: Ismayil Mirzali Date: Fri, 12 Aug 2022 07:22:43 +0300 Subject: [PATCH] Reimplement kubectl plugin release workflow (#8812) * Feat: reimplement kubectl plugin release system This commit does the following changes: - Add GitHub Actions pipeline for releasing the plugin - Removes the build/build-plugin.sh and replaces this with GoReleaser - Adds the use of krew-release-bot for automatically updating the krew release - Removes the make target for build/build-plugin.sh Signed-off-by: Ismayil Mirzali * Fix: pin github actions stages with commit sha Signed-off-by: Ismayil Mirzali Signed-off-by: Ismayil Mirzali --- .github/workflows/plugin.yaml | 37 +++++++++++++ .goreleaser.yaml | 29 +++++++++++ Makefile | 12 ----- build/build-plugin.sh | 84 ------------------------------ cmd/plugin/ingress-nginx.yaml.tmpl | 51 ------------------ cmd/plugin/krew.yaml | 41 +++++++++++++++ 6 files changed, 107 insertions(+), 147 deletions(-) create mode 100644 .github/workflows/plugin.yaml create mode 100644 .goreleaser.yaml delete mode 100755 build/build-plugin.sh delete mode 100644 cmd/plugin/ingress-nginx.yaml.tmpl create mode 100644 cmd/plugin/krew.yaml diff --git a/.github/workflows/plugin.yaml b/.github/workflows/plugin.yaml new file mode 100644 index 0000000000..efc9a6f06a --- /dev/null +++ b/.github/workflows/plugin.yaml @@ -0,0 +1,37 @@ +name: kubectl plugin + +on: + push: + branches: + - "main" + paths: + - "cmd/plugin/**" + tags: + - "v*" + +jobs: + release-plugin: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 + with: + fetch-depth: 0 + + - name: Set up Go + uses: actions/setup-go@b22fbbc2921299758641fab08929b4ac52b32923 # v3.2.0 + with: + go-version: 1.18 + + - name: Run GoReleaser + uses: goreleaser/goreleaser-action@68acf3b1adf004ac9c2f0a4259e85c5f66e99bef # v3.0.0 + with: + version: latest + args: release --rm-dist + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Update new version in krew-index + uses: rajatjindal/krew-release-bot@92da038bbf995803124a8e50ebd438b2f37bbbb0 # v0.0.43 + with: + krew_template_file: cmd/plugin/krew.yaml diff --git a/.goreleaser.yaml b/.goreleaser.yaml new file mode 100644 index 0000000000..a0ef6eb3d2 --- /dev/null +++ b/.goreleaser.yaml @@ -0,0 +1,29 @@ +project_name: ingress-nginx +release: + github: + owner: kubernetes + name: ingress-nginx +builds: + - id: ingress-nginx + goos: + - darwin + - linux + - windows + goarch: + - arm64 + - amd64 + env: + - CGO_ENABLED=0 + - GO111MODULE=on + main: cmd/plugin/main.go + binary: kubectl-ingress-nginx + ldflags: | + -s -w + -X k8s.io/ingress-nginx/version.COMMIT={{ .Commit }} + -X k8s.io/ingress-nginx/version.RELEASE={{ .Tag }} +archives: + - id: ingress-nginx + builds: + - ingress-nginx + name_template: "kubectl-{{ .ProjectName }}_{{ .Os }}_{{ .Arch }}" + format: tar.gz diff --git a/Makefile b/Makefile index fcbf79816a..7a62d6f61b 100644 --- a/Makefile +++ b/Makefile @@ -127,18 +127,6 @@ build: ## Build ingress controller, debug tool and pre-stop hook. build/build.sh -.PHONY: build-plugin -build-plugin: ## Build ingress-nginx krew plugin. - @build/run-in-docker.sh \ - PKG=$(PKG) \ - MAC_OS=$(MAC_OS) \ - ARCH=$(ARCH) \ - COMMIT_SHA=$(COMMIT_SHA) \ - REPO_INFO=$(REPO_INFO) \ - TAG=$(TAG) \ - build/build-plugin.sh - - .PHONY: clean clean: ## Remove .gocache directory. rm -rf bin/ .gocache/ .cache/ diff --git a/build/build-plugin.sh b/build/build-plugin.sh deleted file mode 100755 index a3ed34bf28..0000000000 --- a/build/build-plugin.sh +++ /dev/null @@ -1,84 +0,0 @@ -#!/bin/bash - -# 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. - -if [ -n "$DEBUG" ]; then - set -x -fi - -set -o errexit -set -o nounset -set -o pipefail - -declare -a mandatory -mandatory=( - PKG - ARCH - COMMIT_SHA - REPO_INFO - TAG -) - -missing=false -for var in "${mandatory[@]}"; do - if [[ -z "${!var:-}" ]]; then - echo "Environment variable $var must be set" - missing=true - fi -done - -if [ "$missing" = true ]; then - exit 1 -fi - -export CGO_ENABLED=0 - -release=cmd/plugin/release - -function build_for_arch(){ - os=$1 - arch=$2 - extension=$3 - - echo "> building targets for ${os}-${arch}" - - env GOOS="${os}" GOARCH="${arch}" go build \ - ${GOBUILD_FLAGS} \ - -trimpath -ldflags="-buildid= -w -s \ - -X ${PKG}/version.RELEASE=${TAG} \ - -X ${PKG}/version.COMMIT=${COMMIT_SHA} \ - -X ${PKG}/version.REPO=${REPO_INFO}" \ - -o "${release}/kubectl-ingress_nginx${extension}" "${PKG}/cmd/plugin" - - cp LICENSE ${release} - tar -C "${release}" -zcvf "${release}/kubectl-ingress_nginx-${os}-${arch}.tar.gz" "kubectl-ingress_nginx${extension}" LICENSE - rm "${release}/kubectl-ingress_nginx${extension}" - hash=$(sha256sum "${release}/kubectl-ingress_nginx-${os}-${arch}.tar.gz" | awk '{ print $1 }') - sed -i "s/%%%shasum_${os}_${arch}%%%/${hash}/g" "${release}/ingress-nginx.yaml" -} - -rm -rf "${release}" -mkdir "${release}" - -cp cmd/plugin/ingress-nginx.yaml.tmpl "${release}/ingress-nginx.yaml" - -sed -i "s/%%%tag%%%/${TAG}/g" ${release}/ingress-nginx.yaml - -echo "Generated targets in ${release} directory." - -build_for_arch darwin amd64 '' -build_for_arch darwin arm64 '' -build_for_arch linux amd64 '' -build_for_arch windows amd64 '.exe' diff --git a/cmd/plugin/ingress-nginx.yaml.tmpl b/cmd/plugin/ingress-nginx.yaml.tmpl deleted file mode 100644 index 9fce2d92d0..0000000000 --- a/cmd/plugin/ingress-nginx.yaml.tmpl +++ /dev/null @@ -1,51 +0,0 @@ -apiVersion: krew.googlecontainertools.github.com/v1alpha2 -kind: Plugin -metadata: - name: ingress-nginx -spec: - shortDescription: Interact with ingress-nginx - description: | - The official kubectl plugin for ingress-nginx. - version: %%%tag%%% - homepage: https://kubernetes.github.io/ingress-nginx/kubectl-plugin/ - platforms: - - uri: https://github.com/kubernetes/ingress-nginx/releases/download/nginx-%%%tag%%%/kubectl-ingress_nginx-darwin-arm64.tar.gz - sha256: %%%shasum_darwin_arm64%%% - files: - - from: "*" - to: "." - bin: "./kubectl-ingress_nginx" - selector: - matchLabels: - os: darwin - arch: arm64 - - uri: https://github.com/kubernetes/ingress-nginx/releases/download/nginx-%%%tag%%%/kubectl-ingress_nginx-darwin-amd64.tar.gz - sha256: %%%shasum_darwin_amd64%%% - files: - - from: "*" - to: "." - bin: "./kubectl-ingress_nginx" - selector: - matchLabels: - os: darwin - arch: amd64 - - uri: https://github.com/kubernetes/ingress-nginx/releases/download/nginx-%%%tag%%%/kubectl-ingress_nginx-linux-amd64.tar.gz - sha256: %%%shasum_linux_amd64%%% - files: - - from: "*" - to: "." - bin: "./kubectl-ingress_nginx" - selector: - matchLabels: - os: linux - arch: amd64 - - uri: https://github.com/kubernetes/ingress-nginx/releases/download/nginx-%%%tag%%%/kubectl-ingress_nginx-windows-amd64.tar.gz - sha256: %%%shasum_windows_amd64%%% - files: - - from: "*" - to: "." - bin: "./kubectl-ingress_nginx.exe" - selector: - matchLabels: - os: windows - arch: amd64 diff --git a/cmd/plugin/krew.yaml b/cmd/plugin/krew.yaml new file mode 100644 index 0000000000..e68b09f9a7 --- /dev/null +++ b/cmd/plugin/krew.yaml @@ -0,0 +1,41 @@ +apiVersion: krew.googlecontainertools.github.com/v1alpha2 +kind: Plugin +metadata: + name: ingress-nginx +spec: + shortDescription: Interact with ingress-nginx + description: | + The official kubectl plugin for ingress-nginx. + version: {{ .TagName }} + homepage: https://kubernetes.github.io/ingress-nginx/kubectl-plugin/ + platforms: + - selector: + matchLabels: + os: darwin + arch: arm64 + {{addURIAndSha "https://github.com/kubernetes/ingress-nginx/releases/download/{{ .TagName }}/kubectl-ingress-nginx_darwin_arm64.tar.gz" .TagName }} + bin: kubectl-ingress-nginx + - selector: + matchLabels: + os: darwin + arch: amd64 + {{addURIAndSha "https://github.com/kubernetes/ingress-nginx/releases/download/{{ .TagName }}/kubectl-ingress-nginx_darwin_amd64.tar.gz" .TagName }} + bin: kubectl-ingress-nginx + selector: + matchLabels: + os: linux + arch: amd64 + {{addURIAndSha "https://github.com/kubernetes/ingress-nginx/releases/download/{{ .TagName }}/kubectl-ingress-nginx_linux_amd64.tar.gz" .TagName }} + bin: kubectl-ingress-nginx + - selector: + matchLabels: + os: linux + arch: arm64 + {{addURIAndSha "https://github.com/kubernetes/ingress-nginx/releases/download/{{ .TagName }}/kubectl-ingress-nginx_linux_arm64.tar.gz" .TagName }} + bin: kubectl-ingress-nginx + - selector: + matchLabels: + os: windows + arch: amd64 + {{addURIAndSha "https://github.com/kubernetes/ingress-nginx/releases/download/{{ .TagName }}/kubectl-ingress-nginx_windows_amd64.tar.gz" .TagName }} + bin: kubectl-ingress-nginx.exe