| #!/bin/bash |
| # Copyright 2017 The Go Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style |
| # license that can be found in the LICENSE file. |
| |
| # build.release builds and publishes a new Go+BoringCrypto release. |
| # After running this script, the change to the RELEASES file should be |
| # sent out for review and committed to the repository (but the release |
| # is already done, so there's not much to review). |
| |
| set -e |
| |
| case "$#" in |
| 0) |
| rev=HEAD;; |
| 1) |
| rev="$1";; |
| *) |
| echo 'usage: build.release [git-rev]' >&2 |
| exit 2 |
| esac |
| |
| # Determine commit to use. |
| commit=$(git rev-parse "$rev" | awk '{print substr($1, 1, 12)}') |
| if [ "$commit" = "" ]; then |
| echo 'cannot find commit in git history' >&2 |
| exit 2 |
| fi |
| |
| # Determine base Go release from tags. |
| base=$(git log --decorate=short --oneline "$rev" | grep 'tag: go' | sed 1q | sed 's/[),].*//; s/.*tag: //') |
| if [ "$base" = "" ]; then |
| echo "cannot find go release tag in git history for $rev" >&2 |
| exit 2 |
| fi |
| |
| # Determine boring crypto version from file. |
| boring=$(git show "$commit:misc/boring/VERSION") |
| if [ "$boring" = "" ]; then |
| echo "missing BORINGVERSION file in $commit" >&2 |
| exit 2 |
| fi |
| |
| # Make sure we're not redefining a published release. |
| version="${base}b${boring}" |
| if grep "^$version " RELEASES >/dev/null; then |
| echo "found $version in RELEASES - not rereleasing" >&2 |
| exit 2 |
| fi |
| |
| # Show what's going on, while the release builds. |
| # Good time for user to type ^C if something is wrong. |
| echo >&2 |
| echo "building $version from $commit" >&2 |
| echo >&2 |
| git log -n1 "$commit" >&2 |
| echo >&2 |
| |
| # Build the release tool in a temporary directory. |
| dir=$(mktemp -d) |
| trap "rm -rf $dir" EXIT |
| GOBIN="$dir" go install golang.org/x/build/cmd/release@latest |
| |
| # Build the release. |
| sha() { |
| if hash sha256sum 2>/dev/null; then |
| sha256sum "$@" |
| else |
| shasum -a 256 "$@" |
| fi |
| } |
| shortgo=$(echo "$base" | perl -pe 's/(go\d+\.\d+)(\.\d+|rc\d+)/$1/') |
| $dir/release -target linux-amd64 -rev "$commit" -version "$version" -skip_long_tests |
| $dir/release -target src -rev "$commit" -version "$version" |
| output="$version.linux-amd64.tar.gz" |
| ls -l "$output" |
| sha256=$(sha "$output" | awk '{print $1}') |
| outputsrc="$version.src.tar.gz" |
| ls -l "$outputsrc" |
| sha256src=$(sha "$outputsrc" | awk '{print $1}') |
| |
| trap "rm -f /tmp/go.release.$$ /tmp/go.nm.$$" EXIT |
| tar -xzf "$output" -O go/bin/go >/tmp/go.release.$$ |
| go tool nm /tmp/go.release.$$ >/tmp/go.nm.$$ |
| if ! grep crypto/internal/boring/sig.BoringCrypto /tmp/go.nm.$$ >/dev/null; then |
| echo 'built release but did NOT find sig.BoringCrypto in go command!' >&2 |
| exit 2 |
| fi |
| if egrep 'crypto/sha256\.\(\*digest\)' /tmp/go.nm.$$ >/dev/null; then |
| echo 'built release but DID find sha256.(*digest) in go command unexpectedly!' >&2 |
| exit 2 |
| fi |
| |
| # Publish the release. |
| gsutil cp "$output" gs://go-boringcrypto/ |
| url="https://go-boringcrypto.storage.googleapis.com/$output" |
| gsutil cp "$outputsrc" gs://go-boringcrypto/ |
| urlsrc="https://go-boringcrypto.storage.googleapis.com/$outputsrc" |
| |
| # Record that it was published. |
| echo "$version $commit linux-amd64 $url $sha256" >>RELEASES |
| echo "$version $commit src $urlsrc $sha256src" >>RELEASES |