Files
tensorflow--tensorflow/ci/official/utilities/setup.sh
T
wehub-resource-sync 8a852e4b4e
cffconvert / validate (push) Has been skipped
License Check / license-check (push) Failing after 2s
chore: import upstream snapshot with attribution
2026-07-13 12:14:16 +08:00

156 lines
6.2 KiB
Bash
Executable File

#!/bin/bash
# Copyright 2023 The TensorFlow Authors. All Rights Reserved.
#
# 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.
# ==============================================================================
#
# Common setup for all TF scripts.
#
# Make as FEW changes to this file as possible. It should not contain utility
# functions (except for tfrun); use dedicated scripts instead and reference them
# specifically. Use your best judgment to keep the scripts in this directory
# lean and easy to follow. When in doubt, remember that for CI scripts, "keep it
# simple" is MUCH more important than "don't repeat yourself."
# -e: abort script if one command fails
# -u: error if undefined variable used
# -x: log all commands
# -o pipefail: entire command fails if pipe fails. watch out for yes | ...
# -o history: record shell history
# -o allexport: export all functions and variables to be available to subscripts
# (affects 'source $TFCI')
set -exo pipefail -o history -o allexport
# Set TFCI_GIT_DIR, the root directory for all commands, to two directories
# above the location of this file (setup.sh). We could also use "git rev-parse
# --show-toplevel", but that wouldn't work for non-git repos (like if someone
# downloaded TF as a zip archive).
export TFCI_GIT_DIR=$(cd $(dirname "$0"); realpath ../../)
cd "$TFCI_GIT_DIR"
# "TFCI" may optionally be set to the name of an env-type file with TFCI
# variables in it, OR may be left empty if the user has already exported the
# relevant variables in their environment. Because of 'set -o allexport' above
# (which is equivalent to "set -a"), every variable in the file is exported
# for other files to use.
#
# Separately, if TFCI is set *and* there are also additional TFCI_ variables
# set in the shell environment, those variables will be restored after the
# TFCI env has been loaded. This is useful for e.g. on-demand "generic" jobs
# where the user may wish to change just one option.
if [[ -z "${TFCI:-}" ]]; then
echo '==TFCI==: The $TFCI variable is not set. This is fine as long as you'
echo 'already sourced a TFCI env file with "set -a; source <path>; set +a".'
echo 'If you have not, you will see a lot of undefined variable errors.'
else
FROM_ENV=$(mktemp)
# "export -p" prints a list of environment values in a safe-to-source format,
# e.g. `declare -x TFCI_BAZEL_COMMON_ARGS="list of args"` for bash.
export -p | grep TFCI > "$FROM_ENV"
# Source the default ci values
source ./ci/official/envs/ci_default
# TODO(angerson) write this documentation
# Sources every env, in order, from the comma-separated list "TFCI"
# Assumes variables will resolve themselves correctly.
set +u
for env_file in ${TFCI//,/ }; do
source "./ci/official/envs/$env_file"
done
set -u
echo '==TFCI==: Evaluated the following TFCI variables from $TFCI:'
export -p | grep TFCI
# Load those stored pre-existing TFCI_ vars, if any
if [[ -s "$FROM_ENV" ]]; then
echo '==TFCI==: NOTE: Loading the following env parameters, which were'
echo 'already set in the shell environment. If you want to disable this'
echo 'behavior, create a new shell.'
cat "$FROM_ENV"
source "$FROM_ENV"
rm "$FROM_ENV"
fi
set +u
fi
# If building installer wheels, set the required environment variables that are
# read by setup.py.
if [[ "$TFCI_INSTALLER_WHL_ENABLE" == 1 ]]; then
export collaborator_build=True
# If building nightly installer wheels, set the project name to
# nightly equivalent.
if [[ "$TFCI_NIGHTLY_UPDATE_VERSION_ENABLE" == 1 ]]; then
export TFCI_INSTALLER_WHL_PROJECT_NAME="$TFCI_INSTALLER_WHL_NIGHTLY_PROJECT_NAME"
fi
export project_name="$TFCI_INSTALLER_WHL_PROJECT_NAME"
fi
# Mac builds have some specific setup needs. See setup_macos.sh for details
if [[ "${OSTYPE}" =~ darwin* ]]; then
source ./ci/official/utilities/setup_macos.sh
fi
# Create and expand to the full path of TFCI_OUTPUT_DIR
export TFCI_OUTPUT_DIR=$(realpath "$TFCI_OUTPUT_DIR")
mkdir -p "$TFCI_OUTPUT_DIR"
# In addition to dumping all script output to the terminal, place it into
# $TFCI_OUTPUT_DIR/script.log
exec > >(tee "$TFCI_OUTPUT_DIR/script.log") 2>&1
# Setup tfrun, a helper function for executing steps that can either be run
# locally or run under Docker. setup_docker.sh, below, redefines it as "docker
# exec".
# Important: "tfrun foo | bar" is "( tfrun foo ) | bar", not "tfrun (foo | bar)".
# Therefore, "tfrun" commands cannot include pipes -- which is
# probably for the better. If a pipe is necessary for something, it is probably
# complex. Write a well-documented script under utilities/ to encapsulate the
# functionality instead.
tfrun() { "$@"; }
if [[ $(uname -s) = MSYS_NT* ]]; then
source ./ci/official/utilities/windows.sh
echo 'Converting MSYS Linux-like paths to Windows paths (for Docker, Python, etc.)'
source <(python ./ci/official/utilities/convert_msys_paths_to_win_paths.py --whitelist-prefix TFCI_)
fi
# Run all "tfrun" commands under Docker. See setup_docker.sh for details
if [[ "$TFCI_DOCKER_ENABLE" == 1 ]]; then
source ./ci/official/utilities/setup_docker.sh
fi
# Generate an overview page describing the build
if [[ "$TFCI_INDEX_HTML_ENABLE" == 1 ]]; then
./ci/official/utilities/generate_index_html.sh "$TFCI_OUTPUT_DIR/index.html"
fi
# Re-try `bazel --version` multiple times to get around
# Bazel download issues.
set +e
MAX_RETRIES=2
for ((i=1; i <= $MAX_RETRIES; i++)); do
tfrun bazel --version
done
set -e
# Single handler for all cleanup actions, triggered on an EXIT trap.
# TODO(angerson) Making this use different scripts may be overkill.
cleanup() {
if [[ "$TFCI_DOCKER_ENABLE" == 1 ]]; then
./ci/official/utilities/cleanup_docker.sh
fi
./ci/official/utilities/cleanup_summary.sh
}
trap cleanup EXIT