From f9c613e70c881213054f279f84fcbec936895f79 Mon Sep 17 00:00:00 2001 From: Daniil Fedotov Date: Thu, 18 Apr 2024 13:33:43 -0400 Subject: [PATCH] build(release): add release workflow Release workflow will: - Create and push a release tag - Produce release using goreleaser with binaries and helm charts - Build docs from docs_new - Publish docs and helm charts index in the github pages --- .github/workflows/release.yaml | 113 +++++++++++++++++++++++++++++++++ .goreleaser.yml | 8 +++ Makefile | 3 + build/package_helm.sh | 52 +++++++++++++++ 4 files changed, 176 insertions(+) create mode 100644 .github/workflows/release.yaml create mode 100755 build/package_helm.sh diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 00000000000..39d6ebb99db --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,113 @@ +name: Release +on: + ## FIXME: replace with on_merge + workflow_dispatch: + inputs: + release_tag: + description: 'Image tag in the format x.x.x(-rcx)' + required: true + type: string + +env: + RELEASE_TAG: ${{ inputs.release_tag }} + GH_TOKEN: ${{ secrets.GH_TOKEN }} + GHCR_TOKEN: ${{ secrets.GITHUB_TOKEN }} + +jobs: + create_tag: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 + with: + ## FIXME: change to master + ref: ci-release + - run: | + git config --global user.name 'Kasten Production' + git config --global user.email 'infra@kasten.io' + git tag -a "${RELEASE_TAG}" -m "Release version" + git push origin "${RELEASE_TAG}" + + release_packages: + runs-on: ubuntu-latest + needs: create_tag + steps: + - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 + with: + ref: ${{ inputs.release_tag }} + - name: build helm charts + run: | + export PACKAGE_FOLDER=helm_package + export HELM_RELEASE_REPO_URL=https://github.com/kanisterio/kanister/releases/download/${RELEASE_TAG} + export HELM_RELEASE_REPO_INDEX=https://charts.kanister.io/ + make package-helm VERSION=${RELEASE_TAG} + - name: gorelease + run: | + export GITHUB_TOKEN="${GH_TOKEN}" + docker login https://ghcr.io -u kanisterio -p ${GHCR_TOKEN} + make gorelease + ## Upload to use in docs publishing + - uses: actions/upload-artifact@v4 + with: + name: helm-index + path: helm_package/index.yaml + + release_docs_and_charts: + runs-on: ubuntu-latest + needs: release_packages + steps: + - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 + with: + ref: ${{ inputs.release_tag }} + - uses: pnpm/action-setup@v3 + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + - name: Setup Pages + uses: actions/configure-pages@v4 + - name: Install dependencies + run: pnpm install + - name: Build with VitePress + run: pnpm docs:build + - name: download helm helm + uses: actions/download-artifact@v4 + with: + name: helm-index + path: docs/.vitepress/dist/helm_charts/ + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: docs/.vitepress/dist + + publish_docs_and_charts: + needs: release_docs_and_charts + + # Grant GITHUB_TOKEN the permissions required to make a Pages deployment + permissions: + pages: write # to deploy to Pages + id-token: write # to verify the deployment originates from an appropriate source + + # Deploy to the github-pages environment + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + + # Specify runner + deployment step + runs-on: ubuntu-latest + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 # or specific "vX.X.X" version tag for this action + + # release_example_docker_images: + # needs: release_packages + # steps: + # - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 + # with: + # ref: ${{ inputs.release_tag }} + # - run: ./build/build_example_images.sh + + diff --git a/.goreleaser.yml b/.goreleaser.yml index f910906da6a..154358dbb98 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -2,6 +2,14 @@ project_name: kanister before: hooks: - go mod download +release: + ## FIXME: remove that after testing + draft: true + replace_existing_draft: true + prerelease: auto + extra_files: + - glob: 'helm_package/kanister-operator-*.tgz' + - glob: 'helm_package/profile-*.tgz' builds: - id: kanctl binary: kanctl diff --git a/Makefile b/Makefile index 5c732bb09a7..97095af4b81 100644 --- a/Makefile +++ b/Makefile @@ -235,6 +235,9 @@ release-docs: docs release-helm: @/bin/bash ./build/release_helm.sh $(VERSION) +package-helm: + @$(MAKE) run CMD="PACKAGE_FOLDER=${PACKAGE_FOLDER} HELM_RELEASE_REPO_URL=${HELM_RELEASE_REPO_URL} HELM_RELEASE_REPO_INDEX=${HELM_RELEASE_REPO_INDEX} ./build/package_helm.sh $(VERSION)" + gorelease: @$(MAKE) run CMD="./build/gorelease.sh" diff --git a/build/package_helm.sh b/build/package_helm.sh new file mode 100755 index 00000000000..ca0ae3c2a9a --- /dev/null +++ b/build/package_helm.sh @@ -0,0 +1,52 @@ +#!/usr/bin/env bash +# Copyright 2024 The Kanister 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. + + +set -o errexit +set -o nounset +set -o xtrace +set -o pipefail + +PACKAGE_FOLDER=${PACKAGE_FOLDER:?"PACKAGE_FOLDER not specified"} +HELM_RELEASE_REPO_URL=${HELM_RELEASE_REPO_URL:?"HELM_RELEASE_REPO_URL not specified"} +HELM_RELEASE_REPO_INDEX=${HELM_RELEASE_REPO_INDEX:?"HELM_RELEASE_REPO_INDEX not specified"} + +main() { + version=${1:?"chart version not specified"} + + ## Cleanup old package folder + if [[ -d ${PACKAGE_FOLDER} ]] + then + rm -fr ${PACKAGE_FOLDER} + fi + mkdir ${PACKAGE_FOLDER} + + # Build profile chart archive + helm package helm/profile --version ${version} -d ${PACKAGE_FOLDER} + + # Build kanister-operator chart archive + helm package helm/kanister-operator --version ${version} -d ${PACKAGE_FOLDER} + + local repo_args="--url ${HELM_RELEASE_REPO_URL}" + + if curl ${HELM_RELEASE_REPO_INDEX} -o ${PACKAGE_FOLDER}/cur_index.yaml + then + repo_args="${repo_args} --merge ${PACKAGE_FOLDER}/cur_index.yaml" + fi + + helm repo index ${PACKAGE_FOLDER} ${repo_args} +} + +main $@