blob: aa58b772f4a2b698fe94454732983c968ca03725 [file] [log] [blame]
#!/usr/bin/env bash
set -e
readonly PROTOC_VER="3.12.3"
readonly PROTOC_ARCHIVE="protoc-${PROTOC_VER}-linux-$( uname -m ).zip"
readonly PROTOC_URL="https://github.com/protocolbuffers/protobuf/releases/download/v${PROTOC_VER}/${PROTOC_ARCHIVE}"
readonly PROTOC_GEN_GO_VER="1.25.0"
readonly PROTOC_GEN_GO_ARCHIVE="protoc-gen-go.v${PROTOC_GEN_GO_VER}.linux.amd64.tar.gz"
readonly PROTOC_GEN_GO_URL="https://github.com/protocolbuffers/protobuf-go/releases/download/v${PROTOC_GEN_GO_VER}/${PROTOC_GEN_GO_ARCHIVE}"
readonly PROTOC_GEN_GO_GRPC_VER="v1.30.0"
readonly PROTOC_GEN_GO_GRPC_REPO_URL="https://github.com/grpc/grpc-go"
readonly GRPC_ECOSYSTEM_VER="v1.14.6"
readonly GRPC_ECOSYSTEM_URL="https://github.com/grpc-ecosystem/grpc-gateway/releases/download/${GRPC_ECOSYSTEM_VER}"
readonly PROTOC_GEN_SWAGGER_BIN="protoc-gen-swagger-${GRPC_ECOSYSTEM_VER}-linux-$( uname -m )"
readonly PROTOC_GEN_SWAGGER_URL="${GRPC_ECOSYSTEM_URL}/${PROTOC_GEN_SWAGGER_BIN}"
readonly PROTOC_GEN_GRPC_GATEWAY_BIN="protoc-gen-grpc-gateway-${GRPC_ECOSYSTEM_VER}-linux-$( uname -m )"
readonly PROTOC_GEN_GRPC_GATEWAY_URL="${GRPC_ECOSYSTEM_URL}/${PROTOC_GEN_GRPC_GATEWAY_BIN}"
readonly DEFAULT_DEST="/usr/local"
get() {
local url="$1"
local dest="$2"
if [[ -w $dest ]]
then
wget --quiet "$url" -O "$dest"
else
sudo wget --quiet "$url" -O "$dest"
fi
}
install_bin() {
local dest_dir="${1}/bin"
local source_bin="$2"
local source_url="$3"
local target_bin="$4"
local auth
if [[ ! -w $dest_dir ]]
then
auth="sudo"
fi
[ -d "${dest_dir}" ] || $auth mkdir -p "${dest_dir}"
get "$source_url" "${dest_dir}/$source_bin"
$auth chmod +x "${dest_dir}/$source_bin"
$auth ln -s -f "${dest_dir}/${source_bin}" "${dest_dir}/$target_bin"
echo "installed $source_bin to ${dest_dir}/${target_bin}"
}
install_protoc() {
local dest="$1"
local output="${dest}/protoc-${PROTOC_VER}"
local tmpfile auth
tmpfile="$( mktemp )"
get "$PROTOC_URL" "$tmpfile"
if [[ ! -w $dest ]]
then
auth="sudo"
fi
$auth unzip -qq -o -d "$output" "$tmpfile"
rm -rf "$tmpfile"
[ -d "${dest}/bin" ] || $auth mkdir "${dest}/bin"
$auth ln -s -f "${output}/bin/protoc" "${dest}/bin/protoc"
echo "installed protoc v$PROTOC_VER to ${dest}/bin/protoc"
}
install_protoc_gen_go() {
local dest="$1"
local tmpfile auth
tmpfile="$( mktemp )"
get "$PROTOC_GEN_GO_URL" "$tmpfile"
if [[ ! -w $dest ]]
then
auth="sudo"
fi
$auth tar -xzf "$tmpfile" -C "${dest}"
rm -rf "$tmpfile"
[ -d "${dest}/bin" ] || $auth mkdir "${dest}/bin"
$auth ln -s -f "${dest}/protoc-gen-go" "${dest}/bin/protoc-gen-go"
echo "installed protoc-gen-go v${PROTOC_GEN_GO_VER} to ${dest}/bin/protoc-gen-go"
}
# TODO Switch to binary once https://github.com/grpc/grpc.io/issues/298 is resolved
install_protoc_gen_go_grpc() {
local parent_dir="$( go env GOPATH )/src/github.com/grpc"
local checkout_dir="${parent_dir}/grpc-go"
rm -rf ${checkout_dir}
mkdir -p ${parent_dir}
cd ${parent_dir}
git clone --quiet -c advice.detachedHead=false -b ${PROTOC_GEN_GO_GRPC_VER} ${PROTOC_GEN_GO_GRPC_REPO_URL}
cd grpc-go/cmd/protoc-gen-go-grpc
go install .
echo "installed protoc-gen-go-grpc v$PROTOC_VER"
}
install_protoc_gen_swagger() {
local dest="$1"
install_bin \
"$dest"\
"$PROTOC_GEN_SWAGGER_BIN"\
"$PROTOC_GEN_SWAGGER_URL"\
"protoc-gen-swagger"
}
install_protoc_gen_grpc_gateway() {
local dest="$1"
install_bin \
"$dest"\
"$PROTOC_GEN_GRPC_GATEWAY_BIN"\
"$PROTOC_GEN_GRPC_GATEWAY_URL"\
"protoc-gen-grpc-gateway"
}
main() {
local dest="${1:-$DEFAULT_DEST}"
install_protoc "$dest"
install_protoc_gen_go "$dest"
install_protoc_gen_go_grpc
install_protoc_gen_swagger "$dest"
install_protoc_gen_grpc_gateway "$dest"
}
main "$@"