TFS 2017 Update 2构建发布任务:变量指定安全文件输入值及票据生成
在TFS 2017 Update 2中通过变量指定SecureFile并生成运行时下载票据
相信你已经发现了,TFS 2017 U2里现成的securefile输入控件只能从下拉列表选已上传的安全文件,完全没法用变量或者手动输入文件名来动态指定——这确实挺头疼的。下面我分两个部分给你讲清楚怎么绕开这个限制:
一、通过变量指定需下载的安全文件名
要实现变量指定文件名,咱们有两种可行的路子:
1. 自定义任务修改输入配置(适合自己开发的任务)
如果你是自己写的自定义构建/发布任务,直接改任务的task.json配置就行:把原来的securefile类型输入改成普通的string类型,这样就能支持变量输入了。
举个例子,原来的输入定义是这样的:
{ "name": "targetSecureFile", "type": "securefile", "label": "选择安全文件", "required": true }
改成下面这样,就能让用户输入变量(比如$(MySecureFileName))了:
{ "name": "targetSecureFile", "type": "string", "label": "安全文件名(支持变量)", "required": true }
之后在任务的执行脚本里,就可以用这个变量值去调用TFS API定位并下载对应的安全文件。
2. 用PowerShell脚本前置处理(适合用现成任务的场景)
不想改任务的话,就在需要用到安全文件的任务前面加一个PowerShell脚本任务,通过TFS REST API根据变量指定的文件名拿到安全文件的ID,再把ID存成自定义变量供后续使用。
脚本的核心逻辑大概是这样:
# 获取当前TFS上下文信息 $collectionUrl = $env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI $projectId = $env:SYSTEM_TEAMPROJECTID $fileName = $(MySecureFileName) # 这里是你定义的变量 # 调用API获取对应文件名的安全文件 $secureFilesUrl = "$collectionUrl/$projectId/_apis/distributedtask/securefiles?api-version=3.2-preview.1" $secureFiles = Invoke-RestMethod -Uri $secureFilesUrl -Headers @{Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"} -Method Get $targetFile = $secureFiles.value | Where-Object { $_.name -eq $fileName } if (-not $targetFile) { throw "找不到名为 $fileName 的安全文件" } # 把安全文件ID存入自定义变量,供后续任务使用 Write-Host "##vso[task.setvariable variable=SecureFileId;]$($targetFile.id)"
注意:要给这个PowerShell任务开启“允许脚本访问OAuth令牌”的选项,不然没法调用API。
二、强制生成运行时下载票据
现成任务的票据是在队列阶段生成的,要是安全文件是运行时才确定的,就得在运行时主动调用API生成下载票据。步骤如下:
- 先用上面的方法拿到目标安全文件的ID(存在
$(SecureFileId)变量里) - 在脚本里调用生成票据的API:
$ticketUrl = "$collectionUrl/$projectId/_apis/distributedtask/securefiles/$(SecureFileId)/downloadticket?api-version=3.2-preview.1" $ticketResponse = Invoke-RestMethod -Uri $ticketUrl -Headers @{Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"} -Method Post $downloadTicket = $ticketResponse.value # 拼接下载URL $downloadUrl = "$collectionUrl/$projectId/_apis/distributedtask/securefiles/$(SecureFileId)/download?ticket=$downloadTicket" # 下载文件到代理机器的指定路径 Invoke-WebRequest -Uri $downloadUrl -OutFile "C:\agent\_work\$(System.JobId)\mySecureFile.zip"
这样就能在运行时动态生成票据并下载文件了,完全不受队列阶段的限制。
额外注意事项
- 确保执行脚本的服务账号拥有安全文件的读取权限,不然API调用会返回权限错误
- TFS 2017 U2对应的API版本用
3.2-preview.1就好,别用太高的版本,避免兼容性问题 - 变量引用要确保拼写正确,要是是发布管道里的变量,要确认变量的作用域覆盖到了当前任务
内容的提问来源于stack exchange,提问作者pwil301
相关产品推荐
相关产品推荐

