关于azure devops:使用PowerShell下载安全文件

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)并指定要下载的filename

注意:由于该任务不适用于TFS,因此可以为TFS帐户安装类似的任务,例如"下载安全文件扩展名"。

2.将安全文件复制到另一个目录

例如将安全文件复制到$(Build.ArtifactStagingDirectory),可以使用PowerShell脚本:

1
Copy-Item -Path $(Agent.WorkFolder)\_temp\filename -Destination $(Build.ArtifactStagingDirectory)

或使用"复制文件"任务将安全文件复制到$(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的官员。