Как объединить сборки TFS в цепочку?

Другим вариантом было бы пойти с:

nmap <C-d> mzyyp`z

дает вам преимущество сохранения позиции курсора.

16
задан Daniel Mann 18 February 2016 в 15:28
поделиться

3 ответа

Вот как я это сделал ( http://sajojacob.com/2009/08/how-to-chain-tfs-builds/ )

Как связать сборки TFS? Опубликовано 5 августа 2009 г. пользователем Sajo - Без комментариев ↓

Один из моих коллег @gdurzi недавно задал мне этот вопрос. Звучит достаточно просто, чтобы поддерживать TFS из коробки, не так ли? С этим слишком много причуд. И я рекомендовал использовать всегда верную задачу MSBuild для вызова TFSBuild.exe для постановки новой сборки из первого TFSBuild.proj с чем-то вроде этого

TFSBuild.exe start / queue% TFSSVR%% TEAMPROJECT%% BUILDTYPE%

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

Есть несколько подходов, которые вы можете использовать в зависимости от вашего конкретного сценария, поэтому давайте определим сценарий здесь, у вас есть определение сборки Main_Build TFS, которое создает ваш основной проект, и вы хотите иметь возможность иметь несколько промежуточных сборок, запускающих одну и ту же Main_Build для компиляции / сборки, но настраиваемую для развертывания в зависимости от того, кто вызывает Main_Build. Очень полезно, когда у вас есть продукт, который развертывается для нескольких клиентов с необходимостью настраиваемых действий перед сборкой и после сборки для каждого клиента. Итак, вот один из способов создания цепочки сборок с TFS 2008.

Шаг 1. Давайте создадим настраиваемую задачу MSBuild с использованием объектной модели Team Foundation, которая ставит сборку в очередь с использованием агента сборки по умолчанию, связанного с файлом определения сборки.

Пример кода для организации очереди: QueueTFS.cs

using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.Build.Client;

// Get the team foundation server. 
TeamFoundationServer _tfsServer = TeamFoundationServerFactory.GetServer(_tfs); 

// Get the IBuildServer 
IBuildServer buildServer = (IBuildServer)_tfsServer.GetService(typeof(IBuildServer)); 

// Get the build definition for which a build is to be queued. 
IBuildDefinition definition = buildServer.GetBuildDefinition(teamProject, buildDefinition); 

// Create a build request for the build definition. 
IBuildRequest request = definition.CreateBuildRequest(); 
request.CommandLineArguments = "Pass any custom command line args here"; // Ex: Custom Targets file

// Queue the build. 
buildServer.QueueBuild(request, QueueOptions.None);

Шаг 2: Теперь скопируйте QueueTFS.dll в новую папку в TFS, где вы хотите создать файл определения промежуточной сборки.

Теперь давайте создадим минимальный TFSBuild. proj, который использует нашу новую задачу MSBuild и переопределяет цель EndToEndIteration. Это будет определение нашей промежуточной сборки, которое запустит сборку Main_Build. Обратите внимание, что вам нужно будет создать этот TFSBuild.proj вручную и просто указать местоположение файла проекта из пользовательского интерфейса определения сборки в новую папку.

Пример кода для минимального TFSBuild.proj:

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5"> 
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\TeamBuild\Microsoft.TeamFoundation.Build.targets" /> 
  <UsingTask TaskName="MyNewCustomTFSTask" AssemblyFile="QueueTFS.dll"/> 
  <Target Name="EndToEndIteration"> 
    <Message Text="About to trigger main build" Importance="high"/> 
    < MyNewCustomTFSTask TFS="http://TFSServer.com:8080/" TeamProject="TeamProject" BuildDefinition="Main_Build" TargetsFile="Custom.Target" XYZ="XYZ" /> 
    <!-- When everything is done, change the status of the task to "Succeeded" --> 
    <SetBuildProperties TeamFoundationServerUrl="$(TeamFoundationServerUrl)" BuildUri="$(BuildUri)" TestStatus="Succeeded" CompilationStatus="Succeeded"/> 
  </Target> 
</Project>

Шаг 3: Отредактируйте свой Файл Main_Build TFSBuild.proj с целевыми вызовами до и после сборки.

  <Target Name=“BeforeCompile“>

    <CallTarget Targets=“Custom_PreBuild“/>    

  </Target>

  <Target Name=“AfterDropBuild“ Condition=“‘$(BuildBreak)’!=’true’“>    

    <CallTarget Targets=“Custom_PostBuild“/>

  </Target>

Нам также нужна была возможность запускать Main_Build отдельно, для поддержки этого мы добавили условный импорт в наш Main_Build TFSBuild.proj для импорта файла целей по умолчанию с пустыми целями Custom_PreBuild и Custom_PostBuild. $ (CustomTarget) - это то, что вы должны передать в качестве аргумента командной строки на шаге 1 для request.CommandLineArguments

<Import Project="$(CustomTarget)" Condition="'$(CustomTarget)'!=''"/>
<!--Import CustomContoso.Target if no partner is passed in—>
<Import Project="EmptyCustom.Target" Condition="'$(CustomTarget)'==''"/> 

Шаг 4: Теперь создайте свой целевой файл Custom.

5
ответ дан 30 November 2019 в 23:00
поделиться

Вы пытаетесь развернуть решение в промежуточной среде? В таком случае хорошим методом является использование TFSDeployer из codeplex, который будет запускать другой сценарий PowerShell в зависимости от выбранного вами качества сборки ...

0
ответ дан 30 November 2019 в 23:00
поделиться

You необходимо добавить ограничение в вашу таблицу, лучше именованное:

ALTER TABLE YourSchema.YourTable ADD CONSTRAINT CHK_YourTable_YourColumn_ValidLimits
CHECK(YourColumn BETWEEN 1 AND 5)

В вашем операторе CREATE TABLE сделайте следующее:

CREATE TABLE YourSchema.YourTable(YourColumn INT NOT NULL CONSTRAINT CHK_YourTable_YourColumn_ValidLimits
CHECK(YourColumn BETWEEN 1 AND 5),
SomeOtherColumns VARCHAR(10)
);

Лучше всего явно указать ваши ограничения.

1) Вы хотите, чтобы сборка и постановка выполнялись как одна операция? Так что вы получите один консолидированный отчет о сборке, один файл журнала, одно задание в очереди сборки сервера, каждый шаг, выполняемый последовательно тем же агентом сборки, который выполнил предыдущий шаг?

Если да, то вы в основном находитесь в правильный путь. Я бы не стал > использовать tfsbuild.exe - запуск всей новой сборки сопряжен с большими накладными расходами, и я не уверен, каковы возможные побочные эффекты. Вместо этого я бы использовал задачу > для выполнения задач msbuild, определенных в ваших промежуточных скриптах.

2) Вы хотите, чтобы «сборка сборки» фактически помещалась в очередь отдельной «промежуточной сборки» "? Отдельные отчеты, файлы журналов и места в очереди? Возможность параллельного выполнения, если у вас есть несколько агентов сборки?

Если да, то:

  • создать новое определение (я) сборки для промежуточной стадии
  • добавить код к исходному определению сборки, который ставит в очередь [one / несколько] новых определений сборки с помощью Team Build API. Пример кода .
  • удалите все, что не связано с основной сборкой из исходного определения сборки
  • , убедитесь, что новые «промежуточные» определения не имеют автоматических триггеров (временные интервалы, события проверки, и т.д.)
7
ответ дан 30 November 2019 в 23:00
поделиться