Skip to content

Commit

Permalink
Configure MSBuild debug path and save any logs
Browse files Browse the repository at this point in the history
We have had many problems in the CI with MSBuild failing, and not
capturing the failure logs.

See https://github.com/dotnet/coreclr/issues/20236.

So, for all msbuild invocations, set MSBUILDDEBUGPATH to a new,
distinguished, subdirectory of the bin\Logs directory, named
"MsbuildDebugLogs". Change the CI to upload any log files found
there.
  • Loading branch information
BruceForstall committed Feb 5, 2019
1 parent 7e20b6f commit f471342
Show file tree
Hide file tree
Showing 7 changed files with 51 additions and 9 deletions.
5 changes: 5 additions & 0 deletions build-test.cmd
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ set "__SourceDir=%__ProjectDir%\src"
set "__PackagesDir=%__ProjectDir%\packages"
set "__RootBinDir=%__ProjectDir%\bin"
set "__LogsDir=%__RootBinDir%\Logs"
set "__MsbuildDebugLogsDir=%__LogsDir%\MsbuildDebugLogs"

:: Default __Exclude to issues.targets
set __Exclude=%__TestDir%\issues.targets
Expand Down Expand Up @@ -158,6 +159,10 @@ if not exist "%__TestBinDir%" md "%__TestBinDir%"
if not exist "%__NativeTestIntermediatesDir%" md "%__NativeTestIntermediatesDir%"
if not exist "%__ManagedTestIntermediatesDir%" md "%__ManagedTestIntermediatesDir%"
if not exist "%__LogsDir%" md "%__LogsDir%"
if not exist "%__MsbuildDebugLogsDir%" md "%__MsbuildDebugLogsDir%"

REM Set up the directory for MSBuild debug logs.
set MSBUILDDEBUGPATH=%__MsbuildDebugLogsDir%

echo %__MsgPrefix%Checking prerequisites

Expand Down
15 changes: 15 additions & 0 deletions build-test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,13 @@ generate_layout()
echo "Creating LogsDir: ${__LogsDir}"
mkdir -p $__LogsDir
fi
if [ ! -f "$__MsbuildDebugLogsDir" ]; then
echo "Creating MsbuildDebugLogsDir: ${__MsbuildDebugLogsDir}"
mkdir -p $__MsbuildDebugLogsDir
fi

# Set up the directory for MSBuild debug logs.
export MSBUILDDEBUGPATH="${__MsbuildDebugLogsDir}"

__BuildProperties="-p:OSGroup=${__BuildOS} -p:BuildOS=${__BuildOS} -p:BuildArch=${__BuildArch} -p:BuildType=${__BuildType}"

Expand Down Expand Up @@ -283,6 +290,13 @@ build_Tests()
echo "Creating LogsDir: ${__LogsDir}"
mkdir -p $__LogsDir
fi
if [ ! -f "$__MsbuildDebugLogsDir" ]; then
echo "Creating MsbuildDebugLogsDir: ${__MsbuildDebugLogsDir}"
mkdir -p $__MsbuildDebugLogsDir
fi

# Set up the directory for MSBuild debug logs.
export MSBUILDDEBUGPATH="${__MsbuildDebugLogsDir}"

__BuildProperties="-p:OSGroup=${__BuildOS} -p:BuildOS=${__BuildOS} -p:BuildArch=${__BuildArch} -p:BuildType=${__BuildType}"

Expand Down Expand Up @@ -898,6 +912,7 @@ fi

# Set dependent variables
__LogsDir="$__RootBinDir/Logs"
__MsbuildDebugLogsDir="$__LogsDir/MsbuildDebugLogs"

# init the host distro name
initHostDistroRid
Expand Down
11 changes: 8 additions & 3 deletions build.cmd
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ set "__PackagesDir=%DotNetRestorePackagesPath%"
if [%__PackagesDir%]==[] set "__PackagesDir=%__ProjectDir%\packages"
set "__RootBinDir=%__ProjectDir%\bin"
set "__LogsDir=%__RootBinDir%\Logs"
set "__MsbuildDebugLogsDir=%__LogsDir%\MsbuildDebugLogs"

set __BuildAll=

Expand Down Expand Up @@ -319,9 +320,13 @@ REM Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
set "__CMakeBinDir=%__BinDir%"
set "__CMakeBinDir=%__CMakeBinDir:\=/%"

if not exist "%__BinDir%" md "%__BinDir%"
if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
if not exist "%__LogsDir%" md "%__LogsDir%"
if not exist "%__BinDir%" md "%__BinDir%"
if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
if not exist "%__LogsDir%" md "%__LogsDir%"
if not exist "%__MsbuildDebugLogsDir%" md "%__MsbuildDebugLogsDir%"

REM Set up the directory for MSBuild debug logs.
set MSBUILDDEBUGPATH=%__MsbuildDebugLogsDir%

REM It is convenient to have your Nuget search path include the location where the build
REM will place packages. However nuget used during the build will fail if that directory
Expand Down
5 changes: 5 additions & 0 deletions build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ setup_dirs()
mkdir -p "$__RootBinDir"
mkdir -p "$__BinDir"
mkdir -p "$__LogsDir"
mkdir -p "$__MsbuildDebugLogsDir"
mkdir -p "$__IntermediatesDir"

if [ $__CrossBuild == 1 ]; then
Expand Down Expand Up @@ -996,6 +997,7 @@ fi

# Set dependent variables
__LogsDir="$__RootBinDir/Logs"
__MsbuildDebugLogsDir="$__LogsDir/MsbuildDebugLogs"

# init the host distro name
initHostDistroRid
Expand Down Expand Up @@ -1047,6 +1049,9 @@ initTargetDistroRid
# Make the directories necessary for build if they don't exist
setup_dirs

# Set up the directory for MSBuild debug logs.
export MSBUILDDEBUGPATH="${__MsbuildDebugLogsDir}"

# Check prereqs.
check_prereqs

Expand Down
8 changes: 4 additions & 4 deletions netci.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -2246,7 +2246,7 @@ def static calculateBuildCommands(def newJob, def scenario, def branch, def isPR
}

// Archive the logs, even if the build failed (which is when they are most interesting).
Utilities.addArchival(newJob, "bin/Logs/*.log,bin/Logs/*.wrn,bin/Logs/*.err", "", /* doNotFailIfNothingArchived */ true, /* archiveOnlyIfSuccessful */ false)
Utilities.addArchival(newJob, "bin/Logs/*.log,bin/Logs/*.wrn,bin/Logs/*.err,bin/Logs/MsbuildDebugLogs/*", "", /* doNotFailIfNothingArchived */ true, /* archiveOnlyIfSuccessful */ false)
break
case 'arm':
case 'arm64':
Expand Down Expand Up @@ -2298,7 +2298,7 @@ def static calculateBuildCommands(def newJob, def scenario, def branch, def isPR
}

// Archive the logs, even if the build failed (which is when they are most interesting).
Utilities.addArchival(newJob, "bin/Logs/*.log,bin/Logs/*.wrn,bin/Logs/*.err", "", /* doNotFailIfNothingArchived */ true, /* archiveOnlyIfSuccessful */ false)
Utilities.addArchival(newJob, "bin/Logs/*.log,bin/Logs/*.wrn,bin/Logs/*.err,bin/Logs/MsbuildDebugLogs/*", "", /* doNotFailIfNothingArchived */ true, /* archiveOnlyIfSuccessful */ false)
break
default:
println("Unknown architecture: ${architecture}");
Expand Down Expand Up @@ -2422,7 +2422,7 @@ def static calculateBuildCommands(def newJob, def scenario, def branch, def isPR
}

// Archive the logs, even if the build failed (which is when they are most interesting).
Utilities.addArchival(newJob, "bin/Logs/*.log,bin/Logs/*.wrn,bin/Logs/*.err", "", /* doNotFailIfNothingArchived */ true, /* archiveOnlyIfSuccessful */ false)
Utilities.addArchival(newJob, "bin/Logs/*.log,bin/Logs/*.wrn,bin/Logs/*.err,bin/Logs/MsbuildDebugLogs/*", "", /* doNotFailIfNothingArchived */ true, /* archiveOnlyIfSuccessful */ false)
break
case 'armem':
// Emulator cross builds for ARM runs on Tizen currently
Expand Down Expand Up @@ -2547,7 +2547,7 @@ def static calculateBuildCommands(def newJob, def scenario, def branch, def isPR
}

// Archive the logs, even if the build failed (which is when they are most interesting).
Utilities.addArchival(newJob, "bin/Logs/*.log,bin/Logs/*.wrn,bin/Logs/*.err", "", /* doNotFailIfNothingArchived */ true, /* archiveOnlyIfSuccessful */ false)
Utilities.addArchival(newJob, "bin/Logs/*.log,bin/Logs/*.wrn,bin/Logs/*.err,bin/Logs/MsbuildDebugLogs/*", "", /* doNotFailIfNothingArchived */ true, /* archiveOnlyIfSuccessful */ false)

// We need to clean up the build machines; the docker build leaves newly built files with root permission, which
// the cleanup task in Jenkins can't remove.
Expand Down
7 changes: 6 additions & 1 deletion tests/runtest.cmd
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ if %__ProjectDir:~-1%==\ set "__ProjectDir=%__ProjectDir:~0,-1%"
set "__ProjectFilesDir=%__ProjectDir%"
set "__RootBinDir=%__ProjectDir%\..\bin"
set "__LogsDir=%__RootBinDir%\Logs"
set "__MsbuildDebugLogsDir=%__LogsDir%\MsbuildDebugLogs"

set __Sequential=
set __msbuildExtraArgs=
Expand Down Expand Up @@ -283,7 +284,11 @@ if defined DoLink (
set __msbuildCommonArgs=%__msbuildCommonArgs% /p:RunTestsViaIllink=true
)

if not exist %__LogsDir% md %__LogsDir%
if not exist "%__LogsDir%" md "%__LogsDir%"
if not exist "%__MsbuildDebugLogsDir%" md "%__MsbuildDebugLogsDir%"

REM Set up the directory for MSBuild debug logs.
set MSBUILDDEBUGPATH=%__MsbuildDebugLogsDir%

REM These log files are created automatically by the test run process. Q: what do they depend on being set?
set __TestRunHtmlLog=%__LogsDir%\TestRun_%__BuildOS%__%__BuildArch%__%__BuildType%.html
Expand Down
9 changes: 8 additions & 1 deletion tests/runtest.py
Original file line number Diff line number Diff line change
Expand Up @@ -640,7 +640,14 @@ def call_msbuild(coreclr_repo_location,
logs_dir = os.path.join(coreclr_repo_location, "bin", "Logs")
if not os.path.isdir(logs_dir):
os.makedirs(logs_dir)


msbuild_debug_logs_dir = os.path.join(logs_dir, "MsbuildDebugLogs")
if not os.path.isdir(msbuild_debug_logs_dir):
os.makedirs(msbuild_debug_logs_dir)

# Set up the directory for MSBuild debug logs.
os.environ["MSBUILDDEBUGPATH"] = msbuild_debug_logs_dir

command = [dotnetcli_location,
"msbuild",
os.path.join(coreclr_repo_location, "tests", "runtest.proj"),
Expand Down

0 comments on commit f471342

Please sign in to comment.