-
Notifications
You must be signed in to change notification settings - Fork 3
/
Build.ps1
139 lines (116 loc) · 5.19 KB
/
Build.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
[CmdletBinding()]
Param(
[Parameter(Position=0,Mandatory=$false,ValueFromRemainingArguments=$true)]
[string[]]$BuildArguments
)
Write-Output "PowerShell $($PSVersionTable.PSEdition) version $($PSVersionTable.PSVersion)"
Set-StrictMode -Version 2.0;
$ErrorActionPreference = "Stop";
$ConfirmPreference = "None";
trap {
Write-Error $_;
exit 1
}
$PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent
###########################################################################
# CONFIGURATION
###########################################################################
$BuildProjectFile = "$PSScriptRoot\build\_build.csproj"
$TempDirectory = "$PSScriptRoot\\.tmp"
$DotNetGlobalFile = "$PSScriptRoot\\global.json"
$DotNetInstallUrlPowershell = "https://raw.githubusercontent.com/dotnet/cli/master/scripts/obtain/dotnet-install.ps1"
$DotNetInstallUrlBash = "https://raw.githubusercontent.com/dotnet/cli/master/scripts/obtain/dotnet-install.sh"
$DotNetChannel = "Current"
$env:DOTNET_SKIP_FIRST_TIME_EXPERIENCE = 1
$env:DOTNET_CLI_TELEMETRY_OPTOUT = 1
$env:NUGET_XMLDOC_MODE = "skip"
###########################################################################
# EXECUTION
###########################################################################
function ExecSafe([scriptblock] $cmd) {
& $cmd
if((Get-Variable -Name "LASTEXITCODE" -Scope Global -ErrorAction SilentlyContinue) -ne $null) {
if ($LASTEXITCODE) {
exit $LASTEXITCODE
}
}
}
# If global.json exists, load expected version
if (Test-Path $DotNetGlobalFile) {
$DotNetGlobal = $(Get-Content $DotNetGlobalFile | Out-String | ConvertFrom-Json)
if ($DotNetGlobal.PSObject.Properties["sdk"] -and $DotNetGlobal.sdk.PSObject.Properties["version"]) {
$DotNetVersion = $DotNetGlobal.sdk.version
}
}
# If dotnet is installed locally, and expected version is not set or installation matches the expected version
if((Get-Variable IsWindows -ErrorAction SilentlyContinue) -eq $null){
$DotNetSuffix = "win";
$DotNetExtension = ".exe";
$DotNetInstallUrl = $DotNetInstallUrlPowershell;
$DotNetInstallExtension = "ps1";
}
else{
$DotNetSuffix = if($IsWindows -eq $false -or $IsWindows -eq $null){"unix"} else{"win"};
$DotNetExtension = if($IsWindows -eq $false -or $IsWindows -eq $null){""} else{".exe"};
$DotNetInstallUrl = if($IsWindows -eq $false -or $IsWindows -eq $null){$DotNetInstallUrlBash} else{$DotNetInstallUrlPowershell};
$DotNetInstallExtension = if($IsWindows -eq $false -or $IsWindows -eq $null){"sh"} else{"ps1"};
}
$DotNetDirectory = "$TempDirectory\dotnet-$DotNetSuffix"
$DotNetVersionDirectory = "$DotNetDirectory\sdk\$DotNetVersion"
$env:DOTNET_EXE = "$DotNetDirectory\dotnet$DotNetExtension"
if ($null -ne (Get-Command "dotnet" -ErrorAction SilentlyContinue) -and `
(!(Test-Path variable:DotNetVersion) -or "$(& dotnet --version | Select-Object -First 1)" -eq "$DotNetVersion")) {
Write-Host "Existing dotnet install discovered";
(dotnet --list-sdks) | Out-Host
$env:DOTNET_EXE = (Get-Command "dotnet").Path
}
else{
if(!(Test-Path $DotNetVersionDirectory)){
# Download install script
$DotNetInstallFile = "$TempDirectory\dotnet-install.$DotNetInstallExtension"
New-Item -ItemType Directory -Force -Path $TempDirectory | Out-Null
(New-Object System.Net.WebClient).DownloadFile($DotNetInstallUrl, $DotNetInstallFile)
# Install by channel or version
if (!(Test-Path variable:DotNetVersion)) {
if($DotNetInstallExtension -eq "ps1"){
ExecSafe { & $DotNetInstallFile -InstallDir $DotNetDirectory -Channel $DotNetChannel -NoPath }
}
elseif ($DotNetInstallExtension -eq "sh"){
ExecSafe { & "$DotNetInstallFile" --install-dir "$DotNetDirectory" --channel "$DotNetChannel" --no-path }
}
else{
throw "Unknown install extension";
}
} else {
if($DotNetInstallExtension -eq "ps1"){
ExecSafe { & $DotNetInstallFile -InstallDir $DotNetDirectory -Version $DotNetVersion -NoPath }
}
elseif ($DotNetInstallExtension -eq "sh"){
ExecSafe { & "$DotNetInstallFile" --install-dir "$DotNetDirectory" --version "$DotNetVersion" --no-path }
}
else{
throw "Unknown install extension";
}
}
}
}
$env:PATH += $DotNetDirectory;
$env:DOTNET_ROOT = $DotNetDirectory;
Write-Output "Microsoft (R) .NET Core SDK version $(& $env:DOTNET_EXE --version)"
#Output a bunch of diag info
Write-Host "[DotNetVersion] = $DotNetVersion";
Write-Host "[DotNetSuffix] = $DotNetSuffix";
Write-Host "[DotNetExtension] = $DotNetExtension";
Write-Host "[DotNetInstallUrl] = $DotNetInstallUrl";
Write-Host "[DotNetInstallExtension] = $DotNetInstallExtension";
Write-Host "[DotNetDirectory] = $DotNetDirectory";
Write-Host "[DotNetVersionDirectory] = $DotNetVersionDirectory";
Write-Host "[env:DOTNET_EXE] = $env:DOTNET_EXE";
Write-Host "[env:DOTNET_ROOT] = $env:DOTNET_ROOT";
Write-Host "[env:PATH] = $env:PATH";
try{
ExecSafe { & $env:DOTNET_EXE build $BuildProjectFile -c Release /nodeReuse:false }
ExecSafe { & $env:DOTNET_EXE run --project $BuildProjectFile -c Release --no-build -- $BuildArguments }
}finally{
ExecSafe { & $env:DOTNET_EXE build-server shutdown --msbuild --vbcscompiler}
}