Files
node-problem-detector/test/build.sh
Benjamin Elder 4e0b9150b9 CI: build container and push tar, PR: push tar
We only need the tar to run CI tests, but we should also test building the container.

We release the container and binaries independently of this, this script is for e2e tests.
2024-07-08 15:36:40 -07:00

203 lines
6.4 KiB
Bash
Executable File

#!/bin/bash
# Copyright 2019 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 build node problem detector for presubmit and CI jobs and push to
# staging, so that kubernetes E2E tests have access to the build.
set -o errexit
set -o nounset
set -o pipefail
NPD_STAGING_PATH=${NPD_STAGING_PATH:-"gs://node-problem-detector-staging"}
NPD_STAGING_REGISTRY=${NPD_STAGING_REGISTRY:-"gcr.io/node-problem-detector-staging"}
PR_ENV_FILENAME=${PR_ENV_FILENAME:-"pr.env"}
CI_ENV_FILENAME=${CI_ENV_FILENAME:-"ci.env"}
CI_CUSTOM_FLAGS_ENV_FILENAME=${CI_CUSTOM_FLAGS_ENV_FILENAME:-"ci-custom-flags.env"}
ROOT_PATH=$(git rev-parse --show-toplevel)
GCS_URL_PREFIX="https://storage.googleapis.com/"
function print-help() {
echo "Usage: build.sh [flags] [command]"
echo
echo "Available flags:"
echo " -p [PR_NUMBER] Specify the pull request number when building for a presubmit job."
echo " -f Use custom flags."
echo
echo "Available commands:"
echo " help Print this help message"
echo " pr Build node-problem-detector for presubmit jobs and push to staging. Flag -p is required."
echo " ci Build node-problem-detector for CI jobs and push to staging."
echo " get-ci-env Download environment variable file from staging for CI job."
echo " install-lib Install the required libraries and tools for presubmit and CI jobs."
echo
echo "Examples:"
echo " build.sh help"
echo " build.sh -p [PR_NUMBER] pr"
echo " build.sh -p [PR_NUMBER] -f pr"
echo " build.sh ci"
echo " build.sh get-ci-env"
echo " build.sh -f get-ci-env"
echo " build.sh install-lib"
}
function get-version() {
if [ -d .git ]; then
echo `git describe --tags --dirty`
else
echo "UNKNOWN"
fi
}
function install-lib() {
apt-get update
apt-get install -y libsystemd-dev gcc-aarch64-linux-gnu
}
function write-env-file() {
local -r env_file="${1}"
if [[ -z "${env_file}" ]]; then
echo "ERROR: env_file is missing."
exit 1
fi
cat > ${ROOT_PATH}/${env_file} <<EOF
export KUBE_ENABLE_NODE_PROBLEM_DETECTOR=standalone
export NODE_PROBLEM_DETECTOR_RELEASE_PATH=${UPLOAD_PATH/gs:\/\//${GCS_URL_PREFIX}}
export NODE_PROBLEM_DETECTOR_VERSION=${VERSION}
export NODE_PROBLEM_DETECTOR_TAR_HASH=$(sha1sum ${ROOT_PATH}/node-problem-detector-${VERSION}-linux_amd64.tar.gz | cut -d ' ' -f1)
export EXTRA_ENVS=NODE_PROBLEM_DETECTOR_IMAGE=${REGISTRY}/node-problem-detector:${TAG}
EOF
if [[ -n "${NODE_PROBLEM_DETECTOR_CUSTOM_FLAGS:-}" ]]; then
cat >> ${ROOT_PATH}/${env_file} <<EOF
export NODE_PROBLEM_DETECTOR_CUSTOM_FLAGS="${NODE_PROBLEM_DETECTOR_CUSTOM_FLAGS}"
EOF
fi
echo "Written env file ${ROOT_PATH}/${env_file}:"
cat ${ROOT_PATH}/${env_file}
}
function build-npd-custom-flags() {
local -r kube_home="/home/kubernetes"
local -r km_config="${kube_home}/node-problem-detector/config/kernel-monitor.json"
local -r dm_config="${kube_home}/node-problem-detector/config/docker-monitor.json"
local -r sm_config="${kube_home}/node-problem-detector/config/systemd-monitor.json"
local -r custom_km_config="${kube_home}/node-problem-detector/config/kernel-monitor-counter.json"
local -r custom_sm_config="${kube_home}/node-problem-detector/config/systemd-monitor-counter.json"
flags="--v=2"
flags+=" --logtostderr"
flags+=" --config.system-log-monitor=${km_config},${dm_config},${sm_config}"
flags+=" --config.custom-plugin-monitor=${custom_km_config},${custom_sm_config}"
flags+=" --port=20256"
export NODE_PROBLEM_DETECTOR_CUSTOM_FLAGS=${flags}
}
function build-pr() {
if [[ -z "${PR_NUMBER}" ]]; then
echo "ERROR: PR_NUMBER is missing."
print-help
exit 1
fi
# Use the PR number and current time as the name, e.g., pr261-20190314.224907.862195792
local -r PR="pr${PR_NUMBER}-$(date +%Y%m%d.%H%M%S.%N)"
echo "Building for PR ${PR}..."
install-lib
export UPLOAD_PATH="${NPD_STAGING_PATH}/pr/${PR}"
export REGISTRY="${NPD_STAGING_REGISTRY}/pr/${PR}"
export VERSION=$(get-version)
export TAG="${VERSION}"
make push-tar
write-env-file ${PR_ENV_FILENAME}
}
function build-ci() {
install-lib
export UPLOAD_PATH="${NPD_STAGING_PATH}/ci"
export REGISTRY="${NPD_STAGING_REGISTRY}/ci"
export VERSION="$(get-version)-$(date +%Y%m%d.%H%M)"
export TAG="${VERSION}"
# e2e tests consume the tarball, not the container
# this is simpler to manage in the infra, and we still ensure the container
# build works locally
make push-tar build-container
# Create the env file with and without custom flags at the same time.
build-npd-custom-flags
write-env-file ${CI_CUSTOM_FLAGS_ENV_FILENAME}
gsutil mv ${ROOT_PATH}/${CI_CUSTOM_FLAGS_ENV_FILENAME} ${UPLOAD_PATH}
export NODE_PROBLEM_DETECTOR_CUSTOM_FLAGS=""
write-env-file ${CI_ENV_FILENAME}
gsutil mv ${ROOT_PATH}/${CI_ENV_FILENAME} ${UPLOAD_PATH}
}
function get-ci-env() {
if [[ "${USE_CUSTOM_FLAGS}" == "true" ]]; then
gsutil cp ${NPD_STAGING_PATH}/ci/${CI_CUSTOM_FLAGS_ENV_FILENAME} ${ROOT_PATH}/${CI_CUSTOM_FLAGS_ENV_FILENAME}
echo "Using env file ${ROOT_PATH}/${CI_CUSTOM_FLAGS_ENV_FILENAME}:"
cat ${ROOT_PATH}/${CI_CUSTOM_FLAGS_ENV_FILENAME}
else
gsutil cp ${NPD_STAGING_PATH}/ci/${CI_ENV_FILENAME} ${ROOT_PATH}/${CI_ENV_FILENAME}
echo "Using env file ${ROOT_PATH}/${CI_ENV_FILENAME}:"
cat ${ROOT_PATH}/${CI_ENV_FILENAME}
fi
}
main() {
cd ${ROOT_PATH}
if [[ "${USE_CUSTOM_FLAGS}" == "true" ]]; then
build-npd-custom-flags
fi
# This is for the deprecated usage: build.sh pr [PR_NUMBER]
if [[ -z "${PR_NUMBER}" ]]; then
PR_NUMBER="${2:-}"
fi
case ${1:-} in
help) print-help;;
pr) build-pr;;
ci) build-ci;;
get-ci-env) get-ci-env;;
install-lib) install-lib;;
*) print-help;;
esac
}
USE_CUSTOM_FLAGS="false"
PR_NUMBER=""
while getopts "fp:" opt; do
case ${opt} in
f) USE_CUSTOM_FLAGS="true";;
p) PR_NUMBER="${OPTARG}";;
esac
done
shift "$((OPTIND-1))"
main "$@"