Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Powershell启动vNext构建并获取工件_Powershell_Msbuild_Devops_Tfs 2015 - Fatal编程技术网

从Powershell启动vNext构建并获取工件

从Powershell启动vNext构建并获取工件,powershell,msbuild,devops,tfs-2015,Powershell,Msbuild,Devops,Tfs 2015,为了自动化我们的部署,我想基于给定的ChangeSetId重建一个应用程序。一旦这个构建完成,我想获得构建的工件(the.exe),以便我们可以部署它们。为了回答这个问题,我将重点放在“从构建中获取工件”部分 出于DevOps的目的,我希望使用PowerShell,因为它应该能够访问TFSAPI库,而且MS建议使用它 环境 我已经在我们的内部部署TFS 2015服务器中建立了构建(运行良好),并在此构建之后添加了一个VSO任务“发布工件”。到现在为止,一直都还不错。 发布的工件将存储在服务器上,

为了自动化我们的部署,我想基于给定的ChangeSetId重建一个应用程序。一旦这个构建完成,我想获得构建的工件(the.exe),以便我们可以部署它们。为了回答这个问题,我将重点放在“从构建中获取工件”部分

出于DevOps的目的,我希望使用PowerShell,因为它应该能够访问TFSAPI库,而且MS建议使用它

环境

我已经在我们的内部部署TFS 2015服务器中建立了构建(运行良好),并在此构建之后添加了一个VSO任务“发布工件”。到现在为止,一直都还不错。 发布的工件将存储在服务器上,这基本上意味着我必须下载连接到构建的工件-每个现有构建都将链接其工件-这比我书中的UNC drop更好

不,我的挑战来了;我如何编程访问这些工件,步骤3

  • 获取ChangeSetId的源
  • 具有给定配置的MSBuild应用程序
  • 使用PowerShell获取构建工件
  • 使用发布管理(也包括Powershell)部署到环境
  • TFS 2015附带了,它包括获取特定构建的工件的方法。我将以以下方式应对您的挑战:

    • 在“发布工件”步骤之后添加“PowerShell脚本”构建步骤
    • 在该PowerShell脚本中:
      • 获取当前生成的ID。TFS公开,并且构建ID在那里。所有这些变量最终都作为环境变量,可以帮助您从PowerShell脚本中读取相应的变量
      • 接下来,向发出web请求。正如您从API描述中看到的,您必须只提供构建ID
      • 然后,解析JSON响应,
        downloadUrl
        属性包含下载压缩为单个归档的构建的所有工件的链接
      • 最后,提取归档文件并提取您需要的工件。也许,您也想在这一步中将其部署到您的测试环境中

    希望这能有所帮助。

    好吧,正如Yan Sklyarenko所说,TFS 2015(以及经过一些更新后的2013)有一个出色的REST API

    我已经创建了一个非常非常粗糙的基本PowerShell脚本,它满足了我的需要。我再怎么强调这段代码需要重构的程度也不为过——我真的需要这段代码作为概念证明,我们将针对不同的需求开发多个脚本,但是对于来这里获取代码示例的人,您可以在这里找到它

  • 连接到TFS的生成系统
  • 列出构建定义项(针对我自己,Poc)
  • 搜索一些字符串并获取构建ID
  • 使用硬编码的ID 7开始构建(因为我知道这会起作用,因此我的工作完成了)
  • 获取工件(我在其中合并了VSO构建任务“发布工件服务器”)
  • Extract表示收到了工件,因为TFS将它们压缩
  • 从那时起,我将把这些脚本和输出合并到MS Release Management services中,并准备在内部部署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 cmdlet,但我确实注意到了REST API。请注意,在当前版本中,已发布的构件会自动连接,并且在发布期间可以使用$(变量)轻松访问