2019-05-22 12:11:57 +00:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
|
2018-12-19 20:55:42 +00:00
|
|
|
# Initialize variables if they aren't already defined.
|
|
|
|
|
|
|
|
# CI mode - set to true on CI server for PR validation build or official build.
|
2018-10-22 05:07:26 +00:00
|
|
|
ci=${ci:-false}
|
2018-12-19 20:55:42 +00:00
|
|
|
|
2019-05-22 12:11:57 +00:00
|
|
|
# Set to true to use the pipelines logger which will enable Azure logging output.
|
|
|
|
# https://github.com/Microsoft/azure-pipelines-tasks/blob/master/docs/authoring/commands.md
|
|
|
|
# This flag is meant as a temporary opt-opt for the feature while validate it across
|
|
|
|
# our consumers. It will be deleted in the future.
|
|
|
|
if [[ "$ci" == true ]]; then
|
|
|
|
pipelines_log=${pipelines_log:-true}
|
|
|
|
else
|
|
|
|
pipelines_log=${pipelines_log:-false}
|
|
|
|
fi
|
|
|
|
|
2018-12-19 20:55:42 +00:00
|
|
|
# Build configuration. Common values include 'Debug' and 'Release', but the repository may use other names.
|
2018-10-22 05:07:26 +00:00
|
|
|
configuration=${configuration:-'Debug'}
|
2018-12-19 20:55:42 +00:00
|
|
|
|
2020-05-12 12:48:04 +00:00
|
|
|
# Set to true to opt out of outputting binary log while running in CI
|
|
|
|
exclude_ci_binary_log=${exclude_ci_binary_log:-false}
|
|
|
|
|
|
|
|
if [[ "$ci" == true && "$exclude_ci_binary_log" == false ]]; then
|
|
|
|
binary_log_default=true
|
|
|
|
else
|
|
|
|
binary_log_default=false
|
|
|
|
fi
|
|
|
|
|
2018-12-19 20:55:42 +00:00
|
|
|
# Set to true to output binary log from msbuild. Note that emitting binary log slows down the build.
|
2020-05-12 12:48:04 +00:00
|
|
|
binary_log=${binary_log:-$binary_log_default}
|
2018-12-19 20:55:42 +00:00
|
|
|
|
|
|
|
# Turns on machine preparation/clean up code that changes the machine state (e.g. kills build processes).
|
2018-10-22 05:07:26 +00:00
|
|
|
prepare_machine=${prepare_machine:-false}
|
2018-12-19 20:55:42 +00:00
|
|
|
|
|
|
|
# True to restore toolsets and dependencies.
|
2018-10-22 05:07:26 +00:00
|
|
|
restore=${restore:-true}
|
2018-12-19 20:55:42 +00:00
|
|
|
|
|
|
|
# Adjusts msbuild verbosity level.
|
2018-10-22 05:07:26 +00:00
|
|
|
verbosity=${verbosity:-'minimal'}
|
|
|
|
|
2018-12-19 20:55:42 +00:00
|
|
|
# Set to true to reuse msbuild nodes. Recommended to not reuse on CI.
|
|
|
|
if [[ "$ci" == true ]]; then
|
|
|
|
node_reuse=${node_reuse:-false}
|
|
|
|
else
|
|
|
|
node_reuse=${node_reuse:-true}
|
2018-12-06 01:48:17 +00:00
|
|
|
fi
|
|
|
|
|
2018-12-19 20:55:42 +00:00
|
|
|
# Configures warning treatment in msbuild.
|
|
|
|
warn_as_error=${warn_as_error:-true}
|
2018-10-22 05:07:26 +00:00
|
|
|
|
2020-02-08 00:51:24 +00:00
|
|
|
# True to attempt using .NET Core already that meets requirements specified in global.json
|
2018-12-19 20:55:42 +00:00
|
|
|
# installed on the machine instead of downloading one.
|
|
|
|
use_installed_dotnet_cli=${use_installed_dotnet_cli:-true}
|
|
|
|
|
2019-08-02 12:38:38 +00:00
|
|
|
# Enable repos to use a particular version of the on-line dotnet-install scripts.
|
|
|
|
# default URL: https://dot.net/v1/dotnet-install.sh
|
|
|
|
dotnetInstallScriptVersion=${dotnetInstallScriptVersion:-'v1'}
|
|
|
|
|
2018-12-19 20:55:42 +00:00
|
|
|
# True to use global NuGet cache instead of restoring packages to repository-local directory.
|
|
|
|
if [[ "$ci" == true ]]; then
|
|
|
|
use_global_nuget_cache=${use_global_nuget_cache:-false}
|
|
|
|
else
|
|
|
|
use_global_nuget_cache=${use_global_nuget_cache:-true}
|
|
|
|
fi
|
2018-10-22 05:07:26 +00:00
|
|
|
|
2020-08-26 13:09:20 +00:00
|
|
|
# Used when restoring .NET SDK from alternative feeds
|
|
|
|
runtime_source_feed=${runtime_source_feed:-''}
|
|
|
|
runtime_source_feed_key=${runtime_source_feed_key:-''}
|
|
|
|
|
2020-09-01 13:00:44 +00:00
|
|
|
# Determines if dotnet-install.sh comes from the eng/common folder or the internet
|
|
|
|
# (default = public version)
|
|
|
|
use_default_dotnet_install=${use_default_dotnet_install:-false}
|
|
|
|
|
2018-12-19 20:55:42 +00:00
|
|
|
# Resolve any symlinks in the given path.
|
2018-10-22 05:07:26 +00:00
|
|
|
function ResolvePath {
|
|
|
|
local path=$1
|
|
|
|
|
|
|
|
while [[ -h $path ]]; do
|
|
|
|
local dir="$( cd -P "$( dirname "$path" )" && pwd )"
|
|
|
|
path="$(readlink "$path")"
|
|
|
|
|
|
|
|
# if $path was a relative symlink, we need to resolve it relative to the path where the
|
|
|
|
# symlink file was located
|
|
|
|
[[ $path != /* ]] && path="$dir/$path"
|
|
|
|
done
|
|
|
|
|
|
|
|
# return value
|
|
|
|
_ResolvePath="$path"
|
|
|
|
}
|
|
|
|
|
|
|
|
# ReadVersionFromJson [json key]
|
|
|
|
function ReadGlobalVersion {
|
|
|
|
local key=$1
|
|
|
|
|
2020-04-02 12:54:52 +00:00
|
|
|
local line=$(awk "/$key/ {print; exit}" "$global_json_file")
|
2018-10-22 05:07:26 +00:00
|
|
|
local pattern="\"$key\" *: *\"(.*)\""
|
|
|
|
|
|
|
|
if [[ ! $line =~ $pattern ]]; then
|
2019-11-22 13:41:58 +00:00
|
|
|
Write-PipelineTelemetryError -category 'Build' "Error: Cannot find \"$key\" in $global_json_file"
|
2018-10-22 05:07:26 +00:00
|
|
|
ExitWithExitCode 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
# return value
|
|
|
|
_ReadGlobalVersion=${BASH_REMATCH[1]}
|
|
|
|
}
|
|
|
|
|
|
|
|
function InitializeDotNetCli {
|
2018-12-19 20:55:42 +00:00
|
|
|
if [[ -n "${_InitializeDotNetCli:-}" ]]; then
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
|
2018-10-22 05:07:26 +00:00
|
|
|
local install=$1
|
|
|
|
|
|
|
|
# Don't resolve runtime, shared framework, or SDK from other locations to ensure build determinism
|
|
|
|
export DOTNET_MULTILEVEL_LOOKUP=0
|
|
|
|
|
|
|
|
# Disable first run since we want to control all package sources
|
|
|
|
export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1
|
|
|
|
|
2018-12-19 20:55:42 +00:00
|
|
|
# Disable telemetry on CI
|
|
|
|
if [[ $ci == true ]]; then
|
|
|
|
export DOTNET_CLI_TELEMETRY_OPTOUT=1
|
|
|
|
fi
|
|
|
|
|
|
|
|
# LTTNG is the logging infrastructure used by Core CLR. Need this variable set
|
|
|
|
# so it doesn't output warnings to the console.
|
|
|
|
export LTTNG_HOME="$HOME"
|
|
|
|
|
2018-10-22 05:07:26 +00:00
|
|
|
# Source Build uses DotNetCoreSdkDir variable
|
|
|
|
if [[ -n "${DotNetCoreSdkDir:-}" ]]; then
|
|
|
|
export DOTNET_INSTALL_DIR="$DotNetCoreSdkDir"
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Find the first path on $PATH that contains the dotnet.exe
|
2019-05-07 12:30:40 +00:00
|
|
|
if [[ "$use_installed_dotnet_cli" == true && $global_json_has_runtimes == false && -z "${DOTNET_INSTALL_DIR:-}" ]]; then
|
2018-10-22 05:07:26 +00:00
|
|
|
local dotnet_path=`command -v dotnet`
|
|
|
|
if [[ -n "$dotnet_path" ]]; then
|
|
|
|
ResolvePath "$dotnet_path"
|
|
|
|
export DOTNET_INSTALL_DIR=`dirname "$_ResolvePath"`
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
ReadGlobalVersion "dotnet"
|
|
|
|
local dotnet_sdk_version=$_ReadGlobalVersion
|
|
|
|
local dotnet_root=""
|
|
|
|
|
|
|
|
# Use dotnet installation specified in DOTNET_INSTALL_DIR if it contains the required SDK version,
|
|
|
|
# otherwise install the dotnet CLI and SDK to repo local .dotnet directory to avoid potential permission issues.
|
2019-05-07 12:30:40 +00:00
|
|
|
if [[ $global_json_has_runtimes == false && -n "${DOTNET_INSTALL_DIR:-}" && -d "$DOTNET_INSTALL_DIR/sdk/$dotnet_sdk_version" ]]; then
|
2018-10-22 05:07:26 +00:00
|
|
|
dotnet_root="$DOTNET_INSTALL_DIR"
|
|
|
|
else
|
|
|
|
dotnet_root="$repo_root/.dotnet"
|
2019-05-07 12:30:40 +00:00
|
|
|
|
2018-10-22 05:07:26 +00:00
|
|
|
export DOTNET_INSTALL_DIR="$dotnet_root"
|
|
|
|
|
|
|
|
if [[ ! -d "$DOTNET_INSTALL_DIR/sdk/$dotnet_sdk_version" ]]; then
|
|
|
|
if [[ "$install" == true ]]; then
|
|
|
|
InstallDotNetSdk "$dotnet_root" "$dotnet_sdk_version"
|
|
|
|
else
|
2019-06-14 12:10:56 +00:00
|
|
|
Write-PipelineTelemetryError -category 'InitializeToolset' "Unable to find dotnet with SDK version '$dotnet_sdk_version'"
|
2018-10-22 05:07:26 +00:00
|
|
|
ExitWithExitCode 1
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
2018-12-19 20:55:42 +00:00
|
|
|
# Add dotnet to PATH. This prevents any bare invocation of dotnet in custom
|
|
|
|
# build steps from using anything other than what we've downloaded.
|
2019-07-19 12:39:46 +00:00
|
|
|
Write-PipelinePrependPath -path "$dotnet_root"
|
2018-12-19 20:55:42 +00:00
|
|
|
|
2019-07-19 12:39:46 +00:00
|
|
|
Write-PipelineSetVariable -name "DOTNET_MULTILEVEL_LOOKUP" -value "0"
|
|
|
|
Write-PipelineSetVariable -name "DOTNET_SKIP_FIRST_TIME_EXPERIENCE" -value "1"
|
2019-01-11 13:12:40 +00:00
|
|
|
|
2018-10-22 05:07:26 +00:00
|
|
|
# return value
|
|
|
|
_InitializeDotNetCli="$dotnet_root"
|
|
|
|
}
|
|
|
|
|
|
|
|
function InstallDotNetSdk {
|
|
|
|
local root=$1
|
|
|
|
local version=$2
|
2020-08-26 13:09:20 +00:00
|
|
|
local architecture="unset"
|
|
|
|
if [[ $# -ge 3 ]]; then
|
2019-05-07 12:30:40 +00:00
|
|
|
architecture=$3
|
|
|
|
fi
|
2020-08-26 13:09:20 +00:00
|
|
|
InstallDotNet "$root" "$version" $architecture 'sdk' 'false' $runtime_source_feed $runtime_source_feed_key
|
2019-05-07 12:30:40 +00:00
|
|
|
}
|
2018-10-22 05:07:26 +00:00
|
|
|
|
2019-05-07 12:30:40 +00:00
|
|
|
function InstallDotNet {
|
|
|
|
local root=$1
|
|
|
|
local version=$2
|
2020-02-08 00:51:24 +00:00
|
|
|
|
2018-10-22 05:07:26 +00:00
|
|
|
GetDotNetInstallScript "$root"
|
|
|
|
local install_script=$_GetDotNetInstallScript
|
|
|
|
|
2019-05-07 12:30:40 +00:00
|
|
|
local archArg=''
|
2020-08-26 13:09:20 +00:00
|
|
|
if [[ -n "${3:-}" ]] && [ "$3" != 'unset' ]; then
|
2019-05-07 12:30:40 +00:00
|
|
|
archArg="--architecture $3"
|
|
|
|
fi
|
|
|
|
local runtimeArg=''
|
2020-08-26 13:09:20 +00:00
|
|
|
if [[ -n "${4:-}" ]] && [ "$4" != 'sdk' ]; then
|
2019-05-07 12:30:40 +00:00
|
|
|
runtimeArg="--runtime $4"
|
2019-02-06 13:45:20 +00:00
|
|
|
fi
|
2019-05-07 12:30:40 +00:00
|
|
|
local skipNonVersionedFilesArg=""
|
2020-08-26 13:09:20 +00:00
|
|
|
if [[ "$#" -ge "5" ]] && [[ "$5" != 'false' ]]; then
|
2019-05-07 12:30:40 +00:00
|
|
|
skipNonVersionedFilesArg="--skip-non-versioned-files"
|
|
|
|
fi
|
|
|
|
bash "$install_script" --version $version --install-dir "$root" $archArg $runtimeArg $skipNonVersionedFilesArg || {
|
2019-01-09 13:14:18 +00:00
|
|
|
local exit_code=$?
|
2020-08-26 13:09:20 +00:00
|
|
|
echo "Failed to install dotnet SDK from public location (exit code '$exit_code')."
|
2019-10-24 22:05:36 +00:00
|
|
|
|
2020-08-26 13:09:20 +00:00
|
|
|
local runtimeSourceFeed=''
|
|
|
|
if [[ -n "${6:-}" ]]; then
|
|
|
|
runtimeSourceFeed="--azure-feed $6"
|
|
|
|
fi
|
2019-10-24 22:05:36 +00:00
|
|
|
|
2020-08-26 13:09:20 +00:00
|
|
|
local runtimeSourceFeedKey=''
|
|
|
|
if [[ -n "${7:-}" ]]; then
|
|
|
|
# The 'base64' binary on alpine uses '-d' and doesn't support '--decode'
|
|
|
|
# '-d'. To work around this, do a simple detection and switch the parameter
|
|
|
|
# accordingly.
|
|
|
|
decodeArg="--decode"
|
|
|
|
if base64 --help 2>&1 | grep -q "BusyBox"; then
|
|
|
|
decodeArg="-d"
|
2019-10-24 22:05:36 +00:00
|
|
|
fi
|
2020-08-26 13:09:20 +00:00
|
|
|
decodedFeedKey=`echo $7 | base64 $decodeArg`
|
|
|
|
runtimeSourceFeedKey="--feed-credential $decodedFeedKey"
|
|
|
|
fi
|
2019-10-24 22:05:36 +00:00
|
|
|
|
2020-08-26 13:09:20 +00:00
|
|
|
if [[ -n "$runtimeSourceFeed" || -n "$runtimeSourceFeedKey" ]]; then
|
|
|
|
bash "$install_script" --version $version --install-dir "$root" $archArg $runtimeArg $skipNonVersionedFilesArg $runtimeSourceFeed $runtimeSourceFeedKey || {
|
|
|
|
local exit_code=$?
|
|
|
|
Write-PipelineTelemetryError -category 'InitializeToolset' "Failed to install dotnet SDK from custom location '$runtimeSourceFeed' (exit code '$exit_code')."
|
2019-12-12 13:30:39 +00:00
|
|
|
ExitWithExitCode $exit_code
|
2020-08-26 13:09:20 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
if [[ $exit_code != 0 ]]; then
|
|
|
|
Write-PipelineTelemetryError -category 'InitializeToolset' "Failed to install dotnet SDK from public location (exit code '$exit_code')."
|
2019-10-24 22:05:36 +00:00
|
|
|
fi
|
2020-08-26 13:09:20 +00:00
|
|
|
ExitWithExitCode $exit_code
|
2019-10-24 22:05:36 +00:00
|
|
|
fi
|
2019-01-09 13:14:18 +00:00
|
|
|
}
|
2018-10-22 05:07:26 +00:00
|
|
|
}
|
|
|
|
|
2020-02-08 00:51:24 +00:00
|
|
|
function with_retries {
|
|
|
|
local maxRetries=5
|
|
|
|
local retries=1
|
|
|
|
echo "Trying to run '$@' for maximum of $maxRetries attempts."
|
|
|
|
while [[ $((retries++)) -le $maxRetries ]]; do
|
|
|
|
"$@"
|
|
|
|
|
|
|
|
if [[ $? == 0 ]]; then
|
|
|
|
echo "Ran '$@' successfully."
|
|
|
|
return 0
|
|
|
|
fi
|
|
|
|
|
|
|
|
timeout=$((2**$retries-1))
|
|
|
|
echo "Failed to execute '$@'. Waiting $timeout seconds before next attempt ($retries out of $maxRetries)." 1>&2
|
|
|
|
sleep $timeout
|
|
|
|
done
|
|
|
|
|
|
|
|
echo "Failed to execute '$@' for $maxRetries times." 1>&2
|
|
|
|
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
|
2018-10-22 05:07:26 +00:00
|
|
|
function GetDotNetInstallScript {
|
|
|
|
local root=$1
|
|
|
|
local install_script="$root/dotnet-install.sh"
|
2019-08-02 12:38:38 +00:00
|
|
|
local install_script_url="https://dot.net/$dotnetInstallScriptVersion/dotnet-install.sh"
|
2018-10-22 05:07:26 +00:00
|
|
|
|
|
|
|
if [[ ! -a "$install_script" ]]; then
|
|
|
|
mkdir -p "$root"
|
|
|
|
|
2020-09-01 13:00:44 +00:00
|
|
|
if [[ "$use_default_dotnet_install" == true ]]; then
|
|
|
|
echo "Downloading '$install_script_url'"
|
2018-10-22 05:07:26 +00:00
|
|
|
|
2020-09-01 13:00:44 +00:00
|
|
|
# Use curl if available, otherwise use wget
|
|
|
|
if command -v curl > /dev/null; then
|
|
|
|
with_retries curl "$install_script_url" -sSL --retry 10 --create-dirs -o "$install_script" || {
|
|
|
|
local exit_code=$?
|
|
|
|
Write-PipelineTelemetryError -category 'InitializeToolset' "Failed to acquire dotnet install script (exit code '$exit_code')."
|
|
|
|
ExitWithExitCode $exit_code
|
|
|
|
}
|
|
|
|
else
|
|
|
|
with_retries wget -v -O "$install_script" "$install_script_url" || {
|
|
|
|
local exit_code=$?
|
|
|
|
Write-PipelineTelemetryError -category 'InitializeToolset' "Failed to acquire dotnet install script (exit code '$exit_code')."
|
|
|
|
ExitWithExitCode $exit_code
|
|
|
|
}
|
|
|
|
fi
|
2020-02-08 00:51:24 +00:00
|
|
|
else
|
2020-09-01 13:00:44 +00:00
|
|
|
# Use a special version of the script from eng/common that understands the existence of a "productVersion.txt" in a dotnet path.
|
|
|
|
# See https://github.com/dotnet/arcade/issues/6047 for details
|
|
|
|
cp $repo_root/eng/common/dotnet-install-scripts/dotnet-install.sh $install_script
|
2018-10-22 05:07:26 +00:00
|
|
|
fi
|
|
|
|
fi
|
2020-09-01 13:00:44 +00:00
|
|
|
|
2018-10-22 05:07:26 +00:00
|
|
|
# return value
|
|
|
|
_GetDotNetInstallScript="$install_script"
|
|
|
|
}
|
|
|
|
|
2018-12-19 20:55:42 +00:00
|
|
|
function InitializeBuildTool {
|
|
|
|
if [[ -n "${_InitializeBuildTool:-}" ]]; then
|
|
|
|
return
|
|
|
|
fi
|
2020-02-08 00:51:24 +00:00
|
|
|
|
2018-12-19 20:55:42 +00:00
|
|
|
InitializeDotNetCli $restore
|
|
|
|
|
2019-01-06 13:08:39 +00:00
|
|
|
# return values
|
2020-02-08 00:51:24 +00:00
|
|
|
_InitializeBuildTool="$_InitializeDotNetCli/dotnet"
|
2019-01-06 13:08:39 +00:00
|
|
|
_InitializeBuildToolCommand="msbuild"
|
2019-05-22 12:11:57 +00:00
|
|
|
_InitializeBuildToolFramework="netcoreapp2.1"
|
2018-12-19 20:55:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function GetNuGetPackageCachePath {
|
|
|
|
if [[ -z ${NUGET_PACKAGES:-} ]]; then
|
|
|
|
if [[ "$use_global_nuget_cache" == true ]]; then
|
|
|
|
export NUGET_PACKAGES="$HOME/.nuget/packages"
|
|
|
|
else
|
|
|
|
export NUGET_PACKAGES="$repo_root/.packages"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
# return value
|
|
|
|
_GetNuGetPackageCachePath=$NUGET_PACKAGES
|
|
|
|
}
|
|
|
|
|
2019-05-02 12:26:55 +00:00
|
|
|
function InitializeNativeTools() {
|
2019-11-02 12:56:53 +00:00
|
|
|
if [[ -n "${DisableNativeToolsetInstalls:-}" ]]; then
|
2019-10-24 22:05:36 +00:00
|
|
|
return
|
|
|
|
fi
|
2019-05-02 12:26:55 +00:00
|
|
|
if grep -Fq "native-tools" $global_json_file
|
|
|
|
then
|
|
|
|
local nativeArgs=""
|
|
|
|
if [[ "$ci" == true ]]; then
|
2019-07-27 12:35:24 +00:00
|
|
|
nativeArgs="--installDirectory $tools_dir"
|
2019-05-02 12:26:55 +00:00
|
|
|
fi
|
|
|
|
"$_script_dir/init-tools-native.sh" $nativeArgs
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2018-10-22 05:07:26 +00:00
|
|
|
function InitializeToolset {
|
2018-12-19 20:55:42 +00:00
|
|
|
if [[ -n "${_InitializeToolset:-}" ]]; then
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
|
|
|
|
GetNuGetPackageCachePath
|
|
|
|
|
2018-10-22 05:07:26 +00:00
|
|
|
ReadGlobalVersion "Microsoft.DotNet.Arcade.Sdk"
|
|
|
|
|
|
|
|
local toolset_version=$_ReadGlobalVersion
|
|
|
|
local toolset_location_file="$toolset_dir/$toolset_version.txt"
|
|
|
|
|
|
|
|
if [[ -a "$toolset_location_file" ]]; then
|
|
|
|
local path=`cat "$toolset_location_file"`
|
|
|
|
if [[ -a "$path" ]]; then
|
2018-12-19 20:55:42 +00:00
|
|
|
# return value
|
|
|
|
_InitializeToolset="$path"
|
2018-10-22 05:07:26 +00:00
|
|
|
return
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [[ "$restore" != true ]]; then
|
2019-06-14 12:10:56 +00:00
|
|
|
Write-PipelineTelemetryError -category 'InitializeToolset' "Toolset version $toolset_version has not been restored."
|
2018-10-22 05:07:26 +00:00
|
|
|
ExitWithExitCode 2
|
|
|
|
fi
|
|
|
|
|
|
|
|
local proj="$toolset_dir/restore.proj"
|
|
|
|
|
2019-02-15 13:37:10 +00:00
|
|
|
local bl=""
|
|
|
|
if [[ "$binary_log" == true ]]; then
|
|
|
|
bl="/bl:$log_dir/ToolsetRestore.binlog"
|
|
|
|
fi
|
2020-02-08 00:51:24 +00:00
|
|
|
|
2018-10-22 05:07:26 +00:00
|
|
|
echo '<Project Sdk="Microsoft.DotNet.Arcade.Sdk"/>' > "$proj"
|
2019-05-22 12:11:57 +00:00
|
|
|
MSBuild-Core "$proj" $bl /t:__WriteToolsetLocation /clp:ErrorsOnly\;NoSummary /p:__ToolsetLocationOutputFile="$toolset_location_file"
|
2018-10-22 05:07:26 +00:00
|
|
|
|
2018-12-19 20:55:42 +00:00
|
|
|
local toolset_build_proj=`cat "$toolset_location_file"`
|
2018-10-22 05:07:26 +00:00
|
|
|
|
|
|
|
if [[ ! -a "$toolset_build_proj" ]]; then
|
2019-11-22 13:41:58 +00:00
|
|
|
Write-PipelineTelemetryError -category 'Build' "Invalid toolset path: $toolset_build_proj"
|
2018-10-22 05:07:26 +00:00
|
|
|
ExitWithExitCode 3
|
|
|
|
fi
|
|
|
|
|
2018-12-19 20:55:42 +00:00
|
|
|
# return value
|
|
|
|
_InitializeToolset="$toolset_build_proj"
|
2018-10-22 05:07:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function ExitWithExitCode {
|
|
|
|
if [[ "$ci" == true && "$prepare_machine" == true ]]; then
|
|
|
|
StopProcesses
|
|
|
|
fi
|
|
|
|
exit $1
|
|
|
|
}
|
|
|
|
|
|
|
|
function StopProcesses {
|
|
|
|
echo "Killing running build processes..."
|
2019-01-09 13:14:18 +00:00
|
|
|
pkill -9 "dotnet" || true
|
|
|
|
pkill -9 "vbcscompiler" || true
|
2018-10-22 05:07:26 +00:00
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
|
|
|
function MSBuild {
|
2019-05-24 12:12:50 +00:00
|
|
|
local args=$@
|
2019-05-22 12:11:57 +00:00
|
|
|
if [[ "$pipelines_log" == true ]]; then
|
|
|
|
InitializeBuildTool
|
|
|
|
InitializeToolset
|
2019-09-13 12:37:37 +00:00
|
|
|
|
|
|
|
if [[ "$ci" == true ]]; then
|
2019-10-24 22:05:36 +00:00
|
|
|
export NUGET_PLUGIN_HANDSHAKE_TIMEOUT_IN_SECONDS=20
|
|
|
|
export NUGET_PLUGIN_REQUEST_TIMEOUT_IN_SECONDS=20
|
|
|
|
Write-PipelineSetVariable -name "NUGET_PLUGIN_HANDSHAKE_TIMEOUT_IN_SECONDS" -value "20"
|
|
|
|
Write-PipelineSetVariable -name "NUGET_PLUGIN_REQUEST_TIMEOUT_IN_SECONDS" -value "20"
|
2019-09-13 12:37:37 +00:00
|
|
|
fi
|
|
|
|
|
2019-05-24 12:12:50 +00:00
|
|
|
local toolset_dir="${_InitializeToolset%/*}"
|
|
|
|
local logger_path="$toolset_dir/$_InitializeBuildToolFramework/Microsoft.DotNet.Arcade.Sdk.dll"
|
|
|
|
args=( "${args[@]}" "-logger:$logger_path" )
|
2019-05-22 12:11:57 +00:00
|
|
|
fi
|
2019-05-24 12:12:50 +00:00
|
|
|
|
2019-05-22 12:11:57 +00:00
|
|
|
MSBuild-Core ${args[@]}
|
|
|
|
}
|
|
|
|
|
|
|
|
function MSBuild-Core {
|
2018-12-19 20:55:42 +00:00
|
|
|
if [[ "$ci" == true ]]; then
|
2020-05-12 12:48:04 +00:00
|
|
|
if [[ "$binary_log" != true && "$exclude_ci_binary_log" != true ]]; then
|
|
|
|
Write-PipelineTelemetryError -category 'Build' "Binary log must be enabled in CI build, or explicitly opted-out from with the -noBinaryLog switch."
|
2018-12-19 20:55:42 +00:00
|
|
|
ExitWithExitCode 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [[ "$node_reuse" == true ]]; then
|
2019-11-22 13:41:58 +00:00
|
|
|
Write-PipelineTelemetryError -category 'Build' "Node reuse must be disabled in CI build."
|
2018-12-19 20:55:42 +00:00
|
|
|
ExitWithExitCode 1
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
InitializeBuildTool
|
|
|
|
|
2018-10-22 05:07:26 +00:00
|
|
|
local warnaserror_switch=""
|
2018-12-19 20:55:42 +00:00
|
|
|
if [[ $warn_as_error == true ]]; then
|
2018-10-22 05:07:26 +00:00
|
|
|
warnaserror_switch="/warnaserror"
|
|
|
|
fi
|
|
|
|
|
2020-04-24 17:34:25 +00:00
|
|
|
function RunBuildTool {
|
|
|
|
export ARCADE_BUILD_TOOL_COMMAND="$_InitializeBuildTool $@"
|
|
|
|
|
|
|
|
"$_InitializeBuildTool" "$@" || {
|
|
|
|
local exit_code=$?
|
|
|
|
Write-PipelineTaskError "Build failed (exit code '$exit_code')."
|
|
|
|
ExitWithExitCode $exit_code
|
|
|
|
}
|
2019-01-09 13:14:18 +00:00
|
|
|
}
|
2020-04-24 17:34:25 +00:00
|
|
|
|
|
|
|
RunBuildTool "$_InitializeBuildToolCommand" /m /nologo /clp:Summary /v:$verbosity /nr:$node_reuse $warnaserror_switch /p:TreatWarningsAsErrors=$warn_as_error /p:ContinuousIntegrationBuild=$ci "$@"
|
2018-10-22 05:07:26 +00:00
|
|
|
}
|
|
|
|
|
2018-12-19 20:55:42 +00:00
|
|
|
ResolvePath "${BASH_SOURCE[0]}"
|
|
|
|
_script_dir=`dirname "$_ResolvePath"`
|
|
|
|
|
2019-06-22 12:29:08 +00:00
|
|
|
. "$_script_dir/pipeline-logging-functions.sh"
|
|
|
|
|
2018-12-19 20:55:42 +00:00
|
|
|
eng_root=`cd -P "$_script_dir/.." && pwd`
|
|
|
|
repo_root=`cd -P "$_script_dir/../.." && pwd`
|
|
|
|
artifacts_dir="$repo_root/artifacts"
|
|
|
|
toolset_dir="$artifacts_dir/toolset"
|
2019-05-02 12:26:55 +00:00
|
|
|
tools_dir="$repo_root/.tools"
|
2018-12-19 20:55:42 +00:00
|
|
|
log_dir="$artifacts_dir/log/$configuration"
|
|
|
|
temp_dir="$artifacts_dir/tmp/$configuration"
|
|
|
|
|
|
|
|
global_json_file="$repo_root/global.json"
|
2019-05-07 12:30:40 +00:00
|
|
|
# determine if global.json contains a "runtimes" entry
|
|
|
|
global_json_has_runtimes=false
|
2020-04-02 12:54:52 +00:00
|
|
|
dotnetlocal_key=$(awk "/runtimes/ {print; exit}" "$global_json_file") || true
|
2019-05-07 12:30:40 +00:00
|
|
|
if [[ -n "$dotnetlocal_key" ]]; then
|
|
|
|
global_json_has_runtimes=true
|
|
|
|
fi
|
2018-12-19 20:55:42 +00:00
|
|
|
|
2018-10-22 05:07:26 +00:00
|
|
|
# HOME may not be defined in some scenarios, but it is required by NuGet
|
|
|
|
if [[ -z $HOME ]]; then
|
|
|
|
export HOME="$repo_root/artifacts/.home/"
|
|
|
|
mkdir -p "$HOME"
|
|
|
|
fi
|
|
|
|
|
|
|
|
mkdir -p "$toolset_dir"
|
2018-12-19 20:55:42 +00:00
|
|
|
mkdir -p "$temp_dir"
|
2018-10-22 05:07:26 +00:00
|
|
|
mkdir -p "$log_dir"
|
|
|
|
|
2019-07-19 12:39:46 +00:00
|
|
|
Write-PipelineSetVariable -name "Artifacts" -value "$artifacts_dir"
|
|
|
|
Write-PipelineSetVariable -name "Artifacts.Toolset" -value "$toolset_dir"
|
|
|
|
Write-PipelineSetVariable -name "Artifacts.Log" -value "$log_dir"
|
|
|
|
Write-PipelineSetVariable -name "Temp" -value "$temp_dir"
|
|
|
|
Write-PipelineSetVariable -name "TMP" -value "$temp_dir"
|
2019-10-24 22:05:36 +00:00
|
|
|
|
|
|
|
# Import custom tools configuration, if present in the repo.
|
2019-11-22 13:41:58 +00:00
|
|
|
if [ -z "${disable_configure_toolset_import:-}" ]; then
|
2019-10-24 22:05:36 +00:00
|
|
|
configure_toolset_script="$eng_root/configure-toolset.sh"
|
|
|
|
if [[ -a "$configure_toolset_script" ]]; then
|
|
|
|
. "$configure_toolset_script"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
# TODO: https://github.com/dotnet/arcade/issues/1468
|
|
|
|
# Temporary workaround to avoid breaking change.
|
|
|
|
# Remove once repos are updated.
|
|
|
|
if [[ -n "${useInstalledDotNetCli:-}" ]]; then
|
|
|
|
use_installed_dotnet_cli="$useInstalledDotNetCli"
|
|
|
|
fi
|