From 6ce987b7029179ab294f6c49fbffe78a00257805 Mon Sep 17 00:00:00 2001 From: "Tim St. Clair" Date: Wed, 16 Nov 2016 17:28:35 -0800 Subject: [PATCH] Streamline release process --- Makefile | 2 +- build/build.sh | 37 +++++------------------ build/release.sh | 56 +++++++++++++++++++++++++++++++++++ docs/development/releasing.md | 26 ++++------------ 4 files changed, 70 insertions(+), 51 deletions(-) create mode 100755 build/release.sh diff --git a/Makefile b/Makefile index fd97f20e..d6b9b6b4 100644 --- a/Makefile +++ b/Makefile @@ -41,7 +41,7 @@ assets: release: @echo ">> building release binaries" - @RELEASE=true ./build/build.sh + @./build/release.sh docker: @docker build -t cadvisor:$(shell git rev-parse --short HEAD) -f deploy/Dockerfile . diff --git a/build/build.sh b/build/build.sh index 7263bc74..e01c7fce 100755 --- a/build/build.sh +++ b/build/build.sh @@ -16,40 +16,19 @@ set -e -RELEASE=${RELEASE:-false} # Whether to build for an official release. GO_FLAGS=${GO_FLAGS:-} # Extra go flags to use in the build. +GO_CMD=${GO_CMD:-"install"} +BUILD_USER=${BUILD_USER:-"${USER}@${HOSTNAME}"} +BUILD_DATE=${BUILD_DATE:-$( date +%Y%m%d-%H:%M:%S )} +VERBOSE=${VERBOSE:-} repo_path="github.com/google/cadvisor" version=$( git describe --tags --dirty --abbrev=14 | sed -E 's/-([0-9]+)-g/.\1+/' ) revision=$( git rev-parse --short HEAD 2> /dev/null || echo 'unknown' ) branch=$( git rev-parse --abbrev-ref HEAD 2> /dev/null || echo 'unknown' ) -build_user="${USER}@${HOSTNAME}" -build_date=$( date +%Y%m%d-%H:%M:%S ) go_version=$( go version | sed -e 's/^[^0-9.]*\([0-9.]*\).*/\1/' ) -GO_CMD="install" - -if [ "$RELEASE" == "true" ]; then - # Only allow releases of tagged versions. - TAGGED='^v[0-9]+\.[0-9]+\.[0-9]+(-(alpha|beta)[0-9]*)?$' - if [[ ! "$version" =~ $TAGGED ]]; then - echo "Error: Only tagged versions are allowed for releases" >&2 - echo "Found: $version" >&2 - exit 1 - fi - - # Don't include hostname with release builds - if ! build_user="$(git config --get user.email)"; then - echo "Error: git user not set, use:" - echo "git config user.email " - exit 1 - fi - build_date=$( date +%Y%m%d ) # Release date is only to day-granularity - - # Don't use cached build objects for releases. - GO_CMD="build" -fi # go 1.4 requires ldflags format to be "-X key value", not "-X key=value" ldseparator="=" @@ -62,14 +41,14 @@ ldflags=" -X ${repo_path}/version.Version${ldseparator}${version} -X ${repo_path}/version.Revision${ldseparator}${revision} -X ${repo_path}/version.Branch${ldseparator}${branch} - -X ${repo_path}/version.BuildUser${ldseparator}${build_user} - -X ${repo_path}/version.BuildDate${ldseparator}${build_date} + -X ${repo_path}/version.BuildUser${ldseparator}${BUILD_USER} + -X ${repo_path}/version.BuildDate${ldseparator}${BUILD_DATE} -X ${repo_path}/version.GoVersion${ldseparator}${go_version}" echo ">> building cadvisor" -if [ "$RELEASE" == "true" ]; then - echo "Building release candidate with -ldflags $ldflags" +if [ -n "$VERBOSE" ]; then + echo "Building with -ldflags $ldflags" fi GOBIN=$PWD go "$GO_CMD" ${GO_FLAGS} -ldflags "${ldflags}" "${repo_path}" diff --git a/build/release.sh b/build/release.sh new file mode 100755 index 00000000..fba1527a --- /dev/null +++ b/build/release.sh @@ -0,0 +1,56 @@ +#!/usr/bin/env bash + +# Copyright 2015 Google Inc. All rights reserved. +# +# 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 -e + +VERSION=$( git describe --tags --dirty --abbrev=14 | sed -E 's/-([0-9]+)-g/.\1+/' ) +# Only allow releases of tagged versions. +TAGGED='^v[0-9]+\.[0-9]+\.[0-9]+(-(alpha|beta)[0-9]*)?$' +if [[ ! "$VERSION" =~ $TAGGED ]]; then + echo "Error: Only tagged versions are allowed for releases" >&2 + echo "Found: $VERSION" >&2 + exit 1 +fi + +# Don't include hostname with release builds +if ! git_user="$(git config --get user.email)"; then + echo "Error: git user not set, use:" + echo "git config user.email " + exit 1 +fi + +# Build the release. +export BUILD_USER="$git_user" +export BUILD_DATE=$( date +%Y%m%d ) # Release date is only to day-granularity +export GO_CMD="build" # Don't use cached build objects for releases. +export VERBOSE=true +build/build.sh + +# Build the docker image +echo ">> building cadvisor docker image" +docker_tag="google/cadvisor:$VERSION" +gcr_tag="gcr.io/google_containers/cadvisor:$VERSION" +docker build -t $docker_tag -t $gcr_tag -f deploy/Dockerfile . + +echo +echo "Release info:" +echo "VERSION=$VERSION" +sha1sum --tag cadvisor +md5sum --tag cadvisor +echo "docker image: $docker_tag" +echo "gcr.io image: $gcr_tag" + +exit 0 diff --git a/docs/development/releasing.md b/docs/development/releasing.md index b8f73242..29d9e558 100644 --- a/docs/development/releasing.md +++ b/docs/development/releasing.md @@ -47,28 +47,11 @@ Command: `make release` - Try to build it from the release branch, since we include that in the binary version - Verify the ldflags output, in particular check the Version, BuildUser, and GoVersion are expected -Once the build is complete, record the sh1 and md5 hashes: +Once the build is complete, check the VERSION and note the sha1 and md5 hashes. -``` -$ sha1sum cadvisor -$ md5sum cadvisor -``` - -Update the github release by uploading the release binary, and filling in the hashes. - -## 4. Build & push the Docker images - -``` -$ VERSION=v0.23.1  # Example -$ docker build -t google/cadvisor:$VERSION -f deploy/Dockerfile . -... -Successfully built a811aa33809f -$ docker tag google/cadvisor:$VERSION \ - gcr.io/google_containers/cadvisor:$VERSION -``` - -### 4.a Push to Docker Hub +## 4. Push the Docker images +Docker Hub: ``` $ docker login Username: **** @@ -77,7 +60,7 @@ $ docker push google/cadvisor:$VERSION $ docker logout # Good practice with shared account ``` -### 4.b Push to Google Container Registry +Google Container Registry: ``` $ gcloud auth login @@ -100,6 +83,7 @@ Go to https://github.com/google/cadvisor/releases and click "Draft a new release - Body should start with release notes (from CHANGELOG.md) - Next is the Docker image: `google/cadvisor:$VERSION` - Next are the binary hashes (from step 3) +- Upload the binary build in step 3 - If this is an alpha or beta release, mark the release as a "pre-release" - Click publish when done