[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:
Vasilii Polikarpov
2023-11-28 15:08:03 +01:00
committed by GitHub
parent e8f9c10965
commit da1c04b81a
11 changed files with 104 additions and 78 deletions

View File

@@ -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"

View File

@@ -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 {

View File

@@ -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

View File

@@ -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:\"

View File

@@ -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

View File

@@ -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)
} }

View File

@@ -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'

View File

@@ -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 {

View File

@@ -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" {

View File

@@ -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"

View File

@@ -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"