diff --git a/.azure/pipelines/ci.yml b/.azure/pipelines/ci.yml
index f25afe0f13ed9cd1ae7042c4d82383fc7aa15e81..dabf8e3987603663ec9fa20d200f20530b0abbc6 100644
--- a/.azure/pipelines/ci.yml
+++ b/.azure/pipelines/ci.yml
@@ -19,8 +19,6 @@ pr:
     - '*'
 
 variables:
-- name: DOTNET_CLI_HOME
-  value: $(Agent.BuildDirectory)
 - name: DOTNET_SKIP_FIRST_TIME_EXPERIENCE
   value: true
 - name: _TeamName
@@ -704,14 +702,16 @@ stages:
       vmImage: 'ubuntu-16.04'
     variables:
       DotNetCoreSdkDir: $(Agent.ToolsDirectory)/dotnet
+      # This isn't needed in the path because build does not need to _use_ global tools.
+      DOTNET_CLI_HOME: $(System.DefaultWorkingDirectory)
       DOTNET_SYSTEM_GLOBALIZATION_INVARIANT: true
     steps:
     - script: |
         source eng/common/native/common-library.sh
-        mkdir -p $HOME/bin
-        GetFile https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 $HOME/bin/jq
-        chmod +x $HOME/bin/jq
-        echo "##vso[task.prependpath]$HOME/bin"
+        mkdir -p $(System.DefaultWorkingDirectory)/.tools
+        GetFile https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 $(System.DefaultWorkingDirectory)/.tools/jq
+        chmod +x $(System.DefaultWorkingDirectory)/.tools/jq
+        echo "##vso[task.prependpath]$(System.DefaultWorkingDirectory)/.tools"
       displayName: Install jq
     - ${{ if ne(variables['System.TeamProject'], 'public') }}:
         - task: Bash@3
diff --git a/.azure/pipelines/jobs/default-build.yml b/.azure/pipelines/jobs/default-build.yml
index de26377e9ba2aa79c4e3a13761a0578e7f438d23..58619deed73e2e8200fb5faefcc24e36032bb0c1 100644
--- a/.azure/pipelines/jobs/default-build.yml
+++ b/.azure/pipelines/jobs/default-build.yml
@@ -52,7 +52,7 @@ parameters:
   condition: ''
   # jobName: '' - use agentOs by default.
   # jobDisplayName: '' - use agentOs by default.
-  artifacts:  []
+  artifacts: []
   buildDirectory: ''
   buildScript: ''
   installTar: true
@@ -80,7 +80,7 @@ jobs:
       enableMicrobuild: true
       enablePublishBuildAssets: true
       enablePublishUsingPipelines: ${{ variables._PublishUsingPipelines }}
-    enablePublishTestResults: true # publish test results to AzDO (populates AzDO Tests tab)
+    enablePublishTestResults: ${{ eq(parameters.isTestingJob, 'true') }} # publish test results to AzDO (populates AzDO Tests tab)
     enableTelemetry: true
     helixRepo: dotnet/aspnetcore
     helixType: build.product/
@@ -116,12 +116,13 @@ jobs:
     - BuildScriptArgs: ${{ parameters.buildArgs }}
     - _BuildConfig: ${{ parameters.configuration }}
     - BuildConfiguration: ${{ parameters.configuration }}
-    - BuildDirectory: ${{ parameters.buildDirectory }}
-    - DOTNET_CLI_HOME: $(Agent.BuildDirectory)
+    - ${{ if eq(parameters.buildDirectory, '') }}:
+      - BuildDirectory: $(System.DefaultWorkingDirectory)
+    - ${{ if ne(parameters.buildDirectory, '') }}:
+      - BuildDirectory: ${{ parameters.buildDirectory }}
+    - DOTNET_CLI_HOME: $(System.DefaultWorkingDirectory)
     - DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
     - TeamName: AspNetCore
-    - ${{ if and(eq(parameters.installJdk, 'true'), eq(parameters.agentOs, 'Windows')) }}:
-      - JAVA_HOME: $(Agent.BuildDirectory)\.tools\jdk\win-x64
     - ${{ if or(ne(parameters.codeSign, true), ne(variables['System.TeamProject'], 'internal')) }}:
       - _SignType: ''
     - ${{ if and(eq(parameters.codeSign, true), eq(variables['System.TeamProject'], 'internal')) }}:
@@ -164,6 +165,12 @@ jobs:
     - ${{ if and(eq(parameters.installTar, 'true'), eq(parameters.agentOs, 'Windows')) }}:
       - powershell: ./eng/scripts/InstallTar.ps1
         displayName: Find or install Tar
+    - ${{ if eq(parameters.agentOs, 'Windows') }}:
+      - powershell: Write-Host "##vso[task.prependpath]$(DOTNET_CLI_HOME)\.dotnet\tools"
+        displayName: Add dotnet tools to path
+    - ${{ if ne(parameters.agentOs, 'Windows') }}:
+      - script: echo "##vso[task.prependpath]$(DOTNET_CLI_HOME)/.dotnet/tools"
+        displayName: Add dotnet tools to path
 
     - ${{ parameters.beforeBuild }}
 
@@ -191,10 +198,10 @@ jobs:
     - ${{ if eq(parameters.steps, '')}}:
       - ${{ if eq(parameters.buildScript, '') }}:
         - ${{ if eq(parameters.agentOs, 'Windows') }}:
-          - script: .\$(BuildDirectory)\build.cmd -ci -nobl -Configuration $(BuildConfiguration) $(BuildScriptArgs) /p:DotNetSignType=$(_SignType)
+          - script: $(BuildDirectory)\build.cmd -ci -nobl -Configuration $(BuildConfiguration) $(BuildScriptArgs) /p:DotNetSignType=$(_SignType)
             displayName: Run build.cmd
         - ${{ if ne(parameters.agentOs, 'Windows') }}:
-          - script: ./$(BuildDirectory)/build.sh --ci --nobl --configuration $(BuildConfiguration) $(BuildScriptArgs)
+          - script: $(BuildDirectory)/build.sh --ci --nobl --configuration $(BuildConfiguration) $(BuildScriptArgs)
             displayName: Run build.sh
       - ${{ if ne(parameters.buildScript, '') }}:
         - script: $(BuildScript) -ci -nobl -Configuration $(BuildConfiguration) $(BuildScriptArgs)
@@ -232,10 +239,7 @@ jobs:
         condition: and(or(succeeded(), eq('${{ artifact.publishOnError }}', 'true')), or(eq(variables['system.pullrequest.isfork'], false), eq('${{ artifact.includeForks }}', 'true')))
         continueOnError: true
         inputs:
-          ${{ if eq(parameters.buildDirectory, '') }}:
-            pathtoPublish: ${{ artifact.path }}
-          ${{ if ne(parameters.buildDirectory, '') }}:
-            pathtoPublish: ${{ parameters.buildDirectory }}\${{ artifact.path }}
+          pathtoPublish: $(BuildDirectory)/${{ artifact.path }}
           ${{ if eq(artifact.name, '') }}:
             artifactName: artifacts-$(AgentOsName)-$(BuildConfiguration)
           ${{ if ne(artifact.name, '') }}:
@@ -243,18 +247,7 @@ jobs:
           artifactType: Container
           parallel: true
 
-    - ${{ if eq(parameters.isTestingJob, true) }}:
-      - task: PublishTestResults@2
-        displayName: Publish VSTest test results
-        condition: always()
-        continueOnError: true
-        inputs:
-          testRunTitle: $(AgentOsName)-$(BuildConfiguration)
-          testRunner: vstest
-          testResultsFiles: '**/artifacts/**/*.trx'
-          mergeTestResults: true
-          buildConfiguration: $(BuildConfiguration)
-          buildPlatform: $(AgentOsName)
+    - ${{ if and(eq(parameters.isTestingJob, true), ne(parameters.jobName, 'Windows_Templates_Test')) }}:
       - task: PublishTestResults@2
         displayName: Publish js test results
         condition: always()
@@ -263,12 +256,3 @@ jobs:
           testResultsFiles: '**/artifacts/log/**/*.junit.xml'
           buildConfiguration: $(BuildConfiguration)
           buildPlatform: $(AgentOsName)
-      - task: PublishTestResults@2
-        displayName: Publish Java test results
-        condition: always()
-        inputs:
-          testRunner: junit
-          testResultsFiles: '**/TEST-junit-jupiter.xml'
-          buildConfiguration: $(BuildConfiguration)
-          buildPlatform: $(AgentOsName)
-          mergeTestResults: true
diff --git a/build.ps1 b/build.ps1
index 37f57517bf012280805acd6434f73735a739f473..cf5b9e0655bc92911eaf6dc74c78865f1ee204f4 100644
--- a/build.ps1
+++ b/build.ps1
@@ -369,6 +369,9 @@ if ($BinaryLog) {
     if (-not $bl) {
         $MSBuildArguments += "/bl:" + (Join-Path $LogDir "Build.binlog")
     }
+} elseif ($CI) {
+    # Ensure the artifacts/log directory isn't empty to avoid warnings.
+    New-Item (Join-Path $LogDir "empty.log") -ItemType File -ErrorAction SilentlyContinue >$null
 }
 
 # Capture MSBuild crash logs
diff --git a/build.sh b/build.sh
index cdc6ad31884e665818e2263ce12761e4e5fa5a49..80dbb7f291dae9ce7c913a3cf7e376685e3cc0a0 100755
--- a/build.sh
+++ b/build.sh
@@ -338,6 +338,9 @@ if [[ "$binary_log" == true ]]; then
     if [[ "$found" == false ]]; then
         msbuild_args[${#msbuild_args[*]}]="/bl:$log_dir/Build.binlog"
     fi
+elif [[ "$ci" == true ]]; then
+    # Ensure the artifacts/log directory isn't empty to avoid warnings.
+    touch "$log_dir/empty.log"
 fi
 
 # Capture MSBuild crash logs
diff --git a/eng/scripts/install-nginx-linux.sh b/eng/scripts/install-nginx-linux.sh
index bb4bea70b04c320fe19229b7efd916d8fc69caf9..53bd07a43d563c13704fb12d5b7f09a67b9dcdca 100755
--- a/eng/scripts/install-nginx-linux.sh
+++ b/eng/scripts/install-nginx-linux.sh
@@ -2,8 +2,12 @@
 
 set -euo pipefail
 
+scriptroot="$( cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+reporoot="$(dirname "$(dirname "$scriptroot")")"
+nginxinstall="$reporoot/.tools/nginx"
+
 curl -sSL http://nginx.org/download/nginx-1.14.2.tar.gz | tar zxfv - -C /tmp && cd /tmp/nginx-1.14.2/
-./configure --prefix=$HOME/nginxinstall --with-http_ssl_module --without-http_rewrite_module
+./configure --prefix=$nginxinstall --with-http_ssl_module --without-http_rewrite_module
 make
 make install
-echo "##vso[task.prependpath]$HOME/nginxinstall/sbin"
+echo "##vso[task.prependpath]$nginxinstall/sbin"