Начать сборку 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)