从 Powershell 启动 vNext 构建并获取工件
Posted
技术标签:
【中文标题】从 Powershell 启动 vNext 构建并获取工件【英文标题】:Start vNext build from Powershell and get artifacts 【发布时间】:2015-12-06 09:28:40 【问题描述】:为了自动化我们的部署,我想根据给定的 ChangeSetId 重新构建一个应用程序。此构建完成后,我想获得构建的工件(.exe),以便我们可以部署它们。为了这个问题,我将重点放在“从构建中获取工件”部分。
出于 DevOps 的目的,我想使用 PowerShell,因为它应该能够访问 TFS API 库并且因为 MS 建议使用它。
环境
我已经在我们的 On Premise TFS 2015 服务器中设置了构建(运行良好) - 并在此构建之后添加了一个 VSO 任务“发布工件”。到目前为止,一切都很好。 已发布的工件将存储在服务器上,这基本上意味着我必须下载连接到构建的工件 - 每个现有构建都将链接其工件 - 这比我书中的 UNC 下降更好。
不,我的挑战来了;如何以编程方式访问这些工件,步骤 3?
-
获取 ChangeSetId 的来源
具有给定配置的 MSBuild 应用程序
使用 PowerShell 获取构建工件
使用 Release Management(也包括 Powershell)部署到环境
【问题讨论】:
请注意,在当前版本中,已发布的工件在发布期间会自动连接并易于访问,使用 $(variables) 【参考方案1】:TFS 2015 附带new REST API,它包括获取特定构建工件的方法。我会通过以下方式应对您的挑战:
在“发布工件”步骤之后添加“PowerShell 脚本”构建步骤 在该 PowerShell 脚本中: 获取当前构建的 ID。 TFS 公开a number of predefined variables,并且构建 ID 在那里。所有这些变量最终都成为环境变量,this post 可以帮助您从 PowerShell 脚本中读取相应的变量 接下来,向get build artifacts 发出网络请求。从 API 描述中可以看出,您只需提供构建 ID 然后,解析 JSON 响应 -downloadUrl
属性包含用于下载压缩为单个存档的所有构建工件的链接
最后,提取存档并获取您需要的那些工件。也许,您也希望在此步骤中将其部署到您的测试环境中
希望这会有所帮助。
【讨论】:
这正是我今天一直在做的事情。我正在考虑使用 Powershell Cmdlets,但我确实注意到了 REST API。【参考方案2】:好吧,就像 Yan Sklyarenko 所说,TFS 2015(和 2013,经过一些更新)具有出色的 REST API。
我创建了一个非常、非常粗糙的基本 PowerShell 脚本,它可以满足我的需求。我不能足够强调这段代码需要重构多少——我真的只是需要它来作为概念证明,我们将针对不同的需求开发多个脚本,但是对于来这里获取代码示例的人,你会发现在这里。
-
连接到 TFS 的构建系统
列出构建定义项目(为我自己,Poc)
搜索一些字符串并获取构建 ID
使用硬编码 ID 7 开始构建(因为我知道这会起作用,因此我的工作已经完成)
获取 Artifacts(我在其中加入了 VSO 构建任务 'Publish Artifacts Server')
提取说收到的工件,因为 TFS 会压缩它们。
从那时起,我将把这些脚本和输出合并到 MS 发布管理服务中 - 并准备好在为本地 TFS 2015 发布时迁移到 VSO Release vNext!
$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 启动 vNext 构建并获取工件的主要内容,如果未能解决你的问题,请参考以下文章
在VNext构建中执行Visual Studio Test任务期间无法发布测试结果
TFS 2015 更新 3 Vnext 构建定义复制除父项目之外的所有工件