mirror of
https://github.com/actions/runner-images.git
synced 2025-12-12 12:06:59 +00:00
[Windows] Reimplement function resolving GH asset (#8899)
* [Windows] Reimplement function resolving GH asset * Fix tests and software report * Fix selenium-server version check
This commit is contained in:
committed by
GitHub
parent
e8f9c10965
commit
da1c04b81a
@@ -9,7 +9,11 @@ if (-not (Test-Path $env:ACTIONS_RUNNER_ACTION_ARCHIVE_CACHE)) {
|
||||
New-Item -ItemType Directory -Path $env:ACTIONS_RUNNER_ACTION_ARCHIVE_CACHE | Out-Null
|
||||
}
|
||||
|
||||
$downloadUrl = Get-GitHubPackageDownloadUrl -RepoOwner "actions" -RepoName "action-versions" -Version "latest" -UrlFilter "*/v{Version}/action-versions.zip"
|
||||
$downloadUrl = Resolve-GithubReleaseAssetUrl `
|
||||
-Repo "actions/action-versions" `
|
||||
-Version "latest" `
|
||||
-Asset "action-versions.zip"
|
||||
|
||||
Write-Host "Download Latest action-versions archive from $downloadUrl"
|
||||
$actionVersionsArchivePath = Start-DownloadWithRetry -Url $downloadUrl -Name "action-versions.zip"
|
||||
|
||||
|
||||
@@ -4,13 +4,10 @@
|
||||
################################################################################
|
||||
|
||||
$seleniumMajorVersion = (Get-ToolsetContent).selenium.version
|
||||
$ieDriverUrl = Get-GitHubPackageDownloadUrl `
|
||||
-RepoOwner "SeleniumHQ" `
|
||||
-RepoName "selenium" `
|
||||
-BinaryName "IEDriverServer_x64" `
|
||||
-Version $seleniumMajorVersion `
|
||||
-UrlFilter "*{BinaryName}_{Version}.zip" `
|
||||
-LatestReleaseOnly $false
|
||||
$ieDriverUrl = Resolve-GithubReleaseAssetUrl `
|
||||
-Repo "SeleniumHQ/selenium" `
|
||||
-Version "$seleniumMajorVersion.*" `
|
||||
-Asset "IEDriverServer_x64_*.zip"
|
||||
|
||||
# Download IE selenium driver
|
||||
try {
|
||||
|
||||
@@ -6,10 +6,12 @@
|
||||
|
||||
# Install Kotlin
|
||||
$kotlinVersion = (Get-ToolsetContent).kotlin.version
|
||||
$kotlinBinaryName = (Get-ToolsetContent).kotlin.binary_name
|
||||
|
||||
$kotlinDownloadUrl = Get-GitHubPackageDownloadUrl -RepoOwner "JetBrains" -RepoName "kotlin" -BinaryName $kotlinBinaryName -Version $kotlinVersion -UrlFilter "*{BinaryName}-{Version}.zip"
|
||||
$kotlinInstallerPath = Start-DownloadWithRetry -Url $kotlinDownloadUrl -Name "$kotlinBinaryName.zip"
|
||||
$kotlinDownloadUrl = Resolve-GithubReleaseAssetUrl `
|
||||
-Repo "JetBrains/kotlin" `
|
||||
-Version $kotlinVersion `
|
||||
-Asset "kotlin-compiler-*.zip"
|
||||
$kotlinInstallerPath = Start-DownloadWithRetry -Url $kotlinDownloadUrl -Name "kotlin-compiler.zip"
|
||||
|
||||
#region Supply chain security
|
||||
$fileHash = (Get-FileHash -Path $kotlinInstallerPath -Algorithm SHA256).Hash
|
||||
|
||||
@@ -50,12 +50,10 @@ if (Test-IsWin19) {
|
||||
throw "Unknown architecture $_"
|
||||
}
|
||||
|
||||
$url = Get-GitHubPackageDownloadUrl `
|
||||
-RepoOwner "niXman" `
|
||||
-RepoName "mingw-builds-binaries" `
|
||||
-BinaryName "" `
|
||||
-Version $version `
|
||||
-UrlFilter "*$arch-{Version}-release-$threads-$exceptions-$runtime-*.7z"
|
||||
$url = Resolve-GithubReleaseAssetUrl `
|
||||
-Repo "niXman/mingw-builds-binaries" `
|
||||
-Version "$version" `
|
||||
-Asset "$arch-*-release-$threads-$exceptions-$runtime-*.7z"
|
||||
|
||||
$packagePath = Start-DownloadWithRetry -Url $url -Name "$_.7z"
|
||||
Expand-7ZipArchive -Path $packagePath -DestinationPath "C:\"
|
||||
|
||||
@@ -9,21 +9,18 @@ New-Item -ItemType directory -Path $seleniumDirectory
|
||||
|
||||
# Download Selenium
|
||||
$seleniumMajorVersion = (Get-ToolsetContent).selenium.version
|
||||
$seleniumBinaryName = (Get-ToolsetContent).selenium.binary_name
|
||||
$seleniumFileName = "$seleniumBinaryName.jar"
|
||||
$seleniumFileName = "selenium-server.jar"
|
||||
|
||||
$seleniumDownloadUrl = Get-GitHubPackageDownloadUrl `
|
||||
-RepoOwner "SeleniumHQ" `
|
||||
-RepoName "selenium" `
|
||||
-BinaryName "$seleniumBinaryName" `
|
||||
-Version $seleniumMajorVersion `
|
||||
-UrlFilter "*{BinaryName}-{Version}.jar"
|
||||
$seleniumDownloadUrl = Resolve-GithubReleaseAssetUrl `
|
||||
-Repo "SeleniumHQ/selenium" `
|
||||
-Version "$seleniumMajorVersion.*" `
|
||||
-Asset "selenium-server-*.jar"
|
||||
|
||||
Start-DownloadWithRetry -Url $seleniumDownloadUrl -Name $seleniumFileName -DownloadPath $seleniumDirectory
|
||||
|
||||
# Create an empty file to retrive Selenium version
|
||||
$seleniumFullVersion = $seleniumDownloadUrl.Split("-")[1].Split("/")[0]
|
||||
New-Item -Path $seleniumDirectory -Name "$seleniumBinaryName-$seleniumFullVersion"
|
||||
New-Item -Path $seleniumDirectory -Name "selenium-server-$seleniumFullVersion"
|
||||
|
||||
# Add SELENIUM_JAR_PATH environment variable
|
||||
$seleniumBinPath = Join-Path $seleniumDirectory $seleniumFileName
|
||||
|
||||
@@ -63,12 +63,12 @@ function Get-SeleniumWebDriverVersion {
|
||||
$driverName = $webDrivers.$Driver.Name
|
||||
$driverPath = $webDrivers.$Driver.Path
|
||||
$versionFileName = "versioninfo.txt";
|
||||
$webDriverVersion = Get-Content -Path "$driverPath\$versionFileName"
|
||||
$webDriverVersion = Get-Content -Path "$driverPath\$versionFileName"
|
||||
return [ToolVersionNode]::new($driverName, $webDriverVersion)
|
||||
}
|
||||
|
||||
function Get-SeleniumVersion {
|
||||
$seleniumBinaryName = (Get-ToolsetContent).selenium.binary_name
|
||||
$seleniumBinaryName = "selenium-server"
|
||||
$fullSeleniumVersion = (Get-ChildItem "C:\selenium\${seleniumBinaryName}-*").Name -replace "${seleniumBinaryName}-"
|
||||
return [ToolVersionNode]::new("Selenium server", $fullSeleniumVersion)
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ Export-ModuleMember -Function @(
|
||||
'Install-ChocoPackage'
|
||||
'Send-RequestToCocolateyPackages'
|
||||
'Resolve-ChocoPackageVersion'
|
||||
'Get-GitHubPackageDownloadUrl'
|
||||
'Resolve-GithubReleaseAssetUrl'
|
||||
'Expand-7ZipArchive'
|
||||
'Invoke-SBWithRetry'
|
||||
'Get-VsCatalogJsonPath'
|
||||
|
||||
@@ -685,55 +685,88 @@ function Invoke-SBWithRetry {
|
||||
}
|
||||
}
|
||||
|
||||
function Get-GitHubPackageDownloadUrl {
|
||||
function Resolve-GithubReleaseAssetUrl {
|
||||
param (
|
||||
[string]$RepoOwner,
|
||||
[string]$RepoName,
|
||||
[string]$BinaryName,
|
||||
[string]$Version,
|
||||
[string]$UrlFilter,
|
||||
[boolean]$IsPrerelease = $false,
|
||||
[boolean]$LatestReleaseOnly = $true,
|
||||
[int]$SearchInCount = 100
|
||||
[Parameter(Mandatory = $true)]
|
||||
[Alias("Repo")]
|
||||
[string] $Repository,
|
||||
[Parameter(Mandatory = $true)]
|
||||
[Alias("Pattern", "File", "Asset")]
|
||||
[string] $UrlMatchPattern,
|
||||
[switch] $AllowPrerelease,
|
||||
[string] $Version = "*"
|
||||
)
|
||||
|
||||
# Add wildcard to the beginning of the pattern if it's not there
|
||||
if ($UrlMatchPattern.Substring(0, 2) -ne "*/") {
|
||||
$UrlMatchPattern = "*/$UrlMatchPattern"
|
||||
}
|
||||
|
||||
$releases = @()
|
||||
$page = 1
|
||||
$pageSize = 100
|
||||
do {
|
||||
$releasesPage = Invoke-RestMethod -Uri "https://api.github.com/repos/${Repository}/releases?per_page=${pageSize}&page=${page}"
|
||||
$releases += $releasesPage
|
||||
$page++
|
||||
} while ($releasesPage.Count -eq $pageSize)
|
||||
Write-Debug "Found $($releases.Count) releases for ${Repository}"
|
||||
|
||||
if (-not $releases) {
|
||||
throw "Failed to get releases from ${Repository}"
|
||||
}
|
||||
|
||||
$releases = $releases.Where{ $_.assets }
|
||||
if (-not $AllowPrerelease) {
|
||||
$releases = $releases.Where{ $_.prerelease -eq $false }
|
||||
}
|
||||
Write-Debug "Found $($releases.Count) releases with assets for ${Repository}"
|
||||
|
||||
# Parse version from tag name and put it to parameter Version
|
||||
foreach ($release in $releases) {
|
||||
$release | Add-Member -MemberType NoteProperty -Name version -Value (
|
||||
$release.tag_name | Select-String -Pattern "\d+.\d+.\d+" | ForEach-Object { $_.Matches.Value }
|
||||
)
|
||||
}
|
||||
|
||||
# Sort releases by version
|
||||
$releases = $releases | Sort-Object -Descending { [version]$_.version }
|
||||
|
||||
# Select releases matching version
|
||||
if ($Version -eq "latest") {
|
||||
$Version = "*"
|
||||
}
|
||||
|
||||
$json = Invoke-RestMethod -Uri "https://api.github.com/repos/${RepoOwner}/${RepoName}/releases?per_page=${SearchInCount}"
|
||||
$tags = $json.Where{ $_.prerelease -eq $IsPrerelease -and $_.assets }.tag_name
|
||||
$availableVersions = $tags |
|
||||
Select-String -Pattern "\d+.\d+.\d+" |
|
||||
ForEach-Object { $_.Matches.Value } |
|
||||
Where-Object { $_ -like "$Version.*" -or $_ -eq $Version } |
|
||||
Sort-Object -Descending { [version]$_ }
|
||||
|
||||
if (-not $availableVersions) {
|
||||
throw "Failed to get available versions from ${RepoOwner}/${RepoName} releases"
|
||||
}
|
||||
|
||||
if ($LatestReleaseOnly) {
|
||||
$latestVersion = $availableVersions | Select-Object -First 1
|
||||
$urlFilterReplaced = $UrlFilter -replace "{BinaryName}", $BinaryName -replace "{Version}", $latestVersion
|
||||
$downloadUrl = $json.assets.browser_download_url -like $urlFilterReplaced
|
||||
$matchingReleases = $releases | Select-Object -First 1
|
||||
} elseif ($Version.Contains("*")) {
|
||||
$matchingReleases = $releases | Where-Object { $_.version -like "$Version" }
|
||||
} else {
|
||||
foreach ($version in $availableVersions) {
|
||||
$urlFilterReplaced = $UrlFilter -replace "{BinaryName}", $BinaryName -replace "{Version}", $version
|
||||
$downloadUrl = $json.assets.browser_download_url -like $urlFilterReplaced
|
||||
$matchingReleases = $releases | Where-Object { $_.version -eq "$Version" }
|
||||
}
|
||||
|
||||
if ($downloadUrl) {
|
||||
Write-Host "Found download url for ${RepoOwner}/${RepoName} ${BinaryName} ${version}"
|
||||
break
|
||||
}
|
||||
if (-not $matchingReleases) {
|
||||
throw "Failed to get releases from ${Repository} matching version `"${Version}`".`nAvailable versions: $($availableVersions -join ", ")"
|
||||
}
|
||||
Write-Debug "Found $($matchingReleases.Count) releases matching version ${Version} for ${Repository}"
|
||||
|
||||
# Loop over releases until we find a download url matching the pattern
|
||||
foreach ($release in $matchingReleases) {
|
||||
$matchedVersion = $release.version
|
||||
$matchedUrl = $release.assets.browser_download_url -like $UrlMatchPattern
|
||||
if ($matchedUrl) {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if (-not $downloadUrl) {
|
||||
throw "Failed to get download url for ${RepoOwner}/${RepoName} ${BinaryName}"
|
||||
if (-not $matchedUrl) {
|
||||
Write-Debug "Found no download urls matching pattern ${UrlMatchPattern}"
|
||||
Write-Debug "Available download urls:`n$($matchingReleases.assets.browser_download_url -join "`n")"
|
||||
throw "No assets found in ${Repository} matching version `"${Version}`" and pattern `"${UrlMatchPattern}`""
|
||||
} elseif ($matchedUrl.Count -gt 1) {
|
||||
Write-Debug "Found multiple download urls matching pattern ${UrlMatchPattern}:`n$($matchedUrl -join "`n")"
|
||||
throw "Multiple download urls found in ${Repository} version `"${matchedVersion}`" matching pattern `"${UrlMatchPattern}`":`n$($matchedUrl -join "`n")"
|
||||
}
|
||||
|
||||
return $downloadUrl
|
||||
Write-Host "Found download url for ${Repository} version ${matchedVersion}: ${matchedUrl}"
|
||||
|
||||
return ($matchedUrl -as [string])
|
||||
}
|
||||
|
||||
function Use-ChecksumComparison {
|
||||
|
||||
@@ -146,8 +146,7 @@ Describe "Internet Explorer" {
|
||||
|
||||
Describe "Selenium" {
|
||||
BeforeAll {
|
||||
$seleniumBinaryName = (Get-ToolsetContent).selenium.binary_name
|
||||
$seleniumBinPath = Join-Path "C:\selenium\" "$seleniumBinaryName.jar"
|
||||
$seleniumBinPath = "C:\selenium\selenium-server.jar"
|
||||
}
|
||||
|
||||
It "Selenium server is installed" {
|
||||
|
||||
@@ -392,8 +392,7 @@
|
||||
}
|
||||
],
|
||||
"selenium": {
|
||||
"version": "4",
|
||||
"binary_name": "selenium-server"
|
||||
"version": "4"
|
||||
},
|
||||
"npm": {
|
||||
"global_packages": [
|
||||
@@ -488,8 +487,7 @@
|
||||
"signature": "698BA51AA27CC31282AACA5055E4B9190BC6C0E9"
|
||||
},
|
||||
"kotlin": {
|
||||
"version": "latest",
|
||||
"binary_name": "kotlin-compiler"
|
||||
"version": "latest"
|
||||
},
|
||||
"openssl": {
|
||||
"version": "1.1.1"
|
||||
|
||||
@@ -339,8 +339,7 @@
|
||||
}
|
||||
],
|
||||
"selenium": {
|
||||
"version": "4",
|
||||
"binary_name": "selenium-server"
|
||||
"version": "4"
|
||||
},
|
||||
"npm": {
|
||||
"global_packages": [
|
||||
@@ -428,8 +427,7 @@
|
||||
"signature": "698BA51AA27CC31282AACA5055E4B9190BC6C0E9"
|
||||
},
|
||||
"kotlin": {
|
||||
"version": "latest",
|
||||
"binary_name": "kotlin-compiler"
|
||||
"version": "latest"
|
||||
},
|
||||
"openssl": {
|
||||
"version": "1.1.1"
|
||||
|
||||
Reference in New Issue
Block a user