From c749f5aa33f2c3ae14668ec25a0a146011520ff6 Mon Sep 17 00:00:00 2001 From: Tom Wilkie Date: Tue, 8 Dec 2015 11:36:47 +0000 Subject: [PATCH 1/2] Merge probe and app binaries, run with ./scope probe or ./scope app. --- .gitignore | 8 ++------ Makefile | 20 ++++++++------------ circle.yml | 4 ++-- docker/Dockerfile | 2 +- docker/run-app | 2 +- docker/run-probe | 2 +- prog/app/main.go | 9 ++++++--- prog/main.go | 32 ++++++++++++++++++++++++++++++++ prog/probe/main.go | 9 ++++++--- 9 files changed, 59 insertions(+), 29 deletions(-) create mode 100644 prog/main.go diff --git a/.gitignore b/.gitignore index c3f4fbd0d..e26d5efa0 100644 --- a/.gitignore +++ b/.gitignore @@ -34,12 +34,8 @@ coverage.html .*.uptodate scope.tar scope_ui_build.tar -prog/app/app -prog/app/scope-app -prog/probe/probe -prog/probe/scope-probe -docker/scope-app -docker/scope-probe +prog/scope +docker/scope docker/docker* docker/weave docker/runsvinit diff --git a/Makefile b/Makefile index 3bc6d1f4d..1497fb15d 100644 --- a/Makefile +++ b/Makefile @@ -3,9 +3,7 @@ # If you can use Docker without being root, you can `make SUDO= ` SUDO=sudo -E DOCKERHUB_USER=weaveworks -APP_EXE=prog/app/scope-app -PROBE_EXE=prog/probe/scope-probe -FIXPROBE_EXE=experimental/fixprobe/fixprobe +SCOPE_EXE=prog/scope SCOPE_IMAGE=$(DOCKERHUB_USER)/scope SCOPE_EXPORT=scope.tar SCOPE_UI_BUILD_IMAGE=$(DOCKERHUB_USER)/scope-ui-build @@ -30,24 +28,22 @@ docker/weave: curl -L git.io/weave -o docker/weave chmod u+x docker/weave -$(SCOPE_EXPORT): $(APP_EXE) $(PROBE_EXE) $(DOCKER_DISTRIB) docker/weave $(RUNSVINIT) docker/Dockerfile docker/run-app docker/run-probe docker/entrypoint.sh - cp $(APP_EXE) $(PROBE_EXE) $(RUNSVINIT) docker/ +$(SCOPE_EXPORT): $(SCOPE_EXE) $(DOCKER_DISTRIB) docker/weave $(RUNSVINIT) docker/Dockerfile docker/run-app docker/run-probe docker/entrypoint.sh + cp $(SCOPE_EXE) $(RUNSVINIT) docker/ cp $(DOCKER_DISTRIB) docker/docker.tgz $(SUDO) docker build -t $(SCOPE_IMAGE) docker/ $(SUDO) docker save $(SCOPE_IMAGE):latest > $@ $(RUNSVINIT): vendor/runsvinit/*.go -$(APP_EXE): app/*.go render/*.go report/*.go xfer/*.go common/sanitize/*.go prog/app/*.go prog/app/static.go - -$(PROBE_EXE): prog/probe/*.go $(shell find probe/ -type f -name *.go) report/*.go xfer/*.go common/sanitize/*.go common/exec/*.go +$(SCOPE_EXE): $(shell find ./ -type f -name *.go) prog/app/static.go ifeq ($(BUILD_IN_CONTAINER),true) -$(APP_EXE) $(PROBE_EXE) $(RUNSVINIT): $(SCOPE_BACKEND_BUILD_UPTODATE) +$(SCOPE_EXE) $(RUNSVINIT): $(SCOPE_BACKEND_BUILD_UPTODATE) $(SUDO) docker run $(RM) $(RUN_FLAGS) -v $(shell pwd):/go/src/github.com/weaveworks/scope -e GOARCH -e GOOS \ $(SCOPE_BACKEND_BUILD_IMAGE) SCOPE_VERSION=$(SCOPE_VERSION) $@ else -$(APP_EXE) $(PROBE_EXE): $(SCOPE_BACKEND_BUILD_UPTODATE) +$(SCOPE_EXE): $(SCOPE_BACKEND_BUILD_UPTODATE) go build -ldflags "-extldflags \"-static\" -X main.version=$(SCOPE_VERSION)" -tags netgo -o $@ ./$(@D) @strings $@ | grep cgo_stub\\\.go >/dev/null || { \ rm $@; \ @@ -65,7 +61,7 @@ endif static: prog/app/static.go prog/app/static.go: client/build/app.js - esc -o $@ -prefix client/build client/build + esc -o $@ -prefix client/build -pkg app client/build ifeq ($(BUILD_IN_CONTAINER),true) client/build/app.js: $(shell find client/app/scripts -type f) $(SCOPE_UI_BUILD_UPTODATE) @@ -105,7 +101,7 @@ clean: go clean ./... $(SUDO) docker rmi $(SCOPE_UI_BUILD_IMAGE) $(SCOPE_BACKEND_BUILD_IMAGE) >/dev/null 2>&1 || true rm -rf $(SCOPE_EXPORT) $(SCOPE_UI_BUILD_UPTODATE) $(SCOPE_BACKEND_BUILD_UPTODATE) \ - $(APP_EXE) $(PROBE_EXE) $(RUNSVINIT) client/build/app.js docker/weave + $(SCOPE_EXE) $(RUNSVINIT) prog/app/static.go client/build/app.js docker/weave ifeq ($(BUILD_IN_CONTAINER),true) tests: $(SCOPE_BACKEND_BUILD_UPTODATE) diff --git a/circle.yml b/circle.yml index db3225a4a..f86fa75e9 100644 --- a/circle.yml +++ b/circle.yml @@ -39,9 +39,9 @@ test: parallel: true - cd $SRCDIR; make RM= static: parallel: true - - cd $SRCDIR; rm -f prog/app/scope-app prog/probe/scope-probe; if [ "$CIRCLE_NODE_INDEX" = "0" ]; then GOARCH=arm make RM= prog/app/scope-app prog/probe/scope-probe; else GOOS=darwin make RM= prog/app/scope-app prog/probe/scope-probe; fi: + - cd $SRCDIR; rm -f prog/scope; if [ "$CIRCLE_NODE_INDEX" = "0" ]; then GOARCH=arm make RM= prog/scope; else GOOS=darwin make RM= prog/scope; fi: parallel: true - - cd $SRCDIR; rm -f prog/app/scope-app prog/probe/scope-probe; make RM=: + - cd $SRCDIR; rm -f prog/scope; make RM=: parallel: true - cd $SRCDIR/experimental; ./build_on_circle.sh: parallel: true diff --git a/docker/Dockerfile b/docker/Dockerfile index c794b56ce..8744813df 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -7,7 +7,7 @@ RUN echo "http://dl-4.alpinelinux.org/alpine/edge/testing" >>/etc/apk/repositori rm -rf /var/cache/apk/* ADD ./docker.tgz / ADD ./weave /usr/bin/ -COPY ./scope-app ./scope-probe ./runsvinit ./entrypoint.sh /home/weave/ +COPY ./scope ./runsvinit ./entrypoint.sh /home/weave/ COPY ./run-app /etc/service/app/run COPY ./run-probe /etc/service/probe/run EXPOSE 4040 diff --git a/docker/run-app b/docker/run-app index b5542a862..b3caffc51 100755 --- a/docker/run-app +++ b/docker/run-app @@ -1,3 +1,3 @@ #!/bin/sh -exec /home/weave/scope-app $(cat /etc/weave/scope-app.args) +exec /home/weave/scope app $(cat /etc/weave/scope-app.args) diff --git a/docker/run-probe b/docker/run-probe index 517a3f518..ef8022c9b 100755 --- a/docker/run-probe +++ b/docker/run-probe @@ -1,3 +1,3 @@ #!/bin/sh -exec /home/weave/scope-probe $(cat /etc/weave/scope-probe.args) $(cat /etc/weave/apps) +exec /home/weave/scope probe $(cat /etc/weave/scope-probe.args) $(cat /etc/weave/apps) diff --git a/prog/app/main.go b/prog/app/main.go index 6c6bc709a..7242392ac 100644 --- a/prog/app/main.go +++ b/prog/app/main.go @@ -1,4 +1,4 @@ -package main +package app import ( "flag" @@ -6,11 +6,13 @@ import ( "log" "math/rand" "net/http" - _ "net/http/pprof" "strconv" "strings" "time" + // a blank import should be only in a main or test package, or have a comment justifying it + _ "net/http/pprof" + "github.com/gorilla/mux" "github.com/weaveworks/weave/common" @@ -28,7 +30,8 @@ func Router(c app.Collector) *mux.Router { return router } -func main() { +// Main runs the app +func Main() { var ( window = flag.Duration("window", 15*time.Second, "window") listen = flag.String("http.address", ":"+strconv.Itoa(xfer.AppPort), "webserver listen address") diff --git a/prog/main.go b/prog/main.go new file mode 100644 index 000000000..059679474 --- /dev/null +++ b/prog/main.go @@ -0,0 +1,32 @@ +package main + +import ( + "fmt" + "os" + + "github.com/weaveworks/scope/prog/app" + "github.com/weaveworks/scope/prog/probe" +) + +func usage() { + fmt.Printf("usage: %s (app|probe) args...\n", os.Args[0]) + os.Exit(1) +} + +func main() { + if len(os.Args) < 2 { + usage() + } + + module := os.Args[1] + os.Args = append([]string{os.Args[0]}, os.Args[2:]...) + + switch module { + case "app": + app.Main() + case "probe": + probe.Main() + default: + usage() + } +} diff --git a/prog/probe/main.go b/prog/probe/main.go index ee102ed75..b684d1d25 100644 --- a/prog/probe/main.go +++ b/prog/probe/main.go @@ -1,4 +1,4 @@ -package main +package probe import ( "flag" @@ -7,12 +7,14 @@ import ( "math/rand" "net" "net/http" - _ "net/http/pprof" "os" "strconv" "strings" "time" + // a blank import should be only in a main or test package, or have a comment justifying it + _ "net/http/pprof" + "github.com/armon/go-metrics" "github.com/weaveworks/weave/common" @@ -31,7 +33,8 @@ import ( var version = "dev" // set at build time -func main() { +// Main runs the probe +func Main() { var ( targets = []string{fmt.Sprintf("localhost:%d", xfer.AppPort), fmt.Sprintf("scope.weave.local:%d", xfer.AppPort)} token = flag.String("token", "default-token", "probe token") From 949ae6f8070c24ecfa17be4da5062bae2f155ead Mon Sep 17 00:00:00 2001 From: Tom Wilkie Date: Wed, 9 Dec 2015 12:45:13 +0000 Subject: [PATCH 2/2] Review feedback --- .gitignore | 2 +- Makefile | 10 +++++----- prog/{app/main.go => app.go} | 12 +++++------- prog/main.go | 9 +++------ prog/{probe/main.go => probe.go} | 8 +++----- 5 files changed, 17 insertions(+), 24 deletions(-) rename prog/{app/main.go => app.go} (86%) rename prog/{probe/main.go => probe.go} (97%) diff --git a/.gitignore b/.gitignore index e26d5efa0..f5ff4aab1 100644 --- a/.gitignore +++ b/.gitignore @@ -51,4 +51,4 @@ experimental/_integration/_integration *sublime-workspace *npm-debug.log app/static.go -prog/app/static.go +prog/static.go diff --git a/Makefile b/Makefile index 1497fb15d..dfe9cf348 100644 --- a/Makefile +++ b/Makefile @@ -36,7 +36,7 @@ $(SCOPE_EXPORT): $(SCOPE_EXE) $(DOCKER_DISTRIB) docker/weave $(RUNSVINIT) docker $(RUNSVINIT): vendor/runsvinit/*.go -$(SCOPE_EXE): $(shell find ./ -type f -name *.go) prog/app/static.go +$(SCOPE_EXE): $(shell find ./ -type f -name *.go) prog/static.go ifeq ($(BUILD_IN_CONTAINER),true) $(SCOPE_EXE) $(RUNSVINIT): $(SCOPE_BACKEND_BUILD_UPTODATE) @@ -58,10 +58,10 @@ $(RUNSVINIT): go build -ldflags "-extldflags \"-static\"" -o $@ ./$(@D) endif -static: prog/app/static.go +static: prog/static.go -prog/app/static.go: client/build/app.js - esc -o $@ -prefix client/build -pkg app client/build +prog/static.go: client/build/app.js + esc -o $@ -prefix client/build client/build ifeq ($(BUILD_IN_CONTAINER),true) client/build/app.js: $(shell find client/app/scripts -type f) $(SCOPE_UI_BUILD_UPTODATE) @@ -101,7 +101,7 @@ clean: go clean ./... $(SUDO) docker rmi $(SCOPE_UI_BUILD_IMAGE) $(SCOPE_BACKEND_BUILD_IMAGE) >/dev/null 2>&1 || true rm -rf $(SCOPE_EXPORT) $(SCOPE_UI_BUILD_UPTODATE) $(SCOPE_BACKEND_BUILD_UPTODATE) \ - $(SCOPE_EXE) $(RUNSVINIT) prog/app/static.go client/build/app.js docker/weave + $(SCOPE_EXE) $(RUNSVINIT) prog/static.go client/build/app.js docker/weave ifeq ($(BUILD_IN_CONTAINER),true) tests: $(SCOPE_BACKEND_BUILD_UPTODATE) diff --git a/prog/app/main.go b/prog/app.go similarity index 86% rename from prog/app/main.go rename to prog/app.go index 7242392ac..415932057 100644 --- a/prog/app/main.go +++ b/prog/app.go @@ -1,4 +1,4 @@ -package app +package main import ( "flag" @@ -6,13 +6,11 @@ import ( "log" "math/rand" "net/http" + _ "net/http/pprof" "strconv" "strings" "time" - // a blank import should be only in a main or test package, or have a comment justifying it - _ "net/http/pprof" - "github.com/gorilla/mux" "github.com/weaveworks/weave/common" @@ -21,7 +19,7 @@ import ( ) // Router creates the mux for all the various app components. -func Router(c app.Collector) *mux.Router { +func router(c app.Collector) *mux.Router { router := mux.NewRouter() app.RegisterTopologyRoutes(c, router) app.RegisterReportPostHandler(c, router) @@ -31,7 +29,7 @@ func Router(c app.Collector) *mux.Router { } // Main runs the app -func Main() { +func appMain() { var ( window = flag.Duration("window", 15*time.Second, "window") listen = flag.String("http.address", ":"+strconv.Itoa(xfer.AppPort), "webserver listen address") @@ -55,7 +53,7 @@ func Main() { rand.Seed(time.Now().UnixNano()) app.UniqueID = strconv.FormatInt(rand.Int63(), 16) log.Printf("app starting, version %s, ID %s", app.Version, app.UniqueID) - http.Handle("/", Router(app.NewCollector(*window))) + http.Handle("/", router(app.NewCollector(*window))) go func() { log.Printf("listening on %s", *listen) log.Print(http.ListenAndServe(*listen, nil)) diff --git a/prog/main.go b/prog/main.go index 059679474..01926360c 100644 --- a/prog/main.go +++ b/prog/main.go @@ -3,13 +3,10 @@ package main import ( "fmt" "os" - - "github.com/weaveworks/scope/prog/app" - "github.com/weaveworks/scope/prog/probe" ) func usage() { - fmt.Printf("usage: %s (app|probe) args...\n", os.Args[0]) + fmt.Fprintf(os.Stderr, "usage: %s (app|probe) args...\n", os.Args[0]) os.Exit(1) } @@ -23,9 +20,9 @@ func main() { switch module { case "app": - app.Main() + appMain() case "probe": - probe.Main() + probeMain() default: usage() } diff --git a/prog/probe/main.go b/prog/probe.go similarity index 97% rename from prog/probe/main.go rename to prog/probe.go index b684d1d25..d289e4020 100644 --- a/prog/probe/main.go +++ b/prog/probe.go @@ -1,4 +1,4 @@ -package probe +package main import ( "flag" @@ -7,14 +7,12 @@ import ( "math/rand" "net" "net/http" + _ "net/http/pprof" "os" "strconv" "strings" "time" - // a blank import should be only in a main or test package, or have a comment justifying it - _ "net/http/pprof" - "github.com/armon/go-metrics" "github.com/weaveworks/weave/common" @@ -34,7 +32,7 @@ import ( var version = "dev" // set at build time // Main runs the probe -func Main() { +func probeMain() { var ( targets = []string{fmt.Sprintf("localhost:%d", xfer.AppPort), fmt.Sprintf("scope.weave.local:%d", xfer.AppPort)} token = flag.String("token", "default-token", "probe token")