Пометка репозитория TFS Git во время выпуска

Я устанавливаю нашу среду сборки/выпуска, используя TFS 2017.

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

Мы хотели бы пометить выпущенные версии в нашем репозитории git, чтобы легко узнать, какая версия git соответствует бинарному файлу. Параметр «Label Source» в определении сборки позволяет пометить ревизию git во время сборки, но, поскольку мы строим каждую фиксацию, это будет генерировать множество тегов, которые нам не нужны (поскольку они нигде не развернуты до тех пор, пока выпуск произведен).

Как можно настроить TFS так, чтобы при создании релиза (или, возможно, развертывании в среде) тег создавался для соответствующей фиксации в нашем репозитории Git?


person ndeslandes    schedule 17.03.2017    source источник


Ответы (3)


Вы можете добавить теги с помощью REST API:

POST https://{instance}/DefaultCollection/_apis/git/repositories/{repository}/refs?api-version={version}

[
  {
    "name": {string},
    "oldObjectId": {string}, (The current commit id the ref is at. 0000000000000000000000000000000000000000 when creating a new ref.)
    "newObjectId": {string}
  }
]

Вызов Rest API через PowerShell:

$result = Invoke-RestMethod -Uri $uri -Method Get -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}

Дополнительную информацию см. в разделе Вызов API VSTS с помощью PowerShell ( применить к tfs 2017)

person starian chen-MSFT    schedule 23.03.2017
comment
Великолепно! Это именно то, что мне было нужно. Ссылка на фиксацию доступна в релизе в переменной $(BUILD.SOURCEVERSION), поэтому я могу назначить новый тег этой ревизии. Вот команда PS, которую я использовал: Invoke-RestMethod $uri -Method Post -Body (ConvertTo-Json $body) -Credential $cred -ContentType "application/json" И свойство name в теле должно быть установлено примерно так: "refs/tags/v_0.9.234.2" - person ndeslandes; 24.03.2017

Я создал расширение vsts, которое делает именно это: https://marketplace.visualstudio.com/items?itemName=jabbera.git-tag-on-release-task

person Mike Barry    schedule 21.11.2017
comment
Это выглядит потрясающе! Я проверю это как можно скорее. - person ndeslandes; 23.11.2017

Вы можете добавить задачу командной строки в определение выпуска и использовать команду git git tag -a vx.x $(Build.SourceVersion) -m "xxx", чтобы добавить тег, см. снимок экрана ниже:

введите здесь описание изображения

=========================================================================

Обновление:

Чтобы не указывать рабочую папку, в которую был извлечен git reop, вы можете опубликовать папку $(build.sourcesdirectory) для перетаскивания в определении сборки, а затем в определении выпуска вы можете просто выбрать каталог перетаскиваемой папки. Проверьте скриншоты ниже:

введите здесь описание изображения

введите здесь описание изображения

person Cece Dong - MSFT    schedule 20.03.2017
comment
Большое спасибо за предложение. Но это работает только в том случае, если вы знаете, где найти каталог агента, который содержит извлечение репозитория git (C:\TFS2015Agent\agent_work\4\s в вашем примере). Что делать, если выпуск происходит на другом агенте сборки? Или, что еще хуже, что, если каким-то образом другой репозиторий был клонирован в том месте, где выполняется тег git. Вы можете в конечном итоге пометить неправильный репо! - person ndeslandes; 20.03.2017
comment
Что ж, я предполагал, что это сработает... Но кажется невероятно расточительным упаковывать весь исходный каталог как артефакт в каждой сборке только для того, чтобы добавить тег в репозиторий! Представьте, если бы репо было 1 ГБ! Не говоря уже о том, что это также будет включать в себя всю историю Git, так что вы можете искать несколько ГБ для большого репо. - person ndeslandes; 23.03.2017
comment
Вместо того, чтобы публиковать папку с исходниками, почему бы просто не указать $(Build.Repository.LocalPath) как рабочую папку? - person JamesQMurphy; 26.05.2018
comment
В выпуске источник не извлечен, а $(Build.Repository.LocalPath) и $(Build.SourcesDirectory) не заполнены. Я думаю, что REST API, вероятно, лучше. - person Jaykul; 18.07.2018