diff --git a/Makefile b/Makefile index 4a04dbe2a12..318d50707df 100644 --- a/Makefile +++ b/Makefile @@ -151,18 +151,21 @@ PROTO_GO_OUTS = $(foreach name, $(PROTO_SRC_NAMES), go/vt/proto/$(name)/$(name). # This rule rebuilds all the go files from the proto definitions for gRPC. proto: $(PROTO_GO_OUTS) +docker-proto: + docker build -t proto-builder -f docker/proto/Dockerfile . + docker run --rm -v $(shell pwd)/go/vt/proto/:/go/vt/proto/ proto-builder + ifndef NOBANNER echo $$(date): Compiling proto definitions endif -# TODO(sougou): find a better way around this temp hack. -VTTOP=$(VTROOT)/../../.. $(PROTO_GO_OUTS): install_protoc-gen-go proto/*.proto for name in $(PROTO_SRC_NAMES); do \ - cd $(VTTOP)/src && \ - $(VTROOT)/bin/protoc --go_out=plugins=grpc:. -Ivitess.io/vitess/proto vitess.io/vitess/proto/$${name}.proto && \ - goimports -w $(VTROOT)/go/vt/proto/$${name}/$${name}.pb.go; \ + $(VTROOT)/bin/protoc --go_out=plugins=grpc:. -Iproto proto/$${name}.proto && \ + goimports -w vitess.io/vitess/go/vt/proto/$${name}/$${name}.pb.go; \ done + cp -Rf vitess.io/vitess/go/vt/proto/* go/vt/proto + rm -rf vitess.io/vitess/go/vt/proto/ # Helper targets for building Docker images. # Please read docker/README.md to understand the different available images. diff --git a/docker/proto/Dockerfile b/docker/proto/Dockerfile new file mode 100644 index 00000000000..96e8762da48 --- /dev/null +++ b/docker/proto/Dockerfile @@ -0,0 +1,38 @@ +FROM golang:1.14-buster + +# Install depedencies +RUN apt-get update && \ + DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + build-essential \ + ca-certificates \ + curl \ + unzip \ + wget + +ARG PROTOC_GEN_GO_VERSION=v1.3.2 + +# Need to set up a module in order to install a specific version of protoc-gen-go. +# 1. The `go get package@version` syntax is only supported in module mode. +# 2. In module mode, `go get` is unsupported outside of a module. +# These two things together force us to do this quick hack. +# +# See https://github.com/golang/go/issues/24250 as just one of many issues on the subject. +RUN mkdir proto-builder && \ + cd proto-builder && \ + go mod init proto-builder && \ + GO111MODULE=on go get \ + golang.org/x/tools/cmd/goimports \ + github.com/golang/protobuf/protoc-gen-go@${PROTOC_GEN_GO_VERSION} + +ARG PROTOC_VERSION=3.12.4 + +# Download protoc +RUN curl -LO https://github.com/protocolbuffers/protobuf/releases/download/v${PROTOC_VERSION}/protoc-${PROTOC_VERSION}-linux-x86_64.zip && \ + unzip protoc-${PROTOC_VERSION}-linux-x86_64.zip -d /protoc && \ + mv /protoc/bin/protoc /usr/local/bin/ && \ + rm -rf protoc-${PROTOC_VERSION}-linux-x86_64.zip + +ADD proto proto + +# Build proto/$x.proto files into /go/vt/proto/$x/$x.pb.go +CMD [ "./proto/build.sh" ] diff --git a/proto/build.sh b/proto/build.sh new file mode 100755 index 00000000000..3f5c2bd34cc --- /dev/null +++ b/proto/build.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +for file in proto/*.proto +do + name="$(basename "$file" | cut -d. -f1)" + + echo "Building $name.proto ..." + dir="vt/proto/$name" + mkdir -p "./$dir" && chmod 755 "./$dir" + + protoc --go_out=plugins=grpc:. -Iproto "proto/$name.proto" + mv "vitess.io/vitess/go/$dir/$name.pb.go" "./$dir/$name.pb.go" + goimports -w "./$dir/$name.pb.go" +done + +rm -rf vitess.io