| #!/usr/bin/env bash |
| |
| # Copyright 2025 The Kubernetes Authors. |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| # This script verifies if the golang linker is eliminating dead code in |
| # various components we care about, such as kube-apiserver, kubelet and others |
| # Usage: `hack/verify-deadcode-elimination.sh`. |
| |
| set -o errexit |
| set -o nounset |
| set -o pipefail |
| |
| KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. |
| source "${KUBE_ROOT}/hack/lib/init.sh" |
| |
| kube::golang::setup_env |
| |
| # Ensure that we find the binaries we build before anything else. |
| export GOBIN="${KUBE_OUTPUT_BIN}" |
| PATH="${GOBIN}:${PATH}" |
| |
| # Install whydeadcode |
| go install github.com/aarzilli/whydeadcode@latest |
| |
| # Prefer full path for running zeitgeist |
| WHYDEADCODE_BIN="$(which whydeadcode)" |
| |
| pushd "${KUBE_ROOT}" |
| |
| # Define an array of binaries to check |
| BINARIES=("kube-apiserver" "kubelet" "kube-controller-manager" "kube-scheduler" "kube-proxy") |
| FAILED=false |
| FAILED_BINARIES=() |
| |
| for binary in "${BINARIES[@]}"; do |
| echo "Processing ${binary} ..." |
| output=$(KUBE_VERBOSE=4 GOLDFLAGS=-dumpdep make "${binary}" 2>&1 | grep "\->" | ${WHYDEADCODE_BIN} 2>&1) |
| if [[ -n "$output" ]]; then |
| echo "golang linker is not eliminating dead code in ${binary}, please check the trace output below:" |
| echo "(NOTE: that there may be false positives, but the first trace should be a real issue)" |
| echo "$output" |
| FAILED=true |
| FAILED_BINARIES+=("${binary}") |
| fi |
| |
| # Find the binary and print its size |
| echo "Finding ${binary} binary and checking its size:" |
| binary_paths=$(find _output -type f -name "${binary}" | sort) |
| if [[ -n "${binary_paths}" ]]; then |
| # shellcheck disable=SC2086 |
| ls -altrh ${binary_paths} |
| else |
| echo "Binary ${binary} not found in _output directory" |
| fi |
| echo "" |
| done |
| |
| popd > /dev/null || true |
| |
| if [[ "$FAILED" == "true" ]]; then |
| echo "Dead code elimination check failed for the following binaries:" |
| for failed_binary in "${FAILED_BINARIES[@]}"; do |
| echo " - ${failed_binary}" |
| done |
| exit 1 |
| fi |