From 44b4c9ff267783236b88d9edfb388c539f3a8dc2 Mon Sep 17 00:00:00 2001 From: Zach Loafman Date: Wed, 1 Apr 2015 17:29:22 -0700 Subject: [PATCH 1/2] 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} ) } From 0bbf4e99f621b614b0f64cee540f09b2d70f6b8f Mon Sep 17 00:00:00 2001 From: Zach Loafman Date: Wed, 1 Apr 2015 17:31:15 -0700 Subject: [PATCH 2/2] Re tab-ify golang.sh --- hack/lib/golang.sh | 80 +++++++++++++++++++++++----------------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/hack/lib/golang.sh b/hack/lib/golang.sh index 54ad20a8dc0..111a6a0a595 100644 --- a/hack/lib/golang.sh +++ b/hack/lib/golang.sh @@ -316,61 +316,61 @@ kube::golang::build_binaries() { 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 ( - kube::golang::set_platform_envs "${platform}" - kube::log::status "${platform}: Parallel go build started" - - local -a statics=() - local -a nonstatics=() - for binary in "${binaries[@]}"; do - if kube::golang::is_statically_linked_library "${binary}"; then - kube::golang::exit_if_stdlib_not_installed; - statics+=($binary) - else - nonstatics+=($binary) - fi - done - - if [[ -n ${use_go_build:-} ]]; then - # Try and replicate the native binary placement of go install without - # calling go install. This means we have to iterate each binary. - local output_path="${KUBE_GOPATH}/bin" - if [[ $platform != $host_platform ]]; then - output_path="${output_path}/${platform//\//_}" - fi + kube::golang::set_platform_envs "${platform}" + kube::log::status "${platform}: Parallel go build started" + local -a statics=() + local -a nonstatics=() for binary in "${binaries[@]}"; do - local bin=$(basename "${binary}") - if [[ ${GOOS} == "windows" ]]; then - bin="${bin}.exe" - fi - if kube::golang::is_statically_linked_library "${binary}"; then kube::golang::exit_if_stdlib_not_installed; - CGO_ENABLED=0 go build -installsuffix cgo -o "${output_path}/${bin}" \ - "${goflags[@]:+${goflags[@]}}" \ - -ldflags "${version_ldflags}" \ - "${binary}" + statics+=($binary) else - go build -o "${output_path}/${bin}" \ - "${goflags[@]:+${goflags[@]}}" \ - -ldflags "${version_ldflags}" \ - "${binary}" + nonstatics+=($binary) fi done - else + + if [[ -n ${use_go_build:-} ]]; then + # Try and replicate the native binary placement of go install without + # calling go install. This means we have to iterate each binary. + local output_path="${KUBE_GOPATH}/bin" + if [[ $platform != $host_platform ]]; then + output_path="${output_path}/${platform//\//_}" + fi + + for binary in "${binaries[@]}"; do + local bin=$(basename "${binary}") + if [[ ${GOOS} == "windows" ]]; then + bin="${bin}.exe" + fi + + if kube::golang::is_statically_linked_library "${binary}"; then + kube::golang::exit_if_stdlib_not_installed; + CGO_ENABLED=0 go build -installsuffix cgo -o "${output_path}/${bin}" \ + "${goflags[@]:+${goflags[@]}}" \ + -ldflags "${version_ldflags}" \ + "${binary}" + else + go build -o "${output_path}/${bin}" \ + "${goflags[@]:+${goflags[@]}}" \ + -ldflags "${version_ldflags}" \ + "${binary}" + fi + done + else # Use go install. if [[ "${#nonstatics[@]}" != 0 ]]; then go install "${goflags[@]:+${goflags[@]}}" \ - -ldflags "${version_ldflags}" \ - "${nonstatics[@]:+${nonstatics[@]}}" + -ldflags "${version_ldflags}" \ + "${nonstatics[@]:+${nonstatics[@]}}" fi if [[ "${#statics[@]}" != 0 ]]; then CGO_ENABLED=0 go install -installsuffix cgo "${goflags[@]:+${goflags[@]}}" \ -ldflags "${version_ldflags}" \ - "${statics[@]:+${statics[@]}}" + "${statics[@]:+${statics[@]}}" fi - fi - kube::log::status "${platform}: Parallel go build finished" + fi + kube::log::status "${platform}: Parallel go build finished" ) &> "/tmp//${platform//\//_}.build" & done