Download secure file with PowerShell
我正在尝试为VSTS创建新的发布任务,该任务需要从库中下载安全文件。 但是,当我运行以下PowerShell脚本时,没有显示安全文件,但其中有两个。 这可能没有足够的权利吗? 什么应该改变。
另一个问题:当我能够列出安全文件时,我想下载一个特定的文件。 我还没有找到有关如何执行此操作的示例。 有人知道一个例子吗?
1 2 3 4 5 6 7 8 | $url ="$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM_TEAMPROJECTID/_apis/distributedtask/securefiles" Write-Host"URL: $url" $secureFiles = Invoke-RestMethod -Uri $url -Headers @{ Authorization ="Bearer $env:SYSTEM_ACCESSTOKEN" } Write-Host"SecureFiles: $secureFiles" |
没有此类REST API可以下载安全文件,但是您可以使用助手的"下载安全文件"任务。
并且由于安全文件仅在构建期间位于临时位置,因此您应首先通过"下载安全文件"任务下载安全文件,然后再将安全文件复制到另一个目录:
1.下载安全文件
您可以添加"下载安全文件"任务(对于VSTS)并指定要下载的
注意:由于该任务不适用于TFS,因此可以为TFS帐户安装类似的任务,例如"下载安全文件扩展名"。
2.将安全文件复制到另一个目录
例如将安全文件复制到
1 | Copy-Item -Path $(Agent.WorkFolder)\_temp\filename -Destination $(Build.ArtifactStagingDirectory) |
或使用"复制文件"任务将安全文件复制到
顺便说一句:
- 由于您正在使用"下载安全文件"任务(由Matt Labrum开发),该任务只能从DropDownList中选择安全文件(不能使用变量)。但是存在启用使用变量来指定要下载的安全文件的问题,这提示了此功能,您可以跟进。
- 为了让REST API下载安全文件,目前尚不可用。但是从.NET客户端库中有一个用户语音访问"安全文件",您可以投票和跟进。
我能够使用REST API,任务的访问令牌和应用程序/八位字节流的Accept标头下载安全文件。我启用了"允许脚本访问OAuth令牌"。在这里,我的task.json使用名为" SecureFile"的secureFile。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | $secFileId = Get-VstsInput -Name SecureFile -Require $secTicket = Get-VstsSecureFileTicket -Id $secFileId $secName = Get-VstsSecureFileName -Id $secFileId $tempDirectory = Get-VstsTaskVariable -Name"Agent.TempDirectory" -Require $collectionUrl = Get-VstsTaskVariable -Name"System.TeamFoundationCollectionUri" -Require $project = Get-VstsTaskVariable -Name"System.TeamProject" -Require $filePath = Join-Path $tempDirectory $secName $token= Get-VstsTaskVariable -Name"System.AccessToken" -Require $user = Get-VstsTaskVariable -Name"Release.RequestedForId" -Require $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $User, $token))) $headers = @{ Authorization=("Basic {0}" -f $base64AuthInfo) Accept="application/octet-stream" } Invoke-RestMethod -Uri"$($collectionUrl)$project/_apis/distributedtask/securefiles/$($secFileId)?ticket=$($secTicket)&download=true&api-version=5.0-preview.1" -Headers $headers -OutFile $filePath |
我正在使用" $(Build.QueuedById)"来获取构建任务中的用户ID,但老实说,我认为在这里使用什么字符串都没有关系。
如果没有Accept标头,则将为尝试下载的文件返回JSON元数据。
不幸的是,我在其他SO帖子和github问题页面上将其拼凑起来。我在任何地方都找不到可以记录我正在使用的URL的官员。