mirror of
https://github.com/actions/runner-images.git
synced 2025-12-12 20:26:49 +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
|
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"
|
Write-Host "Download Latest action-versions archive from $downloadUrl"
|
||||||
$actionVersionsArchivePath = Start-DownloadWithRetry -Url $downloadUrl -Name "action-versions.zip"
|
$actionVersionsArchivePath = Start-DownloadWithRetry -Url $downloadUrl -Name "action-versions.zip"
|
||||||
|
|
||||||
|
|||||||
@@ -4,13 +4,10 @@
|
|||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
$seleniumMajorVersion = (Get-ToolsetContent).selenium.version
|
$seleniumMajorVersion = (Get-ToolsetContent).selenium.version
|
||||||
$ieDriverUrl = Get-GitHubPackageDownloadUrl `
|
$ieDriverUrl = Resolve-GithubReleaseAssetUrl `
|
||||||
-RepoOwner "SeleniumHQ" `
|
-Repo "SeleniumHQ/selenium" `
|
||||||
-RepoName "selenium" `
|
-Version "$seleniumMajorVersion.*" `
|
||||||
-BinaryName "IEDriverServer_x64" `
|
-Asset "IEDriverServer_x64_*.zip"
|
||||||
-Version $seleniumMajorVersion `
|
|
||||||
-UrlFilter "*{BinaryName}_{Version}.zip" `
|
|
||||||
-LatestReleaseOnly $false
|
|
||||||
|
|
||||||
# Download IE selenium driver
|
# Download IE selenium driver
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -6,10 +6,12 @@
|
|||||||
|
|
||||||
# Install Kotlin
|
# Install Kotlin
|
||||||
$kotlinVersion = (Get-ToolsetContent).kotlin.version
|
$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"
|
$kotlinDownloadUrl = Resolve-GithubReleaseAssetUrl `
|
||||||
$kotlinInstallerPath = Start-DownloadWithRetry -Url $kotlinDownloadUrl -Name "$kotlinBinaryName.zip"
|
-Repo "JetBrains/kotlin" `
|
||||||
|
-Version $kotlinVersion `
|
||||||
|
-Asset "kotlin-compiler-*.zip"
|
||||||
|
$kotlinInstallerPath = Start-DownloadWithRetry -Url $kotlinDownloadUrl -Name "kotlin-compiler.zip"
|
||||||
|
|
||||||
#region Supply chain security
|
#region Supply chain security
|
||||||
$fileHash = (Get-FileHash -Path $kotlinInstallerPath -Algorithm SHA256).Hash
|
$fileHash = (Get-FileHash -Path $kotlinInstallerPath -Algorithm SHA256).Hash
|
||||||
|
|||||||
@@ -50,12 +50,10 @@ if (Test-IsWin19) {
|
|||||||
throw "Unknown architecture $_"
|
throw "Unknown architecture $_"
|
||||||
}
|
}
|
||||||
|
|
||||||
$url = Get-GitHubPackageDownloadUrl `
|
$url = Resolve-GithubReleaseAssetUrl `
|
||||||
-RepoOwner "niXman" `
|
-Repo "niXman/mingw-builds-binaries" `
|
||||||
-RepoName "mingw-builds-binaries" `
|
-Version "$version" `
|
||||||
-BinaryName "" `
|
-Asset "$arch-*-release-$threads-$exceptions-$runtime-*.7z"
|
||||||
-Version $version `
|
|
||||||
-UrlFilter "*$arch-{Version}-release-$threads-$exceptions-$runtime-*.7z"
|
|
||||||
|
|
||||||
$packagePath = Start-DownloadWithRetry -Url $url -Name "$_.7z"
|
$packagePath = Start-DownloadWithRetry -Url $url -Name "$_.7z"
|
||||||
Expand-7ZipArchive -Path $packagePath -DestinationPath "C:\"
|
Expand-7ZipArchive -Path $packagePath -DestinationPath "C:\"
|
||||||
|
|||||||
@@ -9,21 +9,18 @@ New-Item -ItemType directory -Path $seleniumDirectory
|
|||||||
|
|
||||||
# Download Selenium
|
# Download Selenium
|
||||||
$seleniumMajorVersion = (Get-ToolsetContent).selenium.version
|
$seleniumMajorVersion = (Get-ToolsetContent).selenium.version
|
||||||
$seleniumBinaryName = (Get-ToolsetContent).selenium.binary_name
|
$seleniumFileName = "selenium-server.jar"
|
||||||
$seleniumFileName = "$seleniumBinaryName.jar"
|
|
||||||
|
|
||||||
$seleniumDownloadUrl = Get-GitHubPackageDownloadUrl `
|
$seleniumDownloadUrl = Resolve-GithubReleaseAssetUrl `
|
||||||
-RepoOwner "SeleniumHQ" `
|
-Repo "SeleniumHQ/selenium" `
|
||||||
-RepoName "selenium" `
|
-Version "$seleniumMajorVersion.*" `
|
||||||
-BinaryName "$seleniumBinaryName" `
|
-Asset "selenium-server-*.jar"
|
||||||
-Version $seleniumMajorVersion `
|
|
||||||
-UrlFilter "*{BinaryName}-{Version}.jar"
|
|
||||||
|
|
||||||
Start-DownloadWithRetry -Url $seleniumDownloadUrl -Name $seleniumFileName -DownloadPath $seleniumDirectory
|
Start-DownloadWithRetry -Url $seleniumDownloadUrl -Name $seleniumFileName -DownloadPath $seleniumDirectory
|
||||||
|
|
||||||
# Create an empty file to retrive Selenium version
|
# Create an empty file to retrive Selenium version
|
||||||
$seleniumFullVersion = $seleniumDownloadUrl.Split("-")[1].Split("/")[0]
|
$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
|
# Add SELENIUM_JAR_PATH environment variable
|
||||||
$seleniumBinPath = Join-Path $seleniumDirectory $seleniumFileName
|
$seleniumBinPath = Join-Path $seleniumDirectory $seleniumFileName
|
||||||
|
|||||||
@@ -63,12 +63,12 @@ function Get-SeleniumWebDriverVersion {
|
|||||||
$driverName = $webDrivers.$Driver.Name
|
$driverName = $webDrivers.$Driver.Name
|
||||||
$driverPath = $webDrivers.$Driver.Path
|
$driverPath = $webDrivers.$Driver.Path
|
||||||
$versionFileName = "versioninfo.txt";
|
$versionFileName = "versioninfo.txt";
|
||||||
$webDriverVersion = Get-Content -Path "$driverPath\$versionFileName"
|
$webDriverVersion = Get-Content -Path "$driverPath\$versionFileName"
|
||||||
return [ToolVersionNode]::new($driverName, $webDriverVersion)
|
return [ToolVersionNode]::new($driverName, $webDriverVersion)
|
||||||
}
|
}
|
||||||
|
|
||||||
function Get-SeleniumVersion {
|
function Get-SeleniumVersion {
|
||||||
$seleniumBinaryName = (Get-ToolsetContent).selenium.binary_name
|
$seleniumBinaryName = "selenium-server"
|
||||||
$fullSeleniumVersion = (Get-ChildItem "C:\selenium\${seleniumBinaryName}-*").Name -replace "${seleniumBinaryName}-"
|
$fullSeleniumVersion = (Get-ChildItem "C:\selenium\${seleniumBinaryName}-*").Name -replace "${seleniumBinaryName}-"
|
||||||
return [ToolVersionNode]::new("Selenium server", $fullSeleniumVersion)
|
return [ToolVersionNode]::new("Selenium server", $fullSeleniumVersion)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ Export-ModuleMember -Function @(
|
|||||||
'Install-ChocoPackage'
|
'Install-ChocoPackage'
|
||||||
'Send-RequestToCocolateyPackages'
|
'Send-RequestToCocolateyPackages'
|
||||||
'Resolve-ChocoPackageVersion'
|
'Resolve-ChocoPackageVersion'
|
||||||
'Get-GitHubPackageDownloadUrl'
|
'Resolve-GithubReleaseAssetUrl'
|
||||||
'Expand-7ZipArchive'
|
'Expand-7ZipArchive'
|
||||||
'Invoke-SBWithRetry'
|
'Invoke-SBWithRetry'
|
||||||
'Get-VsCatalogJsonPath'
|
'Get-VsCatalogJsonPath'
|
||||||
|
|||||||
@@ -685,55 +685,88 @@ function Invoke-SBWithRetry {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function Get-GitHubPackageDownloadUrl {
|
function Resolve-GithubReleaseAssetUrl {
|
||||||
param (
|
param (
|
||||||
[string]$RepoOwner,
|
[Parameter(Mandatory = $true)]
|
||||||
[string]$RepoName,
|
[Alias("Repo")]
|
||||||
[string]$BinaryName,
|
[string] $Repository,
|
||||||
[string]$Version,
|
[Parameter(Mandatory = $true)]
|
||||||
[string]$UrlFilter,
|
[Alias("Pattern", "File", "Asset")]
|
||||||
[boolean]$IsPrerelease = $false,
|
[string] $UrlMatchPattern,
|
||||||
[boolean]$LatestReleaseOnly = $true,
|
[switch] $AllowPrerelease,
|
||||||
[int]$SearchInCount = 100
|
[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") {
|
if ($Version -eq "latest") {
|
||||||
$Version = "*"
|
$matchingReleases = $releases | Select-Object -First 1
|
||||||
}
|
} elseif ($Version.Contains("*")) {
|
||||||
|
$matchingReleases = $releases | Where-Object { $_.version -like "$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
|
|
||||||
} else {
|
} else {
|
||||||
foreach ($version in $availableVersions) {
|
$matchingReleases = $releases | Where-Object { $_.version -eq "$Version" }
|
||||||
$urlFilterReplaced = $UrlFilter -replace "{BinaryName}", $BinaryName -replace "{Version}", $version
|
}
|
||||||
$downloadUrl = $json.assets.browser_download_url -like $urlFilterReplaced
|
|
||||||
|
|
||||||
if ($downloadUrl) {
|
if (-not $matchingReleases) {
|
||||||
Write-Host "Found download url for ${RepoOwner}/${RepoName} ${BinaryName} ${version}"
|
throw "Failed to get releases from ${Repository} matching version `"${Version}`".`nAvailable versions: $($availableVersions -join ", ")"
|
||||||
break
|
}
|
||||||
}
|
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) {
|
if (-not $matchedUrl) {
|
||||||
throw "Failed to get download url for ${RepoOwner}/${RepoName} ${BinaryName}"
|
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 {
|
function Use-ChecksumComparison {
|
||||||
|
|||||||
@@ -146,8 +146,7 @@ Describe "Internet Explorer" {
|
|||||||
|
|
||||||
Describe "Selenium" {
|
Describe "Selenium" {
|
||||||
BeforeAll {
|
BeforeAll {
|
||||||
$seleniumBinaryName = (Get-ToolsetContent).selenium.binary_name
|
$seleniumBinPath = "C:\selenium\selenium-server.jar"
|
||||||
$seleniumBinPath = Join-Path "C:\selenium\" "$seleniumBinaryName.jar"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
It "Selenium server is installed" {
|
It "Selenium server is installed" {
|
||||||
|
|||||||
@@ -392,8 +392,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"selenium": {
|
"selenium": {
|
||||||
"version": "4",
|
"version": "4"
|
||||||
"binary_name": "selenium-server"
|
|
||||||
},
|
},
|
||||||
"npm": {
|
"npm": {
|
||||||
"global_packages": [
|
"global_packages": [
|
||||||
@@ -488,8 +487,7 @@
|
|||||||
"signature": "698BA51AA27CC31282AACA5055E4B9190BC6C0E9"
|
"signature": "698BA51AA27CC31282AACA5055E4B9190BC6C0E9"
|
||||||
},
|
},
|
||||||
"kotlin": {
|
"kotlin": {
|
||||||
"version": "latest",
|
"version": "latest"
|
||||||
"binary_name": "kotlin-compiler"
|
|
||||||
},
|
},
|
||||||
"openssl": {
|
"openssl": {
|
||||||
"version": "1.1.1"
|
"version": "1.1.1"
|
||||||
|
|||||||
@@ -339,8 +339,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"selenium": {
|
"selenium": {
|
||||||
"version": "4",
|
"version": "4"
|
||||||
"binary_name": "selenium-server"
|
|
||||||
},
|
},
|
||||||
"npm": {
|
"npm": {
|
||||||
"global_packages": [
|
"global_packages": [
|
||||||
@@ -428,8 +427,7 @@
|
|||||||
"signature": "698BA51AA27CC31282AACA5055E4B9190BC6C0E9"
|
"signature": "698BA51AA27CC31282AACA5055E4B9190BC6C0E9"
|
||||||
},
|
},
|
||||||
"kotlin": {
|
"kotlin": {
|
||||||
"version": "latest",
|
"version": "latest"
|
||||||
"binary_name": "kotlin-compiler"
|
|
||||||
},
|
},
|
||||||
"openssl": {
|
"openssl": {
|
||||||
"version": "1.1.1"
|
"version": "1.1.1"
|
||||||
|
|||||||
Reference in New Issue
Block a user