From 9fd86faf155d6654f189c90d2dbd2b6b462df090 Mon Sep 17 00:00:00 2001 From: Jeff Mitchell Date: Thu, 21 May 2020 16:03:21 -0400 Subject: [PATCH] Adds a dev target to Makefile and ports over build script (#75) * Initial work on dev builds * Fix build script --- .gitignore | 4 +- Makefile | 27 ++++--- scripts/build.sh | 89 ++++++++++++++++++++++++ {make => scripts}/protoc_gen_plugin.bash | 0 4 files changed, 108 insertions(+), 12 deletions(-) create mode 100755 scripts/build.sh rename {make => scripts}/protoc_gen_plugin.bash (100%) diff --git a/.gitignore b/.gitignore index 1e39169de3..318ff93802 100644 --- a/.gitignore +++ b/.gitignore @@ -114,7 +114,9 @@ Sessionx.vim # Persistent undo [._]*.un~ -# Default output of command compilation +# Compilation outputs main +/pkg/ +/bin/ # vim: set filetype=conf : diff --git a/Makefile b/Makefile index 6b6a4bec6e..67489656fd 100644 --- a/Makefile +++ b/Makefile @@ -8,38 +8,41 @@ REPO_PATH := github.com/hashicorp/watchtower GENERATED_CODE := $(shell find ${THIS_DIR} -name '*.gen.go' && find ${THIS_DIR} -name '*.pb.go' && find ${THIS_DIR} -name '*.pb.gw.go') +CGO_ENABLED?=0 + export GEN_BASEPATH := $(shell pwd) +api: + $(MAKE) --environment-overrides -C api/internal/genapi api + bootstrap: go generate -tags tools tools/tools.go -gen: cleangen proto api migrations +cleangen: + @rm -f ${GENERATED_CODE} -api: - $(MAKE) --environment-overrides -C api/internal/genapi api +dev: BUILD_TAGS+=dev +dev: + @CGO_ENABLED=$(CGO_ENABLED) BUILD_TAGS='$(BUILD_TAGS)' WATCHTOWER_DEV_BUILD=1 sh -c "'$(CURDIR)/scripts/build.sh'" + +gen: cleangen proto api migrations migrations: $(MAKE) --environment-overrides -C internal/db/migrations/genmigrations migrations -cleangen: - @rm -f ${GENERATED_CODE} - ### oplog requires protoc-gen-go v1.20.0 or later # GO111MODULE=on go get -u github.com/golang/protobuf/protoc-gen-go@v1.40 proto: protolint protobuild -protolint: - @buf check lint - protobuild: # To add a new directory containing a proto pass the proto's root path in # through the --proto_path flag. - @bash make/protoc_gen_plugin.bash \ + @bash scripts/protoc_gen_plugin.bash \ "--proto_path=internal/proto/local" \ "--proto_include_path=internal/proto/third_party" \ "--plugin_name=go" \ "--plugin_out=plugins=grpc:${TMP_DIR}" - @bash make/protoc_gen_plugin.bash \ + @bash scripts/protoc_gen_plugin.bash \ "--proto_path=internal/proto/local/" \ "--proto_include_path=internal/proto/third_party" \ "--plugin_name=grpc-gateway" \ @@ -55,6 +58,8 @@ protobuild: @protoc-go-inject-tag -input=./internal/db/db_test/db_test.pb.go @rm -R ${TMP_DIR} +protolint: + @buf check lint .PHONY: api bootstrap gen migrations proto diff --git a/scripts/build.sh b/scripts/build.sh new file mode 100755 index 0000000000..6d391dba3d --- /dev/null +++ b/scripts/build.sh @@ -0,0 +1,89 @@ +#!/usr/bin/env bash +# +# This script builds the application from source for multiple platforms. +set -e + +# Get the parent directory of where this script is. +SOURCE="${BASH_SOURCE[0]}" +while [ -h "$SOURCE" ] ; do SOURCE="$(readlink "$SOURCE")"; done +DIR="$( cd -P "$( dirname "$SOURCE" )/.." && pwd )" + +# Change into that directory +cd "$DIR" + +# Set build tags +BUILD_TAGS="${BUILD_TAGS:-"watchtower"}" + +# Get the git commit +GIT_COMMIT="$(git rev-parse HEAD)" +GIT_DIRTY="$(test -n "`git status --porcelain`" && echo "+CHANGES" || true)" + +# If its dev mode, only build for ourself +if [ "${WATCHTOWER_DEV_BUILD}x" != "x" ] && [ "${XC_OSARCH}x" == "x" ]; then + XC_OS=$(go env GOOS) + XC_ARCH=$(go env GOARCH) + XC_OSARCH=$(go env GOOS)/$(go env GOARCH) +elif [ "${XC_OSARCH}x" != "x" ]; then + IFS='/' read -ra SPLITXC <<< "${XC_OSARCH}" + DEV_PLATFORM="./pkg/${SPLITXC[0]}_${SPLITXC[1]}" +fi + +# Determine the arch/os combos we're building for +XC_ARCH=${XC_ARCH:-"386 amd64"} +XC_OS=${XC_OS:-linux darwin windows freebsd openbsd netbsd solaris} +XC_OSARCH=${XC_OSARCH:-"linux/386 linux/amd64 linux/arm linux/arm64 darwin/386 darwin/amd64 windows/386 windows/amd64 freebsd/386 freebsd/amd64 freebsd/arm openbsd/386 openbsd/amd64 openbsd/arm netbsd/386 netbsd/amd64 solaris/amd64"} + +GOPATH=${GOPATH:-$(go env GOPATH)} +case $(uname) in + CYGWIN*) + GOPATH="$(cygpath $GOPATH)" + ;; +esac + +# Delete the old dir +echo "==> Removing old directory..." +rm -f bin/* +rm -rf pkg/* +mkdir -p bin/ + +# Build! +# If GOX_PARALLEL_BUILDS is set, it will be used to add a "-parallel=${GOX_PARALLEL_BUILDS}" gox parameter +echo "==> Building..." +gox \ + -osarch="${XC_OSARCH}" \ + -gcflags "${GCFLAGS}" \ + -ldflags "${LD_FLAGS}-X github.com/hashicorp/watchtower/version.GitCommit='${GIT_COMMIT}${GIT_DIRTY}'" \ + -output "pkg/{{.OS}}_{{.Arch}}/watchtower" \ + ${GOX_PARALLEL_BUILDS+-parallel="${GOX_PARALLEL_BUILDS}"} \ + -tags="${BUILD_TAGS}" \ + ./cmd/watchtower + +# Move all the compiled things to the $GOPATH/bin +OLDIFS=$IFS +IFS=: MAIN_GOPATH=($GOPATH) +IFS=$OLDIFS + +# Copy our OS/Arch to the bin/ directory +DEV_PLATFORM=${DEV_PLATFORM:-"./pkg/$(go env GOOS)_$(go env GOARCH)"} +for F in $(find ${DEV_PLATFORM} -mindepth 1 -maxdepth 1 -type f); do + cp ${F} bin/ + cp ${F} ${MAIN_GOPATH}/bin/ +done + +if [ "${WATCHTOWER_DEV_BUILD}x" = "x" ]; then + # Zip and copy to the dist dir + echo "==> Packaging..." + for PLATFORM in $(find ./pkg -mindepth 1 -maxdepth 1 -type d); do + OSARCH=$(basename ${PLATFORM}) + echo "--> ${OSARCH}" + + pushd $PLATFORM >/dev/null 2>&1 + zip ../${OSARCH}.zip ./* + popd >/dev/null 2>&1 + done +fi + +# Done! +echo +echo "==> Results:" +ls -hl bin/ diff --git a/make/protoc_gen_plugin.bash b/scripts/protoc_gen_plugin.bash similarity index 100% rename from make/protoc_gen_plugin.bash rename to scripts/protoc_gen_plugin.bash