From 44b4c9ff267783236b88d9edfb388c539f3a8dc2 Mon Sep 17 00:00:00 2001 From: Zach Loafman Date: Wed, 1 Apr 2015 17:29:22 -0700 Subject: [PATCH] Parallelize architectures in "make release" On my desktop, this took the KUBE_RELEASE_RUN_TESTS=n "make release" down from 172s to 115s --- build/common.sh | 39 ++++++++++++++++++++++----------------- hack/lib/golang.sh | 18 ++++++++++++++++-- 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/build/common.sh b/build/common.sh index 365639d56be..9bd8b420260 100644 --- a/build/common.sh +++ b/build/common.sh @@ -511,30 +511,35 @@ function kube::release::package_client_tarballs() { # Find all of the built client binaries local platform platforms platforms=($(cd "${LOCAL_OUTPUT_BINPATH}" ; echo */*)) - for platform in "${platforms[@]}" ; do + for platform in "${platforms[@]}"; do local platform_tag=${platform/\//-} # Replace a "/" for a "-" - kube::log::status "Building tarball: client $platform_tag" + kube::log::status "Starting tarball: client $platform_tag" - local release_stage="${RELEASE_STAGE}/client/${platform_tag}/kubernetes" - rm -rf "${release_stage}" - mkdir -p "${release_stage}/client/bin" + ( + local release_stage="${RELEASE_STAGE}/client/${platform_tag}/kubernetes" + rm -rf "${release_stage}" + mkdir -p "${release_stage}/client/bin" - local client_bins=("${KUBE_CLIENT_BINARIES[@]}") - if [[ "${platform%/*}" == "windows" ]]; then - client_bins=("${KUBE_CLIENT_BINARIES_WIN[@]}") - fi + local client_bins=("${KUBE_CLIENT_BINARIES[@]}") + if [[ "${platform%/*}" == "windows" ]]; then + client_bins=("${KUBE_CLIENT_BINARIES_WIN[@]}") + fi - # This fancy expression will expand to prepend a path - # (${LOCAL_OUTPUT_BINPATH}/${platform}/) to every item in the - # KUBE_CLIENT_BINARIES array. - cp "${client_bins[@]/#/${LOCAL_OUTPUT_BINPATH}/${platform}/}" \ - "${release_stage}/client/bin/" + # This fancy expression will expand to prepend a path + # (${LOCAL_OUTPUT_BINPATH}/${platform}/) to every item in the + # KUBE_CLIENT_BINARIES array. + cp "${client_bins[@]/#/${LOCAL_OUTPUT_BINPATH}/${platform}/}" \ + "${release_stage}/client/bin/" - kube::release::clean_cruft + kube::release::clean_cruft - local package_name="${RELEASE_DIR}/kubernetes-client-${platform_tag}.tar.gz" - kube::release::create_tarball "${package_name}" "${release_stage}/.." + local package_name="${RELEASE_DIR}/kubernetes-client-${platform_tag}.tar.gz" + kube::release::create_tarball "${package_name}" "${release_stage}/.." + ) & done + + kube::log::status "Waiting on tarballs" + wait || { kube::log::error "client tarball creation failed"; exit 1; } } # Package up all of the server binaries diff --git a/hack/lib/golang.sh b/hack/lib/golang.sh index fc21bfd5636..54ad20a8dc0 100644 --- a/hack/lib/golang.sh +++ b/hack/lib/golang.sh @@ -313,10 +313,11 @@ kube::golang::build_binaries() { local binaries binaries=($(kube::golang::binaries_from_targets "${targets[@]}")) + kube::log::status "Building go targets for ${platforms[@]} in parallel (output will appear in a burst when complete):" "${targets[@]}" local platform - for platform in "${platforms[@]}"; do + for platform in "${platforms[@]}"; do ( kube::golang::set_platform_envs "${platform}" - kube::log::status "Building go targets for ${platform}:" "${targets[@]}" + kube::log::status "${platform}: Parallel go build started" local -a statics=() local -a nonstatics=() @@ -369,6 +370,19 @@ kube::golang::build_binaries() { "${statics[@]:+${statics[@]}}" fi fi + kube::log::status "${platform}: Parallel go build finished" + ) &> "/tmp//${platform//\//_}.build" & done + + local fails=0 + for job in $(jobs -p); do + wait ${job} || let "fails+=1" + done + + for platform in "${platforms[@]}"; do + cat "/tmp//${platform//\//_}.build" + done + + exit ${fails} ) }