E. *_*aal 8 powershell azure-devops
我正在尝试为需要从库下载安全文件的VSTS 创建一个新的发布任务。但是,当我运行以下 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"
Run Code Online (Sandbox Code Playgroud)
小智 6
我能够使用 REST API、任务的访问令牌和应用程序/八位字节流的 Accept 标头下载安全文件。我启用了“允许脚本访问 OAuth 令牌”。这里我的 task.json 使用名为“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
Run Code Online (Sandbox Code Playgroud)
我正在使用“$(Build.QueuedById)”来获取构建任务中的用户 ID,但老实说,我认为在那里使用什么字符串并不重要。
如果您没有 Accept 标头,则会为您尝试下载的文件取回 JSON 元数据。
不幸的是,我是从其他 SO 帖子和 github 问题页面拼凑而成的;我找不到任何官方记录我在那里使用的 URL。
没有这样的 REST API 来下载安全文件,但您可以使用助手的下载安全文件任务。
由于安全文件在构建过程中仅存在于临时位置,因此您应该首先通过下载安全文件任务下载安全文件,然后将安全文件复制到另一个目录:
您可以添加下载安全文件任务(适用于 VSTS)并指定filename要下载的文件。
注意:由于该任务不适用于 TFS,因此您可以为您的 TFS 帐户安装类似的任务,例如下载安全文件扩展名。
例如将安全文件复制到$(Build.ArtifactStagingDirectory),可以使用 PowerShell 脚本:
Copy-Item -Path $(Agent.WorkFolder)\_temp\filename -Destination $(Build.ArtifactStagingDirectory)
Run Code Online (Sandbox Code Playgroud)
或者使用复制文件任务将安全文件复制到$(Build.ArtifactStagingDirectory).
顺便提一句: