From d4eb2c94263b1487d6cff2bf8ae3bf738484f3d8 Mon Sep 17 00:00:00 2001 From: jregan Date: Sat, 4 Jul 2020 07:39:41 -0700 Subject: [PATCH] New cloud build scripts. --- releasing/cloudbuild.sh | 134 +++++++++++++++------------ releasing/cloudbuild.yaml | 58 ++++++++++++ releasing/cloudbuild_api.yaml | 11 --- releasing/cloudbuild_kustomize.yaml | 11 --- releasing/cloudbuild_pluginator.yaml | 11 --- releasing/localbuild.sh | 66 ++++--------- 6 files changed, 149 insertions(+), 142 deletions(-) create mode 100644 releasing/cloudbuild.yaml delete mode 100644 releasing/cloudbuild_api.yaml delete mode 100644 releasing/cloudbuild_kustomize.yaml delete mode 100644 releasing/cloudbuild_pluginator.yaml diff --git a/releasing/cloudbuild.sh b/releasing/cloudbuild.sh index f1bdc74bd..dbf4bcf35 100755 --- a/releasing/cloudbuild.sh +++ b/releasing/cloudbuild.sh @@ -1,75 +1,67 @@ #!/bin/bash +# +# Usage (from top of repo): +# +# releasing/cloudbuild.sh TAG [--snapshot] +# +# Where TAG is in the form +# +# api/v1.2.3 +# kustomize/v1.2.3 +# cmd/config/v1.2.3 +# ... etc. +# +# Cloud build should be configured to trigger on tags +# matching: +# +# [\w/]+/v\d+\.\d+\.\d+ +# +# This script runs goreleaser (http://goreleaser.com), +# presumably from a cloudbuild.yaml step that installed it. + set -e set -x -# Script to run http://goreleaser.com - -# Removed from `build` stanza -# binary: $module - -module=$1 +fullTag=$1 shift +echo "fullTag=$fullTag" -function setSemVer { - # Check the tag for consistency with module name. - # The following assumes git tags formatted like - # "api/v1.2.3" and splits on the slash. - # Goreleaser doesn't know what to do with this - # tag format, and fails when creating an archive - # with a / in the name. - local fullTag=$(git describe) - local tModule=${fullTag%/*} - semVer=${fullTag#*/} +remainingArgs="$@" +echo "Remaining args: $remainingArgs" - # Make sure version has no slash - # (k8s/v0.1.0 becomes v0.1.0) - local tmp=${semVer#*/} - if [ "$tmp" != "$semVer" ]; then - semVer="$tmp" - fi +# Take everything before the last slash. +# This is expected to match $module. +module=${fullTag%/*} +echo "module=$module" - echo "tModule=$tModule" - echo "semVer=$semVer" - if [ "$module" != "$tModule" ]; then - # Tag and argument sanity check - echo "Unexpected mismatch: moduleFromArg=$module, moduleFromTag=$tModule" - echo "Either the module arg to this script is wrong, or the git tag is wrong." - exit 1 - fi -} +# Take everything after the last slash. +# This should be something like "v1.2.3". +semVer=`echo $fullTag | sed "s|$module/||"` +echo "semVer=$semVer" -setSemVer +# This is probably a directory called /workspace +echo "pwd = $PWD" +# Sanity check +echo "### ls -las . ################################" +ls -las . +# echo "### ls -C /usr/bin ################################" +# ls -C /usr/bin +echo "###################################" + + +# CD into the module directory. +# This directory expected to contain a main.go, so there's +# no need for extra details in the `build` stanza below. cd $module -# 2020/May/11 Windows build temporaraily removed -# ("- windows" removed from the goos: list below) -# because of https://github.com/microsoft/go-winio/issues/161 -# Seeing the following in builds: -# : /go/pkg/mod/golang.org/x/crypto@v0.0.0-20190923035154-9ee001bba392/ssh/terminal/util_windows.go:97:61: -# multiple-value "golang.org/x/sys/windows".GetCurrentProcess() in single-value context - configFile=$(mktemp) cat <$configFile project_name: $module -env: -- CGO_ENABLED=0 -- GO111MODULE=on -checksum: - name_template: 'checksums.txt' -changelog: - sort: asc - filters: - exclude: - - '^docs:' - - '^test:' - - Merge pull request - - Merge branch -release: - github: - owner: kubernetes-sigs - name: kustomize - draft: true + +archives: +- name_template: "${module}_${semVer}_{{ .Os }}_{{ .Arch }}" + builds: - ldflags: > -s @@ -81,12 +73,34 @@ builds: - linux - darwin - windows + goarch: - amd64 -archives: -- name_template: "${module}_${semVer}_{{ .Os }}_{{ .Arch }}" + +changelog: + sort: asc + filters: + exclude: + - '^docs:' + - '^test:' + - Merge pull request + - Merge branch + +checksum: + name_template: 'checksums.txt' + +env: +- CGO_ENABLED=0 +- GO111MODULE=on + +release: + github: + owner: monopole + name: kustomize + draft: true + EOF cat $configFile -/bin/goreleaser release --config=$configFile --rm-dist --skip-validate $@ +/bin/goreleaser release --config=$configFile --rm-dist --skip-validate $remainingArgs diff --git a/releasing/cloudbuild.yaml b/releasing/cloudbuild.yaml new file mode 100644 index 000000000..67038c2e7 --- /dev/null +++ b/releasing/cloudbuild.yaml @@ -0,0 +1,58 @@ +steps: +- name: 'bash' + args: + - 'echo' + - 'Cloud build substitution check: ' + - 'BUILD_ID=$BUILD_ID' + - 'PROJECT_ID=$PROJECT_ID' + - 'REVISION_ID=$REVISION_ID' + - 'REPO_NAME=$REPO_NAME' + - 'COMMIT_SHA=$COMMIT_SHA' + - 'BRANCH_NAME=$BRANCH_NAME' + - 'TAG_NAME=$TAG_NAME' + +# Cloud build has already copied the repo at the tag that +# that triggered the build to its /workspace directory, but +# hasn't actually _cloned_ the repo (there's no .git directory). +# +# The goreleaser tool, however, needs the repo and its history +# to produce release notes. +# +# So clone the repo to /workspace/myClone to avoid directory +# name collision. +# +- name: gcr.io/cloud-builders/git + args: + - clone + - https://github.com/kubernetes-sigs/kustomize.git + - myClone + +# Checkout the proper tag. +- name: gcr.io/cloud-builders/git + dir: myClone + args: + - checkout + - $TAG_NAME + +# Run goreleaser indirectly via a shell script +# to configure it properly. +- name: goreleaser/goreleaser:v0.138.0 + entrypoint: /bin/sh + dir: myClone + secretEnv: ['GITHUB_TOKEN'] + args: + - releasing/cloudbuild.sh + - $TAG_NAME + # - '--snapshot' + # Use this final arg in a local build, to suppress + # the release and leave the 'dist' directory in place. + +# golreleaser expects the GITHUB_TOKEN env var to hold the github token +# it needs to write the released package and notes back to github. +# The raw token was encrypted by gcloud kms (Key Management Service) +# The base64 of that is shown below. It's decrypted by cloud build +# and provided back to goreleaser. +secrets: +- kmsKeyName: projects/jregan-corp-gke-dev/locations/global/keyRings/kust-cloud-key-ring/cryptoKeys/kust-cloud-key-name + secretEnv: + GITHUB_TOKEN: CiQAwfbOkSP4tJf3ZJZMjzHaRPZ2RxiQhORZ3xxlVtpoy8631uQSUACk6WMKjtkpsRkRl+uxWUVvN29M5qveyXjaDDO094/qwsSc8RiYlHYt7Ii1bWkkz3P1kG0nHfG7Fd46A+GJ6R5NhmNfingd/nu9iKrNwLXK diff --git a/releasing/cloudbuild_api.yaml b/releasing/cloudbuild_api.yaml deleted file mode 100644 index 1b6824188..000000000 --- a/releasing/cloudbuild_api.yaml +++ /dev/null @@ -1,11 +0,0 @@ -steps: -- name: "gcr.io/cloud-builders/git" - args: [fetch, --tags, --depth=100] -- name: "goreleaser/goreleaser:v0.134.0" - entrypoint: /bin/sh - args: ["releasing/cloudbuild.sh", "api"] - secretEnv: ['GITHUB_TOKEN'] -secrets: -- kmsKeyName: projects/jregan-corp-gke-dev/locations/global/keyRings/kust-cloud-key-ring/cryptoKeys/kust-cloud-key-name - secretEnv: - GITHUB_TOKEN: CiQAwfbOkSP4tJf3ZJZMjzHaRPZ2RxiQhORZ3xxlVtpoy8631uQSUACk6WMKjtkpsRkRl+uxWUVvN29M5qveyXjaDDO094/qwsSc8RiYlHYt7Ii1bWkkz3P1kG0nHfG7Fd46A+GJ6R5NhmNfingd/nu9iKrNwLXK diff --git a/releasing/cloudbuild_kustomize.yaml b/releasing/cloudbuild_kustomize.yaml deleted file mode 100644 index 7692fcdf1..000000000 --- a/releasing/cloudbuild_kustomize.yaml +++ /dev/null @@ -1,11 +0,0 @@ -steps: -- name: "gcr.io/cloud-builders/git" - args: [fetch, --tags, --depth=100] -- name: "goreleaser/goreleaser:v0.134.0" - entrypoint: /bin/sh - args: ["releasing/cloudbuild.sh", "kustomize"] - secretEnv: ['GITHUB_TOKEN'] -secrets: -- kmsKeyName: projects/jregan-corp-gke-dev/locations/global/keyRings/kust-cloud-key-ring/cryptoKeys/kust-cloud-key-name - secretEnv: - GITHUB_TOKEN: CiQAwfbOkSP4tJf3ZJZMjzHaRPZ2RxiQhORZ3xxlVtpoy8631uQSUACk6WMKjtkpsRkRl+uxWUVvN29M5qveyXjaDDO094/qwsSc8RiYlHYt7Ii1bWkkz3P1kG0nHfG7Fd46A+GJ6R5NhmNfingd/nu9iKrNwLXK diff --git a/releasing/cloudbuild_pluginator.yaml b/releasing/cloudbuild_pluginator.yaml deleted file mode 100644 index c638b3495..000000000 --- a/releasing/cloudbuild_pluginator.yaml +++ /dev/null @@ -1,11 +0,0 @@ -steps: -- name: "gcr.io/cloud-builders/git" - args: [fetch, --tags, --depth=100] -- name: "goreleaser/goreleaser:v0.120.3" - entrypoint: /bin/sh - args: ["releasing/cloudbuild.sh", "pluginator"] - secretEnv: ['GITHUB_TOKEN'] -secrets: -- kmsKeyName: projects/jregan-corp-gke-dev/locations/global/keyRings/kust-cloud-key-ring/cryptoKeys/kust-cloud-key-name - secretEnv: - GITHUB_TOKEN: CiQAwfbOkSP4tJf3ZJZMjzHaRPZ2RxiQhORZ3xxlVtpoy8631uQSUACk6WMKjtkpsRkRl+uxWUVvN29M5qveyXjaDDO094/qwsSc8RiYlHYt7Ii1bWkkz3P1kG0nHfG7Fd46A+GJ6R5NhmNfingd/nu9iKrNwLXK diff --git a/releasing/localbuild.sh b/releasing/localbuild.sh index 9c07f1cc0..627288306 100755 --- a/releasing/localbuild.sh +++ b/releasing/localbuild.sh @@ -1,67 +1,33 @@ #!/bin/bash # -# To test the release process, this script attempts to -# use Google cloudbuild configuration to create a release -# locally. -# -# Usage: from the repo root, enter: -# -# module=kustomize -# module=pluginator # pick one -# module=api -# -# ./releasing/localbuild.sh $module -# +# To test the release process, this script attempts +# to use a Google cloudbuild configuration to create +# release artifacts locally. # # See https://cloud.google.com/cloud-build/docs/build-debug-locally # -# At the time of writing, +# Usage: from the repo root, enter: # -# https://pantheon.corp.google.com/cloud-build/triggers?project=jregan-corp-gke-dev +# ./releasing/localbuild.sh kustomize/v1.2.3 # -# has a trigger such that whenever a git tag is -# applied to the kustomize repo, the cloud builder -# reads the repository-relative file +# or some other valid tag value. # -# releasing/cloudbuild_${module}.yaml -# -# Inside this yaml file is a reference to the script -# -# releasing/cloudbuild.sh -# -# which runs goreleaser from the proper directory, with the -# proper config. -# -# The script you are reading now does something -# analogous via docker tricks. +# IMPORTANT: +# The process clones the repo at the given tag, +# so the repo must have the tag applied upstream. +# Either use an old tag, or disable the cloud build +# trigger so that a new testing tag can be applied +# without setting off a cloud build. set -e -module=$1 -case "$module" in - api) - ;; - kustomize) - ;; - pluginator) - ;; - *) - echo "Don't recognize module=$module" - exit 1 - ;; -esac - config=$(mktemp) -cp releasing/cloudbuild_${module}.yaml $config - -# Delete the cloud-builders/git step, which isn't needed -# for a local run. -sed -i '2,3d' $config +cp releasing/cloudbuild.yaml $config # Add the --snapshot flag to suppress the # github release and leave the build output # in the kustomize/dist directory. -sed -i 's|"\]$|", "--snapshot"]|' $config +sed -i "s|# - '--snapshot|- '--snapshot|" $config echo "Executing cloud-build-local with:" echo "=========================" @@ -70,10 +36,12 @@ echo "=========================" cloud-build-local \ --config=$config \ - --bind-mount-source \ + --substitutions=TAG_NAME=$1 \ --dryrun=false \ . +# --bind-mount-source \ + echo " " echo "Result of local build:" echo "##########################################"