Как связать сборки в TFS 2015?

Есть ли способ в TFS 2015 иметь две сборки, чтобы вторая сборка запускалась всякий раз, когда первая завершается (успешно)? Там есть solutions для старой системы сборки на основе XAML, но ничего для новой системы на основе сценариев, что и Я использую.


person Frederick The Fool    schedule 28.08.2015    source источник


Ответы (3)


Этот вопрос всплывает время от времени. Официальная документация буквально говорит "еще нет" (см. последнюю запись вопросов и ответов). Также есть старое предложение по UserVoice, которое находится в состоянии «Запланировано» с марта этого года. Это довольно многообещающе и позволяет мне надеяться, что это будет реализовано в системе сборки vNext в первую очередь.

person Yan Sklyarenko    schedule 04.09.2015
comment
Дорожная карта TFS vNext вышла на второй квартал 2016 года... функция до сих пор там не отображается - person felickz; 14.01.2016

Я добился «цепочки» сборок, создав пользовательскую задачу BuildTask, которая в основном просто делает соответствующие вызовы TFS REST Api. Это позволяет мне затем определить определение сборки (по имени), которое я хочу вызвать, и сверху добавить некоторые условия (например, проверить, есть ли сборка этого определения, уже поставленная в очередь, или проверить, была ли последняя сборка определенного определения успешной). ).

Если есть интерес, я загрузил исходный код на github.

Используя tfx, вы можете загрузить задачу в свою TFS подробнее здесь
Короче говоря, просто возьмите файлы с github, установите tfx через узел и запустите

tfx build tasks upload --task-path ./triggerbuildtask

После этого вы можете выбрать Запустить новую задачу сборки и настроить ее: введите здесь описание изображения

Надеюсь, это может помочь некоторым людям, которые пытаются достичь того же.

Изменить
Я упаковал задачу и опубликовал ее в Marketplace, чтобы ее было легко использовать в вашей среде:
Запустить задачу сборки

person huserben    schedule 12.03.2017
comment
Использование rest API на данный момент кажется правильным решением этой проблемы. - person cli; 10.04.2017

Этот ответ применим, только если:

  • Вы используете Git с TFS2015
  • Вы хотите последовательно создавать подмодули в рамках суперпроектов.
  • Все рассматриваемые сборки являются сборками непрерывной интеграции.

Если это так, то вы можете выстроить цепочку с помощью читерства (у меня это работает):

  1. В каждом из подмодулей добавьте пакетный файл (зафиксированный в систему управления версиями) со сценарием, который повторно добавляет последнюю фиксацию ветки этого подмодуля (которая создается) в свой суперпроект. Предполагаемый (побочный) эффект этого состоит в том, чтобы внести «изменение» в состояние суперпроекта, достаточное для запуска сборки CI для этого суперпроекта.
  2. В определения сборки для каждого подмодуля добавьте «Пакетный сценарий» vNext шаг.
  3. Укажите этот шаг в пакетном файле для соответствующего подмодуля.
  4. Этот шаг сборки должен быть последним шагом вашей сборки, чтобы гарантировать, что он будет выполняться только в случае успеха сборки, а затем выполнить его «мод» и запустить сборку CI в суперпроекте.

Для начала см. приведенный ниже пример сценария. Этот конкретный скрипт работает только с подмодулями, которые "вложены" друг в друга - в стиле матрешки - в файловой системе. В противном случае для каждого подмодуля потребуется собственный сценарий.

Обратите внимание, что он включает в себя несколько обходных путей для некоторых проблем, с которыми я столкнулся, чтобы заставить его делать то, что мне нужно (т.е. клонировать/инициировать подмодули на моем компьютере локально перед отправкой изменений на сервер, а затем выполнять уборку -up файлов).

Дайте мне знать, если потребуются дополнительные комментарии.

REM Name of your submodule repository...
set subRepo=%1
REM Name of your superproject (with respect to this submodule) repository...
set superRepo=%2
REM Name of the folder into which the content of submodule will be cloned ...
REM Without this alias the folder will be called the same as the repo you are cloning.
set subAlias=%3
REM Branch to link to, given by $(Build.SourceBranchName) in the parameters you pass 
REM to the "Run Batch" build step (that will be executing this batch file)...
set branch=%4

REM Repositories' URLs - ONLY SAMPLE URLS - Please use your own !!!
set superUrl="http://<YourTfsServerName>:8080/tfs/DefaultCollection/_git/%superRepo%"
set subUrl="http://<YourTfsServerName>:8080/tfs/DefaultCollection/<YourSuperProjectName>/_git/%subRepo%"

REM Get the latest commit on current branch...
git log -1 --pretty=format:"%%h" > Output.txt
for /f %%i in (Output.txt) do set commit=%%i

IF NOT EXIST %superRepo% GOTO NOWINDIR

cd %superRepo%
REM Handle the .git directory specifically...
cd .git
for /F "delims=" %%i in ('dir /b') do (rmdir "%%i" /s/q || del "%%i" /s/q)
cd ..
rmdir .git
REM Remove the rest of files and folders...
for /F "delims=" %%i in ('dir /b') do (rmdir "%%i" /s/q || del "%%i" /s/q)
cd ..
rmdir %superRepo%

:NOWINDIR
REM Clone superproject and checkout the required branch *********************************************
git clone %superUrl%
cd %superRepo%
git checkout %branch%
git pull origin %branch%
git submodule update --init --recursive -f
cd %subAlias%
git checkout %commit% 
cd ..

git add %subAlias%

git commit %subAlias% -m "Updated %subRepo% reference to %commit% as %subAlias%"
git push origin %branch%
person Victoria    schedule 27.10.2016