관리-도구
편집 파일: functions.sh
#!/usr/bin/env bash set -e RESET=$(echo -e "\\033[0m") BOLD=$(echo -e "\\033[1m") YELLOW=$(echo -e "\\033[33m") BLUE_BG=$(echo -e "\\033[44m") function header() { local title="$1" echo "${BLUE_BG}${YELLOW}${BOLD}${title}${RESET}" echo "------------------------------------------" } function header2() { local title="$1" echo "### ${BOLD}${title}${RESET}" echo } function run() { echo "+ $*" "$@" } function run_exec() { echo "+ exec $*" exec "$@" } function retry_run() { local reset='\x1B[0m' local red='\x1B[31m' local yellow='\x1B[33m' local max_tries="$1" local number=2 shift echo "+ $*" while true; do if "$@"; then return 0 elif [[ $number -le $max_tries ]]; then echo -e "${yellow}The command \"$*\" failed. Retrying, $number of $max_tries:${reset}" (( number++ )) else echo -e "${red}The command \"$*\" failed after $max_tries attempts. Giving up.${reset}" return 1 fi done } function require_envvar() { local name="$1" local value="$2" if [[ "$value" = "" ]]; then echo "ERROR: the environment variable '$name' is required." exit 1 fi } function autodetect_environment() { echo "Environment autodetection results:" if [[ -e /usr/bin/sw_vers ]]; then echo "Operating system: macOS" export OS=macos else echo "Operating system: Linux" export OS=linux fi if [[ "$JENKINS_HOME" != "" ]]; then echo "Running in Jenkins: yes" export IN_JEKINS=true if [ $OS = "linux" ]; then export CACHE_DIR="$JENKINS_HOME/cache/$JOB_NAME/executor-$EXECUTOR_NUMBER" else require_envvar WORKSPACE "$WORKSPACE" export CACHE_DIR="$WORKSPACE/cache/$JOB_NAME/executor-$EXECUTOR_NUMBER" fi else echo "Running in Jenkins: no" export IN_JENKINS=false export CACHE_DIR="$PASSENGER_ROOT/.ci_cache" fi echo "Cache directory: $CACHE_DIR" } function sanity_check_environment() { if $IN_JENKINS; then if [[ "$JOB_NAME" = "" ]]; then echo "ERROR: Jenkins environment detected, but JOB_NAME environment variable not set." >&2 return 1 fi if [[ "$EXECUTOR_NUMBER" = "" ]]; then echo "ERROR: Jenkins environment detected, but EXECUTOR_NUMBER environment variable not set." >&2 return 1 fi fi } # The following is necessary to make the C++ tests work. # They invoke Ruby scripts which require gems installed # by Bundler, but these scripts are not invoked with # Bundler, so they can only find these gems through GEM_PATH. function add_bundler_path_to_gem_path() { local bundle_path if bundle_path=$(bundle show rake); then bundle_path=$(dirname "$bundle_path") bundle_path=$(dirname "$bundle_path") echo "Adding $bundle_path to GEM_PATH" export GEM_PATH="$bundle_path:$GEM_PATH" local bundle_bin_path="$bundle_path/bin" echo "Adding $bundle_bin_path to PATH" export PATH="$bundle_bin_path:$PATH" fi } function _cleanup() { set +e local pids pids=$(jobs -p) if [[ "$pids" != "" ]]; then # shellcheck disable=SC2086 kill $pids 2>/dev/null fi if [[ $(type -t cleanup) == function ]]; then cleanup fi } trap _cleanup EXIT