11

デプロイを自動化するために、特定の ChangeSetId に基づいてアプリケーションを再構築したいと考えています。このビルドが完了したら、ビルドのアーティファクト(.exe) を取得してデプロイできるようにします。質問のために、「ビルドからアーティファクトを取得する」部分に焦点を当てています。

DevOps の目的で、TFS API ライブラリにアクセスできる必要があり、MS が PowerShell の使用を推奨しているため、PowerShell を使用したいと思います。

環境

オンプレミス TFS 2015 サーバーでビルドをセットアップしました (これは正常に動作しています) 。このビルドの後にVSO タスク「アーティファクトの公開」を追加しました。ここまでは順調ですね。公開されたアーティファクトはサーバーに保存されます。これは基本的に、ビルドに接続されたアーティファクトをダウンロードする必要があることを意味します-既存のすべてのビルドにはアーティファクトがリンクされます-これは私の本のUNCドロップよりも優れています.

いいえ、私の挑戦はありません。これらのアーティファクトにプログラムでアクセスするにはどうすればよいですか (ステップ 3)。

  1. ChangeSetId のソースを取得する
  2. 指定された構成の MSBuild アプリケーション
  3. PowerShell を使用してビルド アーティファクトを取得する
  4. Release Management (Powershell も) を使用して環境にデプロイする
4

2 に答える 2

10

TFS 2015 には新しい REST APIが付属しており、特定のビルドの成果物を取得するメソッドが含まれています。私はあなたの挑戦に次のようにアプローチします:

  • 「アーティファクトの公開」ステップの後に「PowerShell スクリプト」ビルド ステップを追加します。
  • その PowerShell スクリプトで:
    • 現在のビルドの ID を取得します。TFS は多数の事前定義された変数を公開し、ビルド ID はそこにあります。これらの変数はすべて環境変数になります。この投稿は、PowerShell スクリプトから適切な変数を読み取るのに役立ちます。
    • 次に、ビルド アーティファクトを取得するための Web リクエストを行います。API の説明からわかるように、ビルド ID のみを指定する必要があります。
    • 次に、JSON 応答を解析します。downloadUrlプロパティには、単一のアーカイブとして圧縮されたビルドのすべてのアーティファクトをダウンロードするためのリンクが含まれています。
    • 最後に、アーカイブを抽出し、必要なアーティファクトを取得します。おそらく、このステップでもテスト環境にデプロイしたいと思うでしょう。

お役に立てれば。

于 2015-09-14T08:19:47.450 に答える
7

Yan Sklyarenko が言ったように、TFS 2015 (およびいくつかの更新後の 2013) には優れた REST API があります。

私は、私が望むことを行う非常に大まかな基本的な PowerShell スクリプトを作成しました。このコードのリファクタリングがどれだけ必要かを強調することはできません。概念実証として機能するために必要だっただけです。さまざまなニーズに合わせて複数のスクリプトを開発しますが、コード例を求めてここに来た人のために、ここです。

  1. TFS のビルド システムに接続する
  2. ビルド定義項目の一覧表示 (自分用、Poc)
  3. 文字列を検索してビルド ID を取得する
  4. ハードコーディングされた ID 7 を使用して、ビルドを開始します(これが機能することがわかっていたため、私の作業は完了しました)
  5. Artifactsを取得します(VSO ビルド タスク 'Publish Artifacts Server ' を組み込みました)。
  6. TFS がそれらを圧縮するため、Extract は受信したArtifactsを言いました。

そこから、これらのスクリプトと出力を MS Release Management サービスに組み込み、オンプレミス 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)
于 2015-09-14T17:56:42.960 に答える