From e47ab0e246f9488af61336e73a7f397384bb53d0 Mon Sep 17 00:00:00 2001 From: zpencer Date: Tue, 24 Jul 2018 08:28:00 -0700 Subject: [PATCH] channelz: add code gen scripts for OSS (#302) Build a self contained channelz.js from a channelz.proto. Running buildscripts/channelz_codgen.sh will produce a web/channelzui/src/assets/channelz.js that reflects the SHA specified in the scripts. The script fetches grpc/grpc-web to get the prereq docker image, does some additional setup, and then runs the code gen script. --- grpc-zpages/buildscripts/channelz_codgen.sh | 26 +++++++++++++ grpc-zpages/docker/codegen/Dockerfile | 10 +++++ .../docker/codegen/shared_dir/.gitkeep | 0 .../shared_dir/scripts/gen_channelz_pb.sh | 37 +++++++++++++++++++ 4 files changed, 73 insertions(+) create mode 100755 grpc-zpages/buildscripts/channelz_codgen.sh create mode 100644 grpc-zpages/docker/codegen/Dockerfile create mode 100644 grpc-zpages/docker/codegen/shared_dir/.gitkeep create mode 100755 grpc-zpages/docker/codegen/shared_dir/scripts/gen_channelz_pb.sh diff --git a/grpc-zpages/buildscripts/channelz_codgen.sh b/grpc-zpages/buildscripts/channelz_codgen.sh new file mode 100755 index 0000000..cf925f9 --- /dev/null +++ b/grpc-zpages/buildscripts/channelz_codgen.sh @@ -0,0 +1,26 @@ +#!/bin/bash +set -eu -o pipefail + +# Check out a known good SHA for reproducibility +readonly GRPC_WEB_SHA=6357fa78f36d2e08636612f281250b31f28ae6ec + +readonly GRPC_ZPAGES_DIR="$(cd "$(dirname "$0")"/.. && pwd)" +readonly GITHUB_DIR="$GRPC_ZPAGES_DIR"/buildscripts/github/ + +if [[ ! -d "$GITHUB_DIR"/grpc-web ]]; then + mkdir -p "$GITHUB_DIR" + cd "$GITHUB_DIR" + git clone https://github.com/grpc/grpc-web.git + cd grpc-web/ + git checkout "$GRPC_WEB_SHA" +fi + +cd "$GITHUB_DIR"/grpc-web//net/grpc/gateway/docker +docker build -t channelz_grpc_web_prereqs ./prereqs/ + +cd "$GRPC_ZPAGES_DIR"/docker +docker build -t channelz_codegen codegen + +docker run --rm -v "$GRPC_ZPAGES_DIR"/docker/codegen/shared_dir:/shared_dir/ channelz_codegen /shared_dir/scripts/gen_channelz_pb.sh + +mv "$GRPC_ZPAGES_DIR"/docker/codegen/shared_dir/gen_out/channelz.js "$GRPC_ZPAGES_DIR"/web/channelzui/src/assets/channelz.js diff --git a/grpc-zpages/docker/codegen/Dockerfile b/grpc-zpages/docker/codegen/Dockerfile new file mode 100644 index 0000000..ae3177c --- /dev/null +++ b/grpc-zpages/docker/codegen/Dockerfile @@ -0,0 +1,10 @@ +FROM channelz_grpc_web_prereqs:latest + +RUN cd /github/grpc-web/javascript/net/grpc/web/ && make + +RUN cd /github/grpc-web && \ + curl http://dl.google.com/closure-compiler/compiler-latest.zip \ + -o compiler-latest.zip && \ + rm -f closure-compiler.jar && \ + unzip -p -qq -o compiler-latest.zip *.jar > closure-compiler.jar + diff --git a/grpc-zpages/docker/codegen/shared_dir/.gitkeep b/grpc-zpages/docker/codegen/shared_dir/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/grpc-zpages/docker/codegen/shared_dir/scripts/gen_channelz_pb.sh b/grpc-zpages/docker/codegen/shared_dir/scripts/gen_channelz_pb.sh new file mode 100755 index 0000000..cd3a9fe --- /dev/null +++ b/grpc-zpages/docker/codegen/shared_dir/scripts/gen_channelz_pb.sh @@ -0,0 +1,37 @@ +#!/bin/bash +set -eu -o pipefail + +readonly GRPC_PROTO_SHA=91d19ac45f696816df5f1547cacaa201280cdc68 +readonly SHARED_DIR="$(cd "$(dirname "$0")"/.. && pwd)" + +mkdir -p /github +cd /github/ +git clone https://github.com/grpc/grpc-proto.git +cd /github/grpc-proto +git checkout "$GRPC_PROTO_SHA" + +readonly WORKSPACE="/workspace" +mkdir -p "$WORKSPACE" + +# Run protoc and generate .js for msg types +protoc -I=/github/grpc-proto/grpc/channelz/v1/ --js_out=import_style=closure,binary:"$WORKSPACE" channelz.proto +protoc -I=/github/grpc-web/third_party/grpc/third_party/protobuf/src/ --js_out=import_style=closure,binary:"$WORKSPACE" google/protobuf/any.proto google/protobuf/duration.proto google/protobuf/timestamp.proto google/protobuf/wrappers.proto + +# Run protoc with grpc-web plugin to generate client +protoc -I=/github/grpc-proto/grpc/channelz/v1/ --plugin=protoc-gen-grpc-web=/github/grpc-web/javascript/net/grpc/web/protoc-gen-grpc-web --grpc-web_out=out=channelz.grpc.pb.js,mode=grpcweb:"$WORKSPACE" channelz.proto + +# Run closure compiler to produce a self contained .js file +mkdir -p "$SHARED_DIR"/gen_out/ +java \ + -jar /github/grpc-web/closure-compiler.jar \ + --js "$WORKSPACE" \ + --js /github/grpc-web/javascript \ + --js /github/grpc-web/net \ + --js /github/grpc-web/third_party/closure-library \ + --js /github/grpc-web/third_party/grpc/third_party/protobuf/js \ + --entry_point=goog:proto.grpc.channelz.v1.ChannelzClient \ + --entry_point=goog:proto.grpc.channelz.v1.SocketOptionTimeout \ + --entry_point=goog:proto.grpc.channelz.v1.SocketOptionLinger \ + --entry_point=goog:proto.grpc.channelz.v1.SocketOptionTcpInfo \ + --dependency_mode=STRICT \ + --js_output_file "$SHARED_DIR"/gen_out/channelz.js