mirror of
https://github.com/actions/runner-images.git
synced 2025-12-12 20:26:49 +00:00
* Use Resolve-GithubReleaseAssetUrl more widely * Add the Get-ChecksumFromUrl function * Sort exported functions and add docs * Remove alias and fix typo * Fix kind checksum url and syntax * Fix checksums url for gh cli and msys2 * [Windows] Cleanup various scripts * Add spaces after type specifications * Rename the Take-Part function
123 lines
4.7 KiB
PowerShell
123 lines
4.7 KiB
PowerShell
################################################################################
|
|
## File: Install-DotnetSDK.ps1
|
|
## Desc: Install all released versions of the dotnet sdk and populate package
|
|
## cache. Should run after VS and Node
|
|
## Supply chain security: checksum validation
|
|
################################################################################
|
|
|
|
# Set environment variables
|
|
[Environment]::SetEnvironmentVariable("DOTNET_MULTILEVEL_LOOKUP", "0", "Machine")
|
|
[Environment]::SetEnvironmentVariable("DOTNET_NOLOGO", "1", "Machine")
|
|
[Environment]::SetEnvironmentVariable("DOTNET_SKIP_FIRST_TIME_EXPERIENCE", "1", "Machine")
|
|
|
|
[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor "Tls12"
|
|
|
|
#region "Functions"
|
|
function Get-SDKVersionsToInstall {
|
|
param (
|
|
[Parameter(Mandatory)]
|
|
[string] $DotnetVersion
|
|
)
|
|
$releasesJsonUri = "https://dotnetcli.blob.core.windows.net/dotnet/release-metadata/${DotnetVersion}/releases.json"
|
|
$releasesData = (Invoke-DownloadWithRetry $releasesJsonUri) | Get-Item | Get-Content | ConvertFrom-Json
|
|
# filtering out the preview/rc releases
|
|
$releases = $releasesData.'releases' | Where-Object { !$_.'release-version'.Contains('-') }
|
|
|
|
$sdks = @()
|
|
foreach ($release in $releases) {
|
|
$sdks += $release.'sdk'
|
|
$sdks += $release.'sdks'
|
|
}
|
|
|
|
return $sdks.version `
|
|
| Sort-Object { [Version] $_ } -Unique `
|
|
| Group-Object { $_.Substring(0, $_.LastIndexOf('.') + 2) } `
|
|
| ForEach-Object { $_.Group[-1] }
|
|
}
|
|
|
|
function Invoke-DotnetWarmup {
|
|
param (
|
|
[Parameter(Mandatory)]
|
|
[string] $SDKVersion
|
|
)
|
|
# warm up dotnet for first time experience
|
|
$projectTypes = @('console', 'mstest', 'web', 'mvc', 'webapi')
|
|
$projectTypes | ForEach-Object {
|
|
$template = $_
|
|
$projectPath = Join-Path -Path C:\temp -ChildPath $template
|
|
New-Item -Path $projectPath -Force -ItemType Directory
|
|
Push-Location -Path $projectPath
|
|
& $env:ProgramFiles\dotnet\dotnet.exe new globaljson --sdk-version "$SDKVersion"
|
|
& $env:ProgramFiles\dotnet\dotnet.exe new $template
|
|
Pop-Location
|
|
Remove-Item $projectPath -Force -Recurse
|
|
}
|
|
}
|
|
|
|
function Install-DotnetSDK {
|
|
param (
|
|
[Parameter(Mandatory)]
|
|
[string] $InstallScriptPath,
|
|
[Parameter(Mandatory)]
|
|
[Alias('Version')]
|
|
[string] $SDKVersion,
|
|
[Parameter(Mandatory)]
|
|
[string] $DotnetVersion
|
|
)
|
|
|
|
if (Test-Path -Path "C:\Program Files\dotnet\sdk\$SDKVersion") {
|
|
Write-Host "Sdk version $SDKVersion already installed"
|
|
return
|
|
}
|
|
|
|
Write-Host "Installing dotnet $SDKVersion"
|
|
$zipPath = Join-Path ([IO.Path]::GetTempPath()) ([IO.Path]::GetRandomFileName())
|
|
& $InstallScriptPath -Version $SDKVersion -InstallDir $(Join-Path -Path $env:ProgramFiles -ChildPath 'dotnet') -ZipPath $zipPath -KeepZip
|
|
|
|
#region Supply chain security
|
|
$releasesJsonUri = "https://dotnetcli.blob.core.windows.net/dotnet/release-metadata/${DotnetVersion}/releases.json"
|
|
$releasesData = (Invoke-DownloadWithRetry $releasesJsonUri) | Get-Item | Get-Content | ConvertFrom-Json
|
|
$distributorFileHash = $releasesData.releases.sdks.Where({ $_.version -eq $SDKVersion }).files.Where({ $_.name -eq 'dotnet-sdk-win-x64.zip' }).hash
|
|
Test-FileChecksum $zipPath -ExpectedSHA512Sum $distributorFileHash
|
|
#endregion
|
|
}
|
|
#endregion
|
|
|
|
$dotnetToolset = (Get-ToolsetContent).dotnet
|
|
|
|
# Download installation script.
|
|
$installScriptPath = Invoke-DownloadWithRetry -Url "https://dot.net/v1/dotnet-install.ps1"
|
|
|
|
# Install and warm up dotnet
|
|
foreach ($dotnetVersion in $dotnetToolset.versions) {
|
|
$sdkVersionsToInstall = Get-SDKVersionsToInstall -DotnetVersion $dotnetVersion
|
|
foreach ($sdkVersion in $sdkVersionsToInstall) {
|
|
Install-DotnetSDK -InstallScriptPath $installScriptPath -SDKVersion $sdkVersion -DotnetVersion $dotnetVersion
|
|
if ($dotnetToolset.warmup) {
|
|
Invoke-DotnetWarmup -SDKVersion $sdkVersion
|
|
}
|
|
}
|
|
}
|
|
|
|
# Add dotnet to PATH
|
|
Add-MachinePathItem "C:\Program Files\dotnet"
|
|
|
|
# Remove NuGet Folder
|
|
$nugetPath = "$env:APPDATA\NuGet"
|
|
if (Test-Path $nugetPath) {
|
|
Remove-Item -Path $nugetPath -Force -Recurse
|
|
}
|
|
|
|
# Generate and copy new NuGet.Config config
|
|
dotnet nuget list source | Out-Null
|
|
Copy-Item -Path $nugetPath -Destination C:\Users\Default\AppData\Roaming -Force -Recurse
|
|
|
|
# Install dotnet tools
|
|
Write-Host "Installing dotnet tools"
|
|
Add-DefaultPathItem "%USERPROFILE%\.dotnet\tools"
|
|
foreach ($dotnetTool in $dotnetToolset.tools) {
|
|
dotnet tool install $($dotnetTool.name) --tool-path "C:\Users\Default\.dotnet\tools" --add-source https://api.nuget.org/v3/index.json | Out-Null
|
|
}
|
|
|
|
Invoke-PesterTests -TestFile "DotnetSDK"
|