blob: 345ad9690fb928368f7c88e5d922c2e7ae4d0ecd [file] [log] [blame]
#!/bin/bash
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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.
# This script sets the go version used by all Beam SDK scripts.
# It requires an existing Go installation 1.16 or greater on the system, which
# will be used to download specific versions of Go.
#
# Accepts the following require flag:
# --version -> A string for a fully qualified go version, eg go1.16.5 or go1.18beta1
# The list of available versions are at https://go.dev/dl/
set -e
# The specific Go version used by default for Beam infrastructure.
#
# This variable is also used as the execution command downscript.
# The list of downloadable versions are at https://go.dev/dl/
GOVERS="invalid"
if ! command -v go &> /dev/null
then
echo "go could not be found. This script requires a go installation > 1.16 to bootstrap using specific go versions. See http://go.dev/doc/install for options."
exit 1
fi
# Versions of Go > 1.16 can download arbitrary versions of go.
# We take advantage of this to avoid changing the user's
# installation of go ourselves, and allow for hermetic reproducible
# builds when relying on Gradle, like Jenkins does.
MINGOVERSION="go1.16.0"
# Compare the go version by sorting only by the version string, getting the
# oldest version, and checking if it contains "min". When it doesn't, it's
# the go print out, and it means the system version is later than the minimum.
if (echo "min version $MINGOVERSION os/arch"; go version) | sort -Vk3 -s |tail -1 | grep -q min;
then
# Outputing the system Go version for debugging purposes.
echo "System Go installation at `which go` is `go version`, is older than the minimum required for hermetic, reproducible Beam builds. Want $MINGOVERSION. See http://go.dev/doc/install for installation instructions.";
exit 1
fi
while [[ $# -gt 0 ]]
do
key="$1"
case $key in
--version)
GOVERS="$2"
shift # past argument
shift # past value
;;
*) # unknown args
echo "prepare_go_version requires the --version flag. See https://go.dev/dl/ for available versions."
exit 1
;;
esac
done
GOPATH=`go env GOPATH`
GOBIN=$GOPATH/bin
GOHOSTOS=`go env GOHOSTOS`
GOHOSTARCH=`go env GOHOSTARCH`
echo "System Go installation: `which go` is `go version`; Preparing to use $GOBIN/$GOVERS"
# Ensure it's installed in the GOBIN directory, using the local host platform.
GOOS=$GOHOSTOS GOARCH=$GOHOSTARCH GOBIN=$GOBIN go install golang.org/dl/$GOVERS@latest
# The download command isn't concurrency safe so prepare should be done at most once
# per gogradle chain.
$GOBIN/$GOVERS download
export GOCMD=$GOBIN/$GOVERS
echo "GOCMD=$GOCMD"