Начать сборку vNext из Powershell и получить артефакты

Чтобы автоматизировать наши развертывания, я хотел бы перестроить приложение на основе данного ChangeSetId. Как только эта сборка завершена, я хочу получить артефакты сборки (.exe), чтобы мы могли их развернуть. Ради вопроса я сосредотачиваюсь на части "Получить артефакты из сборки".

Для целей DevOps я бы хотел использовать PowerShell, так как он должен иметь доступ к библиотекам API TFS и потому, что MS рекомендует его использовать.

Окружающая среда

Я установил Builds на нашем сервере On Premise TFS 2015 (который работает аккуратно) - и добавил задачу VSO "Опубликовать артефакты" после этой сборки. Все идет нормально. Опубликованные артефакты должны храниться на Сервере, что в основном означает, что я должен загрузить артефакты, связанные с сборкой - каждая существующая сборка будет связана с ее артефактами, что лучше, чем сокращение UNC в моей книге.

Мне не приходит вызов; как мне программно обращаться к этим артефактам, шаг 3?

  • Получить источники для ChangeSetId
  • Приложение MSBuild с заданной конфигурацией
  • Получить сборку артефактов с помощью PowerShell
  • Развертывание в среду с помощью управления версиями (Powershell).

Ответ 1

TFS 2015 поставляется с новым REST API и включает метод получения артефактов конкретной сборки. Я бы подошел к вашей проблеме следующим образом:

  • Добавьте шаг сборки "PowerShell script" после шага "Опубликовать артефакты".
  • В этом PowerShell script:
    • Получить идентификатор текущей сборки. TFS предоставляет количество предопределенных переменных, а также идентификатор сборки. Все эти переменные попадают в переменную окружения, а этот пост может помочь вам прочитать соответствующий файл PowerShell script
    • Затем сделайте веб-запрос получить артефакты сборки. Как вы можете видеть из описания API, вам нужно будет предоставить только идентификатор сборки
    • Затем проанализируйте ответ JSON - свойство downloadUrl содержит ссылку для загрузки всех артефактов сборки, заархивированных как один архив
    • Наконец, извлеките архив и заберите те артефакты, которые вам нужны. Возможно, вы также захотите развернуть его в тестовой среде на этом этапе.

Надеюсь, что это поможет.

Ответ 2

Хорошо, как сказал Ян Скляренко, TFS 2015 (и 2013, после некоторого обновления) имеет отличный REST API.

Я создал очень грубую базовую PowerShell script, которая делает то, что я хочу. Я не могу подчеркнуть, насколько этот код нуждается в рефакторинге - мне просто нужно было это работать как доказательство концепции, и мы разработаем несколько сценариев для разных потребностей, но для людей, которые пришли сюда для примера кода, вы найдете это здесь.

  • Подключиться к системе сборки TFS
  • Элементы определения списка сборки (для себя, Poc)
  • Найдите строку и получите идентификатор сборки
  • Удалите сборку, используя жесткий код ID 7 (потому что я знал, что это сработает, и поэтому моя работа была выполнена)
  • Получить артефакты (в которых я включил задачу сборки VSO "Опубликовать сервер артефактов" )
  • Извлеките полученные Артефакты, потому что TFS их застегивает.

Оттуда я включу эти сценарии и выходы в службы MS Release Management - и будьте готовы к миграции на VSO Release vNext, когда она отправляется на локальную TFS 2015!

    $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)