diff --git a/automatic/kubernetes-cli/update.ps1 b/automatic/kubernetes-cli/update.ps1 index bc3fb7b3ef7..2a747490f1d 100644 --- a/automatic/kubernetes-cli/update.ps1 +++ b/automatic/kubernetes-cli/update.ps1 @@ -3,7 +3,10 @@ param($IncludeStream, [switch] $Force) Import-Module Chocolatey-AU -$changelogs = 'https://raw.githubusercontent.com/kubernetes/kubernetes/master/CHANGELOG/README.md' +$changelogRepository = @{ + Owner = 'kubernetes' + Repository = 'kubernetes' +} function global:au_BeforeUpdate { Get-RemoteFiles -Purge -NoSuffix } @@ -27,7 +30,7 @@ function global:au_SearchReplace { function global:au_GetLatest { # Only report the supported Kubernetes streams. - $changelogs = (Invoke-WebRequest -Uri $changelogs -UseBasicParsing).content + $changelogs = Get-GitHubRepositoryFileContent @changelogRepository CHANGELOG/README.md # There is quite a few versions that do not exist on chocolatey.org # and since the limit of pushed packages is 10, we need to limit the amount @@ -42,24 +45,24 @@ function global:au_GetLatest { foreach ($minor_version in $minor_version_changelogs) { if ($streams.ContainsKey($minor_version)) { - return + continue } - $minor_changelog_page = Invoke-WebRequest -UseBasicParsing -Uri "https://raw.githubusercontent.com/kubernetes/kubernetes/master/CHANGELOG/CHANGELOG-$($minor_version).md" - $url64 = $minor_changelog_page.content ` + $minor_changelog_page = Get-GitHubRepositoryFileContent @changelogRepository "CHANGELOG/CHANGELOG-$($minor_version).md" + $url64 = $minor_changelog_page ` | Select-String -Pattern "(?<=\[.+\]\()(?.+/v(?\d+(\.\d+)+)/kubernetes-client-windows-amd64\.tar\.gz)\)" ` | ForEach-Object {$_.Matches.Groups.Where{$_.Name -eq 'href'}.value} ` | Select-Object -First 1 if (!$url64) { - return + continue } if ($url64 -match "/v(?\d+(\.\d+)+)/kubernetes-client-windows-amd64.tar.gz") { $patch_version = $matches.version } - $url32 = $minor_changelog_page.content ` + $url32 = $minor_changelog_page ` | Select-String -Pattern "(?<=\[.+\]\()(?.+/v(?\d+(\.\d+)+)/kubernetes-client-windows-386\.tar\.gz)\)" ` | ForEach-Object {$_.Matches.Groups.Where{$_.Name -eq 'href'}.value} ` | Select-Object -First 1 diff --git a/scripts/Get-GitHubRelease.ps1 b/scripts/Get-GitHubRelease.ps1 index a71bd922dc4..1084cb82ee9 100644 --- a/scripts/Get-GitHubRelease.ps1 +++ b/scripts/Get-GitHubRelease.ps1 @@ -16,7 +16,7 @@ [Parameter(Mandatory, Position = 1)] [string]$Name, - # The Name of the tag to get the relase for. Will default to the latest release. + # The Name of the tag to get the release for. Will default to the latest release. [string]$TagName, # GitHub token, used to reduce rate-limiting or access private repositories (needs repo scope) diff --git a/scripts/Get-GitHubRepositoryFileContent.ps1 b/scripts/Get-GitHubRepositoryFileContent.ps1 new file mode 100644 index 00000000000..a70a762ec3e --- /dev/null +++ b/scripts/Get-GitHubRepositoryFileContent.ps1 @@ -0,0 +1,65 @@ +function Get-GitHubRepositoryFileContent { + <# + .Synopsis + Returns the content of a given file in a repository via the REST API + + .Link + https://docs.github.com/en/rest/repos/contents?apiVersion=2022-11-28 + + .Example + Get-GitHubRepositoryFileContent Kubernetes Kubernetes CHANGELOG/README.md + + .Notes + Seems to be a lot faster than IWRing raw files. + #> + [CmdletBinding()] + param( + # The owner of the repository + [Parameter(Mandatory)] + [string]$Owner, + + # The repository containing the file + [Parameter(Mandatory)] + [string]$Repository, + + # The path to the file within the repository + [Parameter(ValueFromPipeline)] + [string]$Path, + + # The branch, tag, or reference to get the content from. Defaults to the repository's default branch. + [Alias('ref', 'Tag')] + [string]$Branch, + + # Returns the raw response + [switch]$Raw + ) + process { + $restArgs = @{ + Uri = "https://api.github.com/repos/$($Owner)/$($Repository)/contents/$($Path.TrimStart('/'))" + Headers = @{ + 'Accept' = 'application/vnd.github+json' + 'X-GitHub-Api-Version' = '2022-11-28' + } + } + if ($Branch) { + $restArgs.Body = @{ref = $Branch} + } + if ($env:github_api_key) { + $restArgs.Headers.Authorization = "Bearer $($env:github_api_key)" + } + + $Result = Invoke-RestMethod @restArgs -UseBasicParsing + + if ($Raw) { + $Result + } elseif ($Result.encoding -eq 'base64') { + # Assumption made about the file being UTF8, here + [System.Text.Encoding]::UTF8.GetString( + [System.Convert]::FromBase64String($Result.content) + ) + } else { + Write-Warning "$($Path) encoded as '$($Result.encoding)'" + $Result.content + } + } +} diff --git a/scripts/au_extensions.psm1 b/scripts/au_extensions.psm1 index aa8af62f54a..3053bbac914 100644 --- a/scripts/au_extensions.psm1 +++ b/scripts/au_extensions.psm1 @@ -9,6 +9,7 @@ $funcs = @( 'Clear-DependenciesList' 'Get-AllGitHubReleases' 'Get-GitHubRelease' + 'Get-GitHubRepositoryFileContent' 'Set-DescriptionFromReadme' 'Update-ChangelogVersion' 'Update-OnETagChanged'