【问题标题】:How to use PowerShell script to download latest private GitHub release?如何使用 PowerShell 脚本下载最新的私有 GitHub 版本?
【发布时间】:2024-09-21 17:15:01
【问题描述】:

我最近编写了一个 PowerShell 脚本,该脚本从 public 存储库下载最新版本,并且按预期工作。但是,我想更改我的脚本,以便它可以访问我的 private 存储库。这是我到目前为止尝试过的代码:

# Download latest release from GitHub
$credentials="myPersonalAccessToken"
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Authorization", "token $credentials")

$repo = "myUserName/MyPrivateReleaseRepo"
$file = "MyBinaries.zip"

$releases = "https://api.github.com/repos/$repo/releases"

Write-Host Determining latest release
$tag = (Invoke-WebRequest $releases -Headers $headers | ConvertFrom-Json)[0].tag_name

$download = "https://github.com/$repo/releases/download/$tag/$file"
$name = $file.Split(".")[0]
$zip = "$name-$tag.zip"
$dir = "$name-$tag"

Write-Host Dowloading latest release
Invoke-WebRequest $download -Headers $headers -Out $zip

Write-Host Extracting release files
Expand-Archive $zip -Force

# Cleaning up target dir
Remove-Item "C:\MyOutPutFolder\$name" -Recurse -Force -ErrorAction SilentlyContinue 

# Moving from temp dir to target dir
Move-Item $dir\$name -Destination "C:\MyOutPutFolder\$name" -Force

# Removing temp files
Remove-Item $zip -Force
Remove-Item $dir -Recurse -Force

只有在使用我的私人仓库时才会出现以下错误:

Invoke-WebRequest : The remote server returned an error: (404) Not Found
At C:\Script\DownloadLatestGitHubRelease.ps1:25 char:1
+ Invoke-WebRequest $download -Headers $headers -Out $zip
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

我还尝试提供错误凭据与正确凭据,并在按预期提供不正确凭据时出现“错误凭据”错误,因此我相信我正确使用了令牌。

我做错了什么?提前感谢您的任何建议。

【问题讨论】:

    标签: powershell github github-api


    【解决方案1】:

    来到这里试图做同样的事情。在深入研究了一些类似的 bash 脚本后,我想出了这个来下载:

    $token = "<your token from https://github.com/settings/tokens>"
    $downloadFolder = "C:\temp";
    $ownerSlashRepo = "owner/reop";
    $tag = "latest";
    
    $json = Invoke-Webrequest -Uri "https://api.github.com/repos/$ownerSlashRepo/releases/$tag" -Headers @{'Authorization'='token '+$token; 'Accept'='application/json'}
    $release = $json.Content | ConvertFrom-Json
    $release.assets | %{
        $asset = $_;
        $x = Invoke-Webrequest -Uri $($asset.url) -OutFile "$downloadFolder\$($asset.name)" -Headers @{'Authorization'='token '+$token; 'Accept'='application/octet-stream'}
    }
    

    这会下载版本中的每个文件,但您可以过滤它以根据需要只下载一个文件,例如:

    $release.assets | ?{$_.name -eq 'foo.zip'} | %{
    

    为了回答您的问题,在原始代码中,您尝试将令牌与https://github.com 一起使用。我起初尝试过类似的结果,并得到了与您描述的相似的结果。我认为它只适用于https://api.github.com 和 REST API。我还发现我必须在下载资产时指定 Accept:application/octet-stream。

    【讨论】:

      最近更新 更多