2015-08-28 2 views
3

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

ответ

4

Этот вопрос возникает время от времени. Официальные документы literally say "not yet" (см. Последнюю Q & Запись). Существует также an ancient suggestion on UserVoice, который находится в плановом состоянии с марта этого года. Это довольно многообещающе и позволяет мне надеяться, что это будет реализовано в системе сборки vNext.

+0

ТФС vNext дорожная карта к Q2 2016 года ... функция все еще не отображается там – felickz

1

Этот ответ относится только если:

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

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

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

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

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

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

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% 
3

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

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

Использование TFX вы можете загрузить задание на ваш TFS see details here
Короче просто захватить файлы из GitHub, установите TFX через узел и запустить

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

После этого вы можете выбрать Trigger новый Построить задачу и сконфигурируйте его: enter image description here

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

Редактировать
Я упакована задачу и опубликовал ее на рынке, так что позволяет легко использовать задачу в вашей среде:
Trigger Build Task

+0

Использование rest api звучит в правильном направлении на данный момент, чтобы решить эту проблему. – cli