使用PowerShell

时间:2018-03-08 14:28:06

标签: powershell azure-devops

我正在尝试为VSTS创建一个新的发布任务,需要从库中下载secure file。但是,当我运行以下PowerShell脚本时,不会显示安全文件,但其中有两个。这可能没有足够的权利吗?应该改变什么。

另一个问题:当我能够列出我要下载特定安全文件的安全文件时。我还没有找到关于如何做到这一点的任何例子。有谁知道一个例子?

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

2 个答案:

答案 0 :(得分:4)

没有此类REST API可下载安全文件,但您可以使用下载安全文件任务作为助手。

由于安全文件仅在构建期间存在于临时位置,因此您应首先通过下载安全文件任务下载安全文件,然后将安全文件复制到另一个目录:

1。下载安全文件

您可以添加Download secure file task(对于VSTS)并指定要下载的filename

注意:由于任务不适用于TFS,您可以为TFS帐户安装类似Download Secure File扩展名的任务。

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

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

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

或使用“复制文件”任务将安全文件复制到$(Build.ArtifactStagingDirectory)

BTW:

答案 1 :(得分:1)

我能够使用REST API,任务的访问令牌和应用程序/八位字节流的Accept标头下载安全文件。我启用了“允许脚本访问OAuth令牌”。在这里,我的task.json使用名为“ SecureFile”的secureFile。

$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的官员。