From 99a6a8ab164162ef6b3ce8039d990f0924c2bd1a Mon Sep 17 00:00:00 2001 From: Tim Hockin Date: Fri, 12 Aug 2016 14:48:37 -0700 Subject: [PATCH 1/2] Fix subtle build breakage Repro case: $ make clean generated_files $ hack/update-generated-protobuf.sh This would complain about not finding `fmt`, and it was indicating the wrong GOROOT. The problem was that the first step built binaries for generating code, which *embeds* the value of GOROOT into the binary. The whole tree was bind-mounted into the build container and then JUST the dockerized dir was mounted over it. The in-container build tried to use the existing binaries, but GOROOT is wrong. This change whites-out the whole _output dir. I first made just an anonymous volume for _output, but docker makes that as root, which means I can't write to it from our non-root build. So I just put it in the data container. This seems to work. The biggest change this makes is that the $GOPATH/bin/ and $GOPATH/pkg/ dirs will persist across dockerized builds. --- build/common.sh | 11 ++++++----- hack/lib/golang.sh | 8 ++++---- hack/update-generated-protobuf-dockerized.sh | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/build/common.sh b/build/common.sh index 2007870f21d..feaba83ed9b 100755 --- a/build/common.sh +++ b/build/common.sh @@ -67,15 +67,15 @@ readonly LOCAL_OUTPUT_IMAGE_STAGING="${LOCAL_OUTPUT_ROOT}/images" # This is a symlink to binaries for "this platform" (e.g. build tools). readonly THIS_PLATFORM_BIN="${LOCAL_OUTPUT_ROOT}/bin" -readonly OUTPUT_BINPATH="${CUSTOM_OUTPUT_BINPATH:-$LOCAL_OUTPUT_BINPATH}" - readonly REMOTE_OUTPUT_ROOT="/go/src/${KUBE_GO_PACKAGE}/_output" readonly REMOTE_OUTPUT_SUBPATH="${REMOTE_OUTPUT_ROOT}/dockerized" readonly REMOTE_OUTPUT_BINPATH="${REMOTE_OUTPUT_SUBPATH}/bin" readonly REMOTE_OUTPUT_GOPATH="${REMOTE_OUTPUT_SUBPATH}/go" readonly DOCKER_MOUNT_ARGS_BASE=( - --volume "${OUTPUT_BINPATH}:${REMOTE_OUTPUT_BINPATH}" + # where the container build will drop output + --volume "${LOCAL_OUTPUT_BINPATH}:${REMOTE_OUTPUT_BINPATH}" + # timezone --volume /etc/localtime:/etc/localtime:ro ) @@ -568,11 +568,12 @@ function kube::build::ensure_data_container() { # container and chowns the GOPATH. local -ra docker_cmd=( "${DOCKER[@]}" run - --volume "${REMOTE_OUTPUT_GOPATH}" --name "${KUBE_BUILD_DATA_CONTAINER_NAME}" --hostname "${HOSTNAME}" + --volume "${REMOTE_OUTPUT_ROOT}" # white-out the whole output dir + --volume "${REMOTE_OUTPUT_GOPATH}" # make a non-root owned mountpoint "${KUBE_BUILD_IMAGE}" - chown -R $(id -u).$(id -g) "${REMOTE_OUTPUT_GOPATH}" + chown -R $(id -u).$(id -g) "${REMOTE_OUTPUT_ROOT}" ) "${docker_cmd[@]}" fi diff --git a/hack/lib/golang.sh b/hack/lib/golang.sh index 9c487d869a4..8ce90a90c24 100755 --- a/hack/lib/golang.sh +++ b/hack/lib/golang.sh @@ -612,18 +612,18 @@ kube::golang::build_binaries() { local use_go_build local -a targets=() local arg - + # Add any files with those //generate annotations in the array below. readonly BINDATAS=( "${KUBE_ROOT}/test/e2e/framework/gobindata_util.go" ) kube::log::status "Generating bindata:" "${BINDATAS[@]}" for bindata in ${BINDATAS[@]}; do - # Only try to generate bindata if the file exists, since in some cases - # one-off builds of individual directories may exclude some files. + # Only try to generate bindata if the file exists, since in some cases + # one-off builds of individual directories may exclude some files. if [[ -f $bindata ]]; then go generate "${bindata}" fi done - + for arg; do if [[ "${arg}" == "--use_go_build" ]]; then use_go_build=true diff --git a/hack/update-generated-protobuf-dockerized.sh b/hack/update-generated-protobuf-dockerized.sh index 5cb379d370b..2069ac4e53b 100755 --- a/hack/update-generated-protobuf-dockerized.sh +++ b/hack/update-generated-protobuf-dockerized.sh @@ -45,7 +45,7 @@ gotoprotobuf=$(kube::util::find-binary "go-to-protobuf") # searches for the protoc-gen-gogo extension in the output directory # satisfies import of github.com/gogo/protobuf/gogoproto/gogo.proto and the # core Google protobuf types -PATH="${KUBE_ROOT}/_output/local/go/bin:${PATH}" \ +PATH="${KUBE_ROOT}/_output/bin:${PATH}" \ "${gotoprotobuf}" \ --proto-import="${KUBE_ROOT}/vendor" \ --proto-import="${KUBE_ROOT}/third_party/protobuf" \ From 5217a502d1738c0aff724d2aaad93356e89aa97f Mon Sep 17 00:00:00 2001 From: Tim Hockin Date: Fri, 12 Aug 2016 21:35:21 -0700 Subject: [PATCH 2/2] Set GOROOT --- hack/lib/golang.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hack/lib/golang.sh b/hack/lib/golang.sh index 8ce90a90c24..15e7ccb0daf 100755 --- a/hack/lib/golang.sh +++ b/hack/lib/golang.sh @@ -348,6 +348,9 @@ kube::golang::setup_env() { subdir=$(kube::realpath . | sed "s|$KUBE_ROOT||") cd "${KUBE_GOPATH}/src/${KUBE_GO_PACKAGE}/${subdir}" + # Set GOROOT so binaries that parse code can work properly. + export GOROOT=$(go env GOROOT) + # Unset GOBIN in case it already exists in the current session. unset GOBIN