Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Последовательности построений в TFS

Anna | 17.06.2014 | нет комментариев
При применении подхода постоянной интеграции Зачастую появляется надобность в запуске не легко одного построения, а в запуске последовательности построений.

Это актуально когда код продукта разделён на несколько планов, и они зависят друг от друга.
В данной статье я хочу рассказать, как это дозволено сделать, применяя TFS сервер.

Пускай у нас есть два план «Assembly1» и «Assembly2».
Для плана «Assembly1» настроено два построения: «ClassLibrary1» и «ClassLibrary2».
Для плана «Assembly2» тоже настроено два построения: «A2.t2» и «A2.t3».

Нам требуется позже запуска построения «ClassLibrary1» запустить ступенчато «ClassLibrary2» и «A2.t2».

1. Примитивный и неторопливый метод (мы так делали прежде).

Настраиваем построения «ClassLibrary2» и «A2.t2» особым образом:

Указываем построение при check-in.

Добавляем рабочие папки от предыдущего контроллера построения.

Для построения «A2.t2» выполняются схожие действия.

Превосходство тут одно – не требуется модифицировать применяемый рабочий процесс для построения.
А вот недостатков огромнее:
— Чем огромнее применяется «рабочих каталогов», тем дольше осуществляется построение.
— Последовательность построений немыслимо запустить вручную, только check-in.
— Последовательность построений может выполниться в произвольном порядке, что не неизменно отлично.
В нашем случае мы не знаем, какое построение выполнится прежде «ClassLibrary2» либо «A2.t2».

2. Используем TFS API.

— Создаём новейший план «ClassLibrary».
— Добавляем новейший элемент «CodeActivity».
— Создаём два входных параметра «BuildDetail» и «TfsProjectAndBuildDefinition» 1-й применяется для приобретения и управления BuildServer’ом.
— Разбираем список планов и построений.
— Данный список состоит из строк, где всякая строка определяет имя плана, для которого осуществляется построение и имя построения разделённых точкой с запятой.
Ниже приведён код:

using System;
using System.Activities;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using Microsoft.TeamFoundation.Build.Client;
using Microsoft.TeamFoundation.Build.Workflow.Activities;
using Microsoft.TeamFoundation.Build.Workflow.Services;
using Microsoft.TeamFoundation.Client;

namespace QueueNewBuilds
{
	[BuildActivity(HostEnvironmentOption.Agent)]
	public sealed class QueueNewBuild : CodeActivity
	{
		// The Team Project that the build definition belongs to.
		[RequiredArgument]
		public InArgument<IBuildDetail> BuildDetail { get; set; }

		[RequiredArgument]
		public InArgument<String[]> TfsProjectAndBuildDefinition { get; set; }

		protected override void Execute(CodeActivityContext context)
		{
			String[] dirty = context.GetValue(this.TfsProjectAndBuildDefinition);
			IBuildDetail buildDetail = context.GetValue(this.BuildDetail);

			var pds = Parse(dirty);
			//var workspace = buildDetail.BuildDefinition.Workspace;
			IBuildServer buildServer = buildDetail.BuildServer;

			foreach (var pd in pds)
			{
				try
				{
					string message = string.Format("Queue new build \"{0}\"-\"{1}\"", pd.TfsProject, pd.BuildDefinition);
					context.TrackBuildMessage(message);

					IBuildDefinition buildDef = buildServer.GetBuildDefinition(pd.TfsProject, pd.BuildDefinition);
					buildServer.QueueBuild(buildDef);
				}
				catch (Exception ex)
				{
					string message = string.Format("Queue new build error \"{0}\"-\"{1}\", Exception : \"{2}\"",
							pd.TfsProject, pd.BuildDefinition, ex.Message);
					context.TrackBuildWarning(message);
				}
			}
		}

		private IEnumerable<ProjectDefinition> Parse(string[] dirty)
		{
			if (dirty == null)
				yield break;

			foreach (var item in dirty)
			{
				var t = item.Split(';');
				if (t.Length == 2)
				{
					ProjectDefinition pd = new ProjectDefinition();
					pd.TfsProject = t[0].Trim();
					pd.BuildDefinition = t[1].Trim();
					yield return pd;
				}
			}
		}

		class ProjectDefinition
		{
			public string TfsProject { get; set; }
			public string BuildDefinition { get; set; }
		}
	}
}

Для применения данной «activity» делаем копию «TfvcTemplate.12.xaml»
Модифицируем процесс построения:
Создаём новейший довод «QueueNewBuild» типа массив строк.

В блоке «Выполение в агенте» создаём переменную «buildDetail» типа «IBuildDetail».
Позже блока «Try» добавляем «activity» «GetBuildDetail» и «QueueNewBuild».
В блоке «GetBuildDetail» в качестве итога «Result» задаём «buildDetail».
В блоке «QueueNewBuild» в качестве параметра «BuildDetail» задаём значение «buildDetail» полученное на предыдущем шаге и в качестве параметра «TfsProjectAndBuildDefinition» задаём значение «QueueNewBuilds».

Сберегаем метаморфозы, компилируем и добавляем в TFS сервер (данные пункты думаю не имеет смысла расписывать, т.к. они детально расписаны скажем здесь: www.ewaldhofman.nl/post/2010/05/27/Customize-Team-Build-2010-e28093-Part-7-How-is-the-custom-assembly-found.aspx ).

Для построения «ClassLibrary1» исполняем настройку.
Выбираем преобразованный процесс. У меня он именуется «TfvcTemplate.12.2.xaml».

Задаём последовательность построения.

Сберегаем, запускаем построение и наслаждаемся ступенчато выполняющимся построением.

Итоги дозволено найти в лог файле.

Код доступен на Git: github.com/Serg2DFX/QueueNewBuilds/.

Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB