从Powershell启动vNext构建并获取工件
为了自动化我们的部署,我想基于给定的ChangeSetId重建一个应用程序。一旦这个构建完成,我想获得构建的工件(the.exe),以便我们可以部署它们。为了回答这个问题,我将重点放在“从构建中获取工件”部分 出于DevOps的目的,我希望使用PowerShell,因为它应该能够访问TFSAPI库,而且MS建议使用它 环境 我已经在我们的内部部署TFS 2015服务器中建立了构建(运行良好),并在此构建之后添加了一个VSO任务“发布工件”。到现在为止,一直都还不错。 发布的工件将存储在服务器上,这基本上意味着我必须下载连接到构建的工件-每个现有构建都将链接其工件-这比我书中的UNC drop更好 不,我的挑战来了;我如何编程访问这些工件,步骤3从Powershell启动vNext构建并获取工件,powershell,msbuild,devops,tfs-2015,Powershell,Msbuild,Devops,Tfs 2015,为了自动化我们的部署,我想基于给定的ChangeSetId重建一个应用程序。一旦这个构建完成,我想获得构建的工件(the.exe),以便我们可以部署它们。为了回答这个问题,我将重点放在“从构建中获取工件”部分 出于DevOps的目的,我希望使用PowerShell,因为它应该能够访问TFSAPI库,而且MS建议使用它 环境 我已经在我们的内部部署TFS 2015服务器中建立了构建(运行良好),并在此构建之后添加了一个VSO任务“发布工件”。到现在为止,一直都还不错。 发布的工件将存储在服务器上,
- 在“发布工件”步骤之后添加“PowerShell脚本”构建步骤
- 在该PowerShell脚本中:
- 获取当前生成的ID。TFS公开,并且构建ID在那里。所有这些变量最终都作为环境变量,可以帮助您从PowerShell脚本中读取相应的变量
- 接下来,向发出web请求。正如您从API描述中看到的,您必须只提供构建ID
- 然后,解析JSON响应,
属性包含下载压缩为单个归档的构建的所有工件的链接downloadUrl
- 最后,提取归档文件并提取您需要的工件。也许,您也想在这一步中将其部署到您的测试环境中
希望这能有所帮助。好吧,正如Yan Sklyarenko所说,TFS 2015(以及经过一些更新后的2013)有一个出色的REST API 我已经创建了一个非常非常粗糙的基本PowerShell脚本,它满足了我的需要。我再怎么强调这段代码需要重构的程度也不为过——我真的需要这段代码作为概念证明,我们将针对不同的需求开发多个脚本,但是对于来这里获取代码示例的人,您可以在这里找到它
$projectId ='{ProjectIdGuid}'
$buildNr = '3945'
$username = 'username'
$password = 'password'
$zipDestination = 'C:\temp\unzip\temp.zip'
$workingFolder = ('C:\temp\unzip\' + [System.DateTime]::Now.ToString("yyyyMMddhhmmss")) #temp because of file already exist warnings... after completion we should delete the working directory content
$tfsURL = 'http://myTFS:8080/tfs/MyCollection/'+ $projectId
$cred = New-Object System.Management.Automation.PSCredential($username, (ConvertTo-SecureString -String $password -AsPlainText -Force))
#write list of build definitions (to be used later)
$allbuildDefs = (Invoke-RestMethod -Uri ($tfsURL + '/_apis/build/definitions?api-version=2.0') -Method GET -Credential $cred).value | Where-Object {$_.name -like '*buildName*'} | Out-Default | select name
Write-Host($allbuildDefs)
$buildDefs = ConvertFrom-Json($allbuildDefs)
$buildId = ($buildDefs.value).id;
#Get build Definition for what you want to build
$buildDefinitionURI = $tfsURL + '/_apis/build/requests?api-version=1.0'
#kick off build
$body = '{ "definition": { "id": '+ 7 + '}, reason: "Manual", priority: "Normal"}'
$BuildReqBodyJson = $body | ConvertTo-Json
$buildOutput = Invoke-RestMethod -Method Post -Uri $buildDefinitionURI -Credential $cred -ContentType 'application/json' -Body $body
#get buildNr
#build URI for buildNr
$BuildURI = $tfsURL + '/_apis/build/builds/' + $buildNr + '/artifacts'
#get artifact downloadPath
$downloadURL = (Invoke-RestMethod -Uri $BuildURI -Credential $cred).Value.Resource.downloadUrl
#download ZIP
Invoke-WebRequest -uri $downloadURL -Credential $cred -OutFile $zipDestination
#unzip
Add-Type -assembly 'system.io.compression.filesystem'
[io.compression.zipfile]::ExtractToDirectory($zipDestination, $workingFolder)
这正是我今天一直在做的。我曾考虑使用Powershell cmdlet,但我确实注意到了REST API。请注意,在当前版本中,已发布的构件会自动连接,并且在发布期间可以使用$(变量)轻松访问