Commit 1cc23155 authored by Kubernetes Submit Queue's avatar Kubernetes Submit Queue Committed by GitHub

Merge pull request #30546 from thockin/build-vol-whole-output

Automatic merge from submit-queue 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. NB: this requires a `make clean` to activate. @lavalamp @jbeda @quinton-hoole @david-mcmahon
parents 914e56c0 5217a502
...@@ -67,15 +67,15 @@ readonly LOCAL_OUTPUT_IMAGE_STAGING="${LOCAL_OUTPUT_ROOT}/images" ...@@ -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). # This is a symlink to binaries for "this platform" (e.g. build tools).
readonly THIS_PLATFORM_BIN="${LOCAL_OUTPUT_ROOT}/bin" 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_ROOT="/go/src/${KUBE_GO_PACKAGE}/_output"
readonly REMOTE_OUTPUT_SUBPATH="${REMOTE_OUTPUT_ROOT}/dockerized" readonly REMOTE_OUTPUT_SUBPATH="${REMOTE_OUTPUT_ROOT}/dockerized"
readonly REMOTE_OUTPUT_BINPATH="${REMOTE_OUTPUT_SUBPATH}/bin" readonly REMOTE_OUTPUT_BINPATH="${REMOTE_OUTPUT_SUBPATH}/bin"
readonly REMOTE_OUTPUT_GOPATH="${REMOTE_OUTPUT_SUBPATH}/go" readonly REMOTE_OUTPUT_GOPATH="${REMOTE_OUTPUT_SUBPATH}/go"
readonly DOCKER_MOUNT_ARGS_BASE=( 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 --volume /etc/localtime:/etc/localtime:ro
) )
...@@ -568,11 +568,12 @@ function kube::build::ensure_data_container() { ...@@ -568,11 +568,12 @@ function kube::build::ensure_data_container() {
# container and chowns the GOPATH. # container and chowns the GOPATH.
local -ra docker_cmd=( local -ra docker_cmd=(
"${DOCKER[@]}" run "${DOCKER[@]}" run
--volume "${REMOTE_OUTPUT_GOPATH}"
--name "${KUBE_BUILD_DATA_CONTAINER_NAME}" --name "${KUBE_BUILD_DATA_CONTAINER_NAME}"
--hostname "${HOSTNAME}" --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}" "${KUBE_BUILD_IMAGE}"
chown -R $(id -u).$(id -g) "${REMOTE_OUTPUT_GOPATH}" chown -R $(id -u).$(id -g) "${REMOTE_OUTPUT_ROOT}"
) )
"${docker_cmd[@]}" "${docker_cmd[@]}"
fi fi
......
...@@ -348,6 +348,9 @@ kube::golang::setup_env() { ...@@ -348,6 +348,9 @@ kube::golang::setup_env() {
subdir=$(kube::realpath . | sed "s|$KUBE_ROOT||") subdir=$(kube::realpath . | sed "s|$KUBE_ROOT||")
cd "${KUBE_GOPATH}/src/${KUBE_GO_PACKAGE}/${subdir}" 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 in case it already exists in the current session.
unset GOBIN unset GOBIN
...@@ -612,18 +615,18 @@ kube::golang::build_binaries() { ...@@ -612,18 +615,18 @@ kube::golang::build_binaries() {
local use_go_build local use_go_build
local -a targets=() local -a targets=()
local arg local arg
# Add any files with those //generate annotations in the array below. # Add any files with those //generate annotations in the array below.
readonly BINDATAS=( "${KUBE_ROOT}/test/e2e/framework/gobindata_util.go" ) readonly BINDATAS=( "${KUBE_ROOT}/test/e2e/framework/gobindata_util.go" )
kube::log::status "Generating bindata:" "${BINDATAS[@]}" kube::log::status "Generating bindata:" "${BINDATAS[@]}"
for bindata in ${BINDATAS[@]}; do for bindata in ${BINDATAS[@]}; do
# Only try to generate bindata if the file exists, since in some cases # Only try to generate bindata if the file exists, since in some cases
# one-off builds of individual directories may exclude some files. # one-off builds of individual directories may exclude some files.
if [[ -f $bindata ]]; then if [[ -f $bindata ]]; then
go generate "${bindata}" go generate "${bindata}"
fi fi
done done
for arg; do for arg; do
if [[ "${arg}" == "--use_go_build" ]]; then if [[ "${arg}" == "--use_go_build" ]]; then
use_go_build=true use_go_build=true
......
...@@ -45,7 +45,7 @@ gotoprotobuf=$(kube::util::find-binary "go-to-protobuf") ...@@ -45,7 +45,7 @@ gotoprotobuf=$(kube::util::find-binary "go-to-protobuf")
# searches for the protoc-gen-gogo extension in the output directory # searches for the protoc-gen-gogo extension in the output directory
# satisfies import of github.com/gogo/protobuf/gogoproto/gogo.proto and the # satisfies import of github.com/gogo/protobuf/gogoproto/gogo.proto and the
# core Google protobuf types # core Google protobuf types
PATH="${KUBE_ROOT}/_output/local/go/bin:${PATH}" \ PATH="${KUBE_ROOT}/_output/bin:${PATH}" \
"${gotoprotobuf}" \ "${gotoprotobuf}" \
--proto-import="${KUBE_ROOT}/vendor" \ --proto-import="${KUBE_ROOT}/vendor" \
--proto-import="${KUBE_ROOT}/third_party/protobuf" \ --proto-import="${KUBE_ROOT}/third_party/protobuf" \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment