182 строки
6.1 KiB
Bash
Executable File
182 строки
6.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -ue
|
|
|
|
source="${BASH_SOURCE[0]}"
|
|
|
|
# resolve $source until the file is no longer a symlink
|
|
while [[ -h "$source" ]]; do
|
|
scriptroot="$( cd -P "$( dirname "$source" )" && pwd )"
|
|
source="$(readlink "$source")"
|
|
# if $source was a relative symlink, we need to resolve it relative to the path where the
|
|
# symlink file was located
|
|
[[ $source != /* ]] && source="$scriptroot/$source"
|
|
done
|
|
scriptroot="$( cd -P "$( dirname "$source" )" && pwd )"
|
|
|
|
usage()
|
|
{
|
|
echo "Common settings:"
|
|
echo " --arch (-a) Target platform: x86, x64, arm or arm64."
|
|
echo " [Default: Your machine's architecture.]"
|
|
echo " --binaryLog (-bl) Output binary log."
|
|
echo " --configuration (-c) Build configuration: Debug or Release."
|
|
echo " [Default: Debug]"
|
|
echo " --help (-h) Print help and exit."
|
|
echo " --os Target operating system: windows, linux, or osx."
|
|
echo " [Default: Your machine's OS.]"
|
|
echo " --verbosity (-v) MSBuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic]."
|
|
echo " [Default: Minimal]"
|
|
echo ""
|
|
|
|
echo "Actions (defaults to --restore --build):"
|
|
echo " --build (-b) Build all source projects."
|
|
echo " This assumes --restore has been run already."
|
|
echo " --clean Clean the solution."
|
|
echo " --pack Package build outputs into NuGet packages."
|
|
echo " --publish Publish artifacts (e.g. symbols)."
|
|
echo " This assumes --build has been run already."
|
|
echo " --rebuild Rebuild all source projects."
|
|
echo " --restore (-r) Restore dependencies."
|
|
echo " --sign Sign build outputs."
|
|
echo " --test (-t) Incrementally builds and runs tests."
|
|
echo " Use in conjunction with --testnobuild to only run tests."
|
|
echo " --testCoverage Run unit tests and capture code coverage information."
|
|
echo ""
|
|
|
|
echo "Libraries settings:"
|
|
echo " --testnobuild Skip building tests when invoking -test."
|
|
echo ""
|
|
|
|
echo "Command line arguments starting with '/p:' are passed through to MSBuild."
|
|
echo "Arguments can also be passed in with a single hyphen."
|
|
echo ""
|
|
}
|
|
|
|
arguments=''
|
|
extraargs=''
|
|
testCoverage=false
|
|
|
|
# Check if an action is passed in
|
|
declare -a actions=("b" "build" "r" "restore" "rebuild" "testnobuild" "sign" "publish" "clean")
|
|
actInt=($(comm -12 <(printf '%s\n' "${actions[@]/#/-}" | sort) <(printf '%s\n' "${@/#--/-}" | sort)))
|
|
|
|
while [[ $# > 0 ]]; do
|
|
opt="$(echo "${1/#--/-}" | tr "[:upper:]" "[:lower:]")"
|
|
|
|
case "$opt" in
|
|
-help|-h|-\?|/?)
|
|
usage
|
|
exit 0
|
|
;;
|
|
|
|
-arch|-a)
|
|
if [ -z ${2+x} ]; then
|
|
echo "No architecture supplied. See help (--help) for supported architectures." 1>&2
|
|
exit 1
|
|
fi
|
|
passedArch="$(echo "$2" | tr "[:upper:]" "[:lower:]")"
|
|
case "$passedArch" in
|
|
x64|x86|arm|arm64)
|
|
arch=$passedArch
|
|
;;
|
|
*)
|
|
echo "Unsupported target architecture '$2'."
|
|
echo "The allowed values are x86, x64, arm, arm64."
|
|
exit 1
|
|
;;
|
|
esac
|
|
arguments="$arguments /p:TargetArchitecture=$arch"
|
|
shift 2
|
|
;;
|
|
|
|
-configuration|-c)
|
|
if [ -z ${2+x} ]; then
|
|
echo "No configuration supplied. See help (--help) for supported configurations." 1>&2
|
|
exit 1
|
|
fi
|
|
passedConfig="$(echo "$2" | tr "[:upper:]" "[:lower:]")"
|
|
case "$passedConfig" in
|
|
debug|release)
|
|
val="$(tr '[:lower:]' '[:upper:]' <<< ${passedConfig:0:1})${passedConfig:1}"
|
|
;;
|
|
*)
|
|
echo "Unsupported target configuration '$2'."
|
|
echo "The allowed values are Debug and Release."
|
|
exit 1
|
|
;;
|
|
esac
|
|
arguments="$arguments -configuration $val"
|
|
shift 2
|
|
;;
|
|
|
|
-os)
|
|
if [ -z ${2+x} ]; then
|
|
echo "No target operating system supplied. See help (--help) for supported target operating systems." 1>&2
|
|
exit 1
|
|
fi
|
|
passedOS="$(echo "$2" | tr "[:upper:]" "[:lower:]")"
|
|
case "$passedOS" in
|
|
windows)
|
|
os="windows" ;;
|
|
linux)
|
|
os="linux" ;;
|
|
osx)
|
|
os="osx" ;;
|
|
*)
|
|
echo "Unsupported target OS '$2'."
|
|
echo "Try 'build.sh --help' for values supported by '--os'."
|
|
exit 1
|
|
;;
|
|
esac
|
|
arguments="$arguments /p:TargetOS=$os"
|
|
shift 2
|
|
;;
|
|
|
|
-testnobuild)
|
|
arguments="$arguments /p:TestNoBuild=true"
|
|
shift 1
|
|
;;
|
|
|
|
-testcoverage)
|
|
testCoverage=true
|
|
;;
|
|
|
|
*)
|
|
extraargs="$extraargs $1"
|
|
shift 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [ ${#actInt[@]} -eq 0 ]; then
|
|
arguments="-restore -build $arguments"
|
|
fi
|
|
|
|
if [[ "${TreatWarningsAsErrors:-}" == "false" ]]; then
|
|
arguments="$arguments -warnAsError 0"
|
|
fi
|
|
|
|
arguments="$arguments $extraargs"
|
|
"$scriptroot/common/build.sh" $arguments
|
|
|
|
|
|
# Perform code coverage as the last operation, this enables the following scenarios:
|
|
# .\build.sh --restore --build --c Release --testCoverage
|
|
if [[ "$testCoverage" == true ]]; then
|
|
# Install required toolset
|
|
. "$DIR/common/tools.sh"
|
|
InitializeDotNetCli true > /dev/null
|
|
|
|
repoRoot=$(realpath $DIR/../)
|
|
testResultPath="$repoRoot/artifacts/TestResults/$configuration"
|
|
|
|
# Run tests and collect code coverage
|
|
$repoRoot/.dotnet/dotnet 'dotnet-coverage' collect --settings $repoRoot/eng/CodeCoverage.config --output $testResultPath/local.cobertura.xml "$repoRoot/build.sh --test --configuration $configuration"
|
|
|
|
# Generate the code coverage report and open it in the browser
|
|
$repoRoot/.dotnet/dotnet reportgenerator -reports:$testResultPath/*.cobertura.xml -targetdir:$testResultPath/CoverageResultsHtml -reporttypes:HtmlInline_AzurePipelines
|
|
echo ""
|
|
echo -e "\e[32mCode coverage results:\e[0m $testResultPath/CoverageResultsHtml/index.html"
|
|
echo ""
|
|
fi |