public void BuildDropProcessor_should_write_a_row_to_SQL() { var calculator = Substitute.For<IFolderSizeCalculator>(); calculator.Calculate(null).ReturnsForAnyArgs(new FolderSizeResult()); var interupt = Substitute.For<IWarehouseInterupt>(); var context = Substitute.For<IWarehouseContext>(); var buildServer = Substitute.For<ITeamFoundationBuildService>(); var dac = Substitute.For<IWarehouseDataAccessComponent>(); context.CreateWarehouseDataAccessComponent().Returns(dac); var queryResult = new BuildQueryResult(); var reader = new TeamFoundationDataReader(new object[] {new[] {queryResult}}); var buildDetail = new BuildDetail {DropLocation = @"\\foo\bar", Uri = "vstfs:///Build/Build/1"}; queryResult.Builds.Add(buildDetail); buildServer.QueryBuilds(null).ReturnsForAnyArgs(reader); var processor = new BuildDropProcessor(interupt, context, buildServer, calculator); var collectionId = Guid.NewGuid(); processor.ProcessBuildDrops(collectionId); dac.ReceivedWithAnyArgs().ExecuteNonQuery(CommandType.Text, null, null); }
private BuildDetail ConstructBuildDetails(string buildDetailsString) { var details = JObject.Parse(buildDetailsString); var buildDetails = new BuildDetail(); buildDetails.CommitHash = details["vcsRevisionKey"].Value <string>(); buildDetails.Successful = details["successful"].Value <bool>(); buildDetails.BuildResultKey = details["buildResultKey"].Value <string>(); buildDetails.PlanResultKey = details["planResultKey"]["key"].Value <string>(); var commitDetails = JObject.Parse(this.bitbucketApi.GetCommitDetails(buildDetails.CommitHash).Result); var errorMessage = commitDetails["errors"]?[0]["message"]?.Value <string>(); if (errorMessage != null) { throw new InvalidOperationException(errorMessage); } buildDetails.JiraIssue = commitDetails["properties"]?["jira-key"].Values <string>().Aggregate((s1, s2) => s1 + ", " + s2); buildDetails.AuthorEmailAddress = commitDetails["author"]["emailAddress"].Value <string>(); buildDetails.AuthorName = commitDetails["author"]["name"].Value <string>(); buildDetails.AuthorDisplayName = commitDetails["author"]["displayName"]?.Value <string>() ?? buildDetails.AuthorName; return(buildDetails); }
public void OutOfProcessPowerShellDeployAgent_should_serialize_build_detail_across_processes() { DeployAgentResult result; using (var scriptFile = new TemporaryFile(".ps1", "'Description:' + $TfsDeployerBuildDetail.BuildDefinition.Process.Description")) { var buildDetail = new BuildDetail { BuildDefinition = { Process = { Description = "My Process Template" } } }; var mapping = new Mapping { NewQuality = "Released", OriginalQuality = null, ScriptParameters = new ScriptParameter[0], Script = scriptFile.FileInfo.Name }; var buildStatusChangeEvent = new BuildStatusChangeEvent { StatusChange = new Change() }; var testDeployData = (new DeployAgentDataFactory()).Create(scriptFile.FileInfo.DirectoryName, mapping, buildDetail, buildStatusChangeEvent); var agent = new OutOfProcessPowerShellDeployAgent(null, ClrVersion.Version2); // Act result = agent.Deploy(testDeployData); } // Assert StringAssert.Contains(result.Output, "Description:My Process Template"); }
private IEnumerable <IBuildDetail> GetBuildsAcrossBranches( BuildDetail earliestBuild, BuildDetail latestBuild, string projectName, TfsConnection collection) { var buildServer = collection.GetService <IBuildServer>(); var versionControlServer = collection.GetService <VersionControlServer>(); var targetBranch = versionControlServer.QueryBranchObjects(new ItemIdentifier(latestBuild.BranchRoot), RecursionType.None); //All builds up until the branch var searchSpec = buildServer.CreateBuildDetailSpec(projectName, earliestBuild.Definition); searchSpec.MinFinishTime = earliestBuild.Date; searchSpec.MaxFinishTime = targetBranch.First().DateCreated; searchSpec.QueryDeletedOption = QueryDeletedOption.IncludeDeleted; var firstResultSet = buildServer.QueryBuilds(searchSpec); //Builds until last build on the target branch searchSpec = buildServer.CreateBuildDetailSpec(projectName, latestBuild.Definition); searchSpec.MaxFinishTime = latestBuild.Date; searchSpec.QueryDeletedOption = QueryDeletedOption.IncludeDeleted; var secondResultSet = buildServer.QueryBuilds(searchSpec); var builds = firstResultSet.Builds.Union(secondResultSet.Builds); return(builds); }
public void Deployer_should_pass_build_definition_name_to_configuration_reader() { // Arrange BuildDetail buildDetail = null; var statusChanged = new BuildStatusChangeEvent { StatusChange = new Change() }; var mappingProcessor = MockRepository.GenerateStub <IMappingProcessor>(); var tfsBuildDetail = new StubBuildDetail { BuildDefinition = { Name = "foo" } }; var buildServer = MockRepository.GenerateStub <IBuildServer>(); buildServer.Stub(o => o.GetBuild(null, null, null, QueryOptions.None)) .IgnoreArguments() .Return(tfsBuildDetail); var reader = MockRepository.GenerateStub <IConfigurationReader>(); reader.Stub(o => o.ReadMappings(Arg <BuildDetail> .Is.Anything)).WhenCalled(m => buildDetail = (BuildDetail)m.Arguments[0]); Func <BuildDetail, IBuildDetail, IPostDeployAction> postDeployActionFactory = (a, b) => MockRepository.GenerateStub <IPostDeployAction>(); var deployer = new Deployer(reader, buildServer, mappingProcessor, postDeployActionFactory); // Act deployer.ExecuteDeploymentProcess(statusChanged, 0); // Assert Assert.AreEqual("foo", buildDetail.BuildDefinition.Name); }
protected override IEnumerable <INotification> CreateNotifications(TeamFoundationRequestContext requestContext, BuildCompletionNotificationEvent buildNotification, int maxLines) { BuildDetail build = buildNotification.Build; var locationService = requestContext.GetService <ILocationService>(); var buildService = requestContext.GetService <TeamFoundationBuildService>(); using (var buildReader = buildService.QueryQueuedBuildsById(requestContext, build.QueueIds, new[] { "*" }, QueryOptions.None)) { var result = buildReader.Current <BuildQueueQueryResult>(); QueuedBuild qb = result.QueuedBuilds.FirstOrDefault(); string buildUrl = string.Format("{0}/{1}/{2}/_build#_a=summary&buildId={3}", locationService.GetAccessMapping(requestContext, "PublicAccessMapping").AccessPoint, requestContext.ServiceHost.Name, build.TeamProject, qb.BuildId); var notification = new BuildCompletionNotification() { TeamProjectCollection = requestContext.ServiceHost.Name, BuildUrl = buildUrl, ProjectName = build.TeamProject, BuildNumber = build.BuildNumber, BuildStatus = build.Status, BuildReason = build.Reason, StartTime = build.StartTime, FinishTime = build.FinishTime, RequestedForUniqueName = qb.RequestedFor, RequestedForDisplayName = qb.RequestedForDisplayName, BuildDefinition = build.Definition.Name, DropLocation = build.DropLocation, TeamNames = GetUserTeamsByProjectName(requestContext, build.TeamProject, qb.RequestedFor) }; yield return(notification); } }
public void Execute(BuildStatusChangeEvent statusChanged, BuildDetail buildDetail, Mapping mapping, IPostDeployAction postDeployAction, int deploymentId) { lock (_namedLockSet.GetLockObject(mapping.Queue)) { _deploymentEventRecorder.RecordStarted(deploymentId); var deployAgent = _deployAgentProvider.GetDeployAgent(mapping); // default to "happy; did nothing" if there's no deployment agent. var deployResult = new DeployAgentResult { HasErrors = false, Output = string.Empty }; if (deployAgent != null) { using (var workingDirectory = new WorkingDirectory()) { var deployAgentDataFactory = new DeployAgentDataFactory(); var deployData = deployAgentDataFactory.Create(workingDirectory.DirectoryInfo.FullName, mapping, buildDetail, statusChanged); deployData.DeploymentId = deploymentId; _deploymentFolderSource.DownloadDeploymentFolder(deployData.TfsBuildDetail, workingDirectory.DirectoryInfo.FullName); deployResult = deployAgent.Deploy(deployData); } } postDeployAction.DeploymentFinished(mapping, deployResult); _deploymentEventRecorder.RecordFinished(deploymentId, deployResult.HasErrors, deployResult.Output); } }
protected override void OnInit() { this.contentPane = UIPackage.CreateObject("UIMain", "BuildWindow").asCom; this.Center(); this.modal = true; _list = this.contentPane.GetChild("list").asList; _close = this.contentPane.GetChild("close").asLoader; _close.onClick.Add(delegate(EventContext context) { this.Hide(); }); _list.onClickItem.Add(__clickItem); //_list.itemRenderer = RenderListItem; _list.EnsureBoundsCorrect(); _detail = (BuildDetail)this.contentPane.GetChild("detail").asCom; _detail.visible = false; _confirmButton = this.contentPane.GetChild("confirm").asCom; _confirmButton.onTouchBegin.Add(buildConfirm); foreach (TowerTemplate tt in BattleManager.getInstance().buildableTowers) { BuildItem item = (BuildItem)_list.AddItemFromPool("ui://UIMain/BuildItem"); item.setTowerInfo(tt); } float interval = 300 / (_list.numChildren > 8?8:_list.numChildren); _list.columnGap = (int)interval; //_list.numItems = 3; }
public void MappingProcessor_should_record_mapped_event_for_applicable_mappings() { // Arrange const int eventId = 7; var mappingEvaluator = MockRepository.GenerateStub <IMappingEvaluator>(); var deploymentEventRecorder = MockRepository.GenerateStub <IDeploymentEventRecorder>(); var mappingExecutor = MockRepository.GenerateStub <IMappingExecutor>(); Func <IMappingExecutor> executorFactory = () => mappingExecutor; var mappingProcessor = new MappingProcessor(mappingEvaluator, deploymentEventRecorder, executorFactory); var postDeployAction = MockRepository.GenerateStub <IPostDeployAction>(); var buildDetail = new BuildDetail(); var mappings = new[] { new Mapping { Script = "AScript.ps1", Queue = "AQueue" } }; mappingEvaluator.Stub(o => o.DoesMappingApply(null, null, null)) .IgnoreArguments() .Return(true); var statusChanged = new BuildStatusChangeEvent { StatusChange = new Change() }; // Act mappingProcessor.ProcessMappings(mappings, statusChanged, buildDetail, postDeployAction, eventId); // Assert deploymentEventRecorder.AssertWasCalled(o => o.RecordQueued(eventId, mappings[0].Script, mappings[0].Queue)); }
public void PostDeployAction_should_set_KeepForever_and_save_build_when_RetainBuild_is_specified() { // Arrange var alert = MockRepository.GenerateStub <IAlert>(); var buildServer = MockRepository.GenerateStub <IBuildServer>(); var buildDetail = new BuildDetail(); var tfsBuildDetail = new StubBuildDetail(); ((IBuildDetail)tfsBuildDetail).KeepForever = false; buildServer.Stub(o => o.GetBuild(null, null, null, QueryOptions.None)) .IgnoreArguments() .Return(tfsBuildDetail); var mapping = new Mapping { RetainBuildSpecified = true, RetainBuild = true }; var result = new DeployAgentResult { HasErrors = false, Output = string.Empty }; var postDeployAction = new PostDeployAction(buildDetail, tfsBuildDetail, alert); // Act postDeployAction.DeploymentFinished(mapping, result); // Assert Assert.AreEqual(true, ((IBuildDetail)tfsBuildDetail).KeepForever, "KeepForever"); Assert.AreEqual(1, tfsBuildDetail.SaveCount, "Save()"); }
public void AgentShouldKillScriptsThatExceedTimeoutConstraints() { // Arrange var agent = new BatchFileDeployAgent(); const string deployScriptFilename = "SlowDeployment.bat"; var deployScriptDirectory = Directory.GetCurrentDirectory(); File.WriteAllText(deployScriptFilename, @"ping -n 10 127.0.0.1"); // script that just takes about nn seconds to execute // required because the deploy agent builds its own parameter list var tfsBuildDetail = new BuildDetail { DropLocation = string.Empty, BuildNumber = string.Empty, }; var deployAgentData = new DeployAgentData { DeployScriptRoot = deployScriptDirectory, DeployScriptFile = deployScriptFilename, Timeout = TimeSpan.FromSeconds(2), TfsBuildDetail = tfsBuildDetail, DeployScriptParameters = Enumerable.Empty <DeployScriptParameter>().ToList(), }; // Act var deployAgentResult = agent.Deploy(deployAgentData); // Assert Assert.IsTrue(deployAgentResult.Output.Contains(@"Pinging 127.0.0.1")); Assert.IsFalse(deployAgentResult.Output.Contains(@"Ping statistics")); // Clean up File.Delete(deployScriptFilename); }
public void MappingExecutor_should_call_post_deploy_action_when_script_not_specified() { // Arrange var deployAgentProvider = MockRepository.GenerateStub <IDeployAgentProvider>(); var deploymentFolderSource = MockRepository.GenerateStub <IDeploymentFolderSource>(); var deploymentEventRecorder = MockRepository.GenerateStub <IDeploymentEventRecorder>(); var namedLockSet = new NamedLockSet(); var mappingExecutor = new MappingExecutor(deploymentEventRecorder, deployAgentProvider, deploymentFolderSource, namedLockSet); var postDeployAction = MockRepository.GenerateStub <IPostDeployAction>(); var buildDetail = new BuildDetail(); var mapping = new Mapping { RetainBuildSpecified = true, RetainBuild = true }; var statusChanged = new BuildStatusChangeEvent { StatusChange = new Change() }; // Act mappingExecutor.Execute(statusChanged, buildDetail, mapping, postDeployAction, 0); // Assert postDeployAction.AssertWasCalled(o => o.DeploymentFinished( Arg <Mapping> .Is.Equal(mapping), Arg <DeployAgentResult> .Matches(result => !result.HasErrors)) ); }
public void MappingExecutor_should_record_started_time() { // Arrange const int eventId = 7; const int deploymentId = 23; var deployAgentProvider = MockRepository.GenerateStub <IDeployAgentProvider>(); var deploymentFolderSource = MockRepository.GenerateStub <IDeploymentFolderSource>(); var mapping = new Mapping(); var deploymentEventRecorder = MockRepository.GenerateStub <IDeploymentEventRecorder>(); deploymentEventRecorder.Stub(o => o.RecordQueued(eventId, mapping.Script, mapping.Queue)) .Return(deploymentId); var namedLockSet = new NamedLockSet(); var postDeployAction = MockRepository.GenerateStub <IPostDeployAction>(); var buildDetail = new BuildDetail(); var statusChanged = new BuildStatusChangeEvent { StatusChange = new Change() }; var mappingExecutor = new MappingExecutor(deploymentEventRecorder, deployAgentProvider, deploymentFolderSource, namedLockSet); // Act mappingExecutor.Execute(statusChanged, buildDetail, mapping, postDeployAction, deploymentId); // Assert deploymentEventRecorder.AssertWasCalled(o => o.RecordStarted(deploymentId)); }
private void ProcessMapping(BuildStatusChangeEvent statusChanged, BuildDetail buildDetail, Mapping mapping, IPostDeployAction postDeployAction) { lock (GetLockObject(mapping)) { var deployAgent = _deployAgentProvider.GetDeployAgent(mapping); // default to "happy; did nothing" if there's no deployment agent. var deployResult = new DeployAgentResult { HasErrors = false, Output = string.Empty }; if (deployAgent != null) { using (var workingDirectory = new WorkingDirectory()) { var deployAgentDataFactory = new DeployAgentDataFactory(); var deployData = deployAgentDataFactory.Create(workingDirectory.DirectoryInfo.FullName, mapping, buildDetail, statusChanged); _deploymentFolderSource.DownloadDeploymentFolder(deployData.TfsBuildDetail, workingDirectory.DirectoryInfo.FullName); deployResult = deployAgent.Deploy(deployData); } } postDeployAction.DeploymentFinished(mapping, deployResult); } }
public void LocalPowerShellDeployAgent_should_marshal_build_detail_across_AppDomains() { // Arrange var deploymentEventRecorder = MockRepository.GenerateStub <IDeploymentEventRecorder>(); DeployAgentResult result; using (var scriptFile = new TemporaryFile(".ps1", "$TfsDeployerBuildDetail | Format-List")) { var buildDetail = new BuildDetail(); var mapping = new Mapping { NewQuality = "Released", OriginalQuality = null, ScriptParameters = new ScriptParameter[0], Script = scriptFile.FileInfo.Name }; var buildStatusChangeEvent = new BuildStatusChangeEvent { StatusChange = new Change() }; var testDeployData = (new DeployAgentDataFactory()).Create(scriptFile.FileInfo.DirectoryName, mapping, buildDetail, buildStatusChangeEvent); var agent = new LocalPowerShellDeployAgent(deploymentEventRecorder); // Act result = agent.Deploy(testDeployData); } // Assert Assert.IsFalse(result.HasErrors, "Test script failed."); }
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (value == null) { return(null); } string imageName = string.Empty; if (value is SourceControlItem) { SourceControlItem srcItem = (SourceControlItem)value; imageName = srcItem.Item.ItemType.ToString().ToLower(); if (srcItem.Item.IsBranch) { imageName = "branch"; } if (srcItem.Item.DeletionId > 0) { imageName += "_deleted"; } } else if (value is BuildDetail) { BuildDetail build = (BuildDetail)value; imageName = build.Build.Status.ToString(); } return(new BitmapImage(new Uri("/TFSCleaner;component/Images/" + imageName + ".png", UriKind.RelativeOrAbsolute))); }
public void MappingProcessor_should_call_post_deploy_action_when_script_not_specified() { // Arrange var deployAgentProvider = new DeployAgentProvider(); var deploymentFolderSource = MockRepository.GenerateStub <IDeploymentFolderSource>(); var mappingEvaluator = MockRepository.GenerateStub <IMappingEvaluator>(); var mappingProcessor = new MappingProcessor(deployAgentProvider, deploymentFolderSource, mappingEvaluator); var postDeployAction = MockRepository.GenerateStub <IPostDeployAction>(); var buildDetail = new BuildDetail(); var mappings = new[] { new Mapping { RetainBuildSpecified = true, RetainBuild = true } }; mappingEvaluator.Stub(o => o.DoesMappingApply(null, null, null)) .IgnoreArguments() .Return(true); var statusChanged = new BuildStatusChangeEvent { StatusChange = new Change() }; // Act mappingProcessor.ProcessMappings(mappings, statusChanged, buildDetail, postDeployAction); // Assert postDeployAction.AssertWasCalled(o => o.DeploymentFinished( Arg <Mapping> .Is.Equal(mappings[0]), Arg <DeployAgentResult> .Matches(result => !result.HasErrors)) ); }
public IEnumerable <Mapping> ReadMappings(BuildDetail buildDetail) { TraceHelper.TraceInformation(TraceSwitches.TfsDeployer, "Reading Configuration for Team Project: {0} Team Build: {1}", buildDetail.TeamProject, buildDetail.BuildDefinition.Name); DeploymentMappings configuration = null; using (var stream = _deploymentFileSource.DownloadDeploymentFile(buildDetail)) { if (stream != null) { configuration = Read(stream); } } if (configuration == null) { TraceHelper.TraceWarning(TraceSwitches.TfsDeployer, "No configuration found for this team project."); return(Enumerable.Empty <Mapping>()); } if (configuration.Mappings == null || configuration.Mappings.Length == 0) { TraceHelper.TraceWarning(TraceSwitches.TfsDeployer, "Configuration did not contain any Mappings."); return(Enumerable.Empty <Mapping>()); } return(configuration.Mappings .Where(m => string.IsNullOrEmpty(m.BuildDefinitionPattern) || Regex.IsMatch(buildDetail.BuildDefinition.Name, m.BuildDefinitionPattern)) .ToArray()); }
public void Deployer_should_pass_build_status_to_mapping_processor() { // Arrange BuildDetail buildDetail = null; var statusChanged = new BuildStatusChangeEvent { StatusChange = new Change() }; var reader = MockRepository.GenerateStub <IConfigurationReader>(); var tfsBuildDetail = new StubBuildDetail { Status = Microsoft.TeamFoundation.Build.Client.BuildStatus.PartiallySucceeded }; var buildServer = MockRepository.GenerateStub <IBuildServer>(); buildServer.Stub(o => o.GetBuild(null, null, null, QueryOptions.None)) .IgnoreArguments() .Return(tfsBuildDetail); var mappingProcessor = MockRepository.GenerateStub <IMappingProcessor>(); mappingProcessor.Stub(o => o.ProcessMappings(null, null, null, null, 0)) .IgnoreArguments() .WhenCalled(m => buildDetail = (BuildDetail)m.Arguments[2]); Func <BuildDetail, IBuildDetail, IPostDeployAction> postDeployActionFactory = (a, b) => MockRepository.GenerateStub <IPostDeployAction>(); var deployer = new Deployer(reader, buildServer, mappingProcessor, postDeployActionFactory); // Act deployer.ExecuteDeploymentProcess(statusChanged, 0); // Assert Assert.AreEqual(global::TfsDeployer.TeamFoundation.BuildStatus.PartiallySucceeded, buildDetail.Status); }
public void DeployAgentDataFactory_should_expose_event_qualities() { const string oldQuality = "QA"; const string newQuality = "Production"; // Arrange var deployScriptRoot = Path.GetTempPath(); var mapping = new Mapping(); var buildDetail = new BuildDetail(); var changeEvent = new BuildStatusChangeEvent { StatusChange = new Change { OldValue = oldQuality, NewValue = newQuality } }; var factory = new DeployAgentDataFactory(); // Act var data = factory.Create(deployScriptRoot, mapping, buildDetail, changeEvent); // Assert Assert.AreEqual(oldQuality, data.OriginalQuality, "OriginalQuality"); Assert.AreEqual(newQuality, data.NewQuality, "NewQuality"); }
public BuildDetail CreateBuildDetail() { var buildDetail = new BuildDetail { BuildNumber = "test_build_number" }; return(buildDetail); }
public Stream DownloadDeploymentFile(BuildDetail buildDetail) { var stream = new MemoryStream(); var bytes = Encoding.UTF8.GetBytes(_configurationXml); stream.Write(bytes, 0, bytes.Length); stream.Seek(0, SeekOrigin.Begin); return(stream); }
private static string GetSubject(Mapping map, BuildDetail build, DeployAgentResult deployAgentResult) { var errorMessage = "Success: "; if (deployAgentResult.HasErrors) { errorMessage = "Failed: "; } return(string.Format("{0} TfsDeployer Ran Script {1} on Machine {2} for {3}/{4}/{5}", errorMessage, map.Script, map.Computer, build.TeamProject, build.BuildDefinition.Name, build.BuildNumber)); }
public void DownloadDeploymentFolder(BuildDetail buildDetail, string destination) { var serverPath = VersionControlPath.GetDeploymentFolderServerPath(buildDetail); TraceHelper.TraceInformation(TraceSwitches.TfsDeployer, "Getting files from {0} to {1}", serverPath, destination); var serverItemSpec = new ItemSpec(serverPath, RecursionType.Full); var request = new[] { new GetRequest(serverItemSpec, VersionSpec.Latest) }; GetLatestFromSourceCodeControl(serverPath, destination, request); }
protected static IEnumerable <Mapping> ReadMappings(string buildDefinitionName, string configurationXml) { var buildDetail = new BuildDetail { BuildDefinition = { Name = buildDefinitionName } }; var deploymentFileSource = new StubDeploymentFileSource(configurationXml); var configReader = new ConfigurationReader(deploymentFileSource, string.Empty); return(configReader.ReadMappings(buildDetail)); }
public Stream DownloadDeploymentFile(BuildDetail buildDetail) { var deploymentFile = GetDeploymentMappingsFileServerPath(buildDetail); var itemSpec = new ItemSpec(deploymentFile, RecursionType.None); var itemSet = _versionControlServer.GetItems(itemSpec, VersionSpec.Latest, DeletedState.NonDeleted, ItemType.File, GetItemsOptions.Download); if (itemSet.Items.Length == 0) { TraceHelper.TraceWarning(TraceSwitches.TfsDeployer, "Could not download file {0} from version control.", deploymentFile); return(null); } return(itemSet.Items[0].DownloadFile()); }
private static string GetBody(Mapping map, BuildDetail build, DeployAgentResult deployAgentResult) { var builder = new StringBuilder(); builder.AppendLine(string.Format("Team Project/Build: {0} to {1}", build.TeamProject, build.BuildDefinition.Name)); builder.AppendLine(string.Format("Quality Change: {0} to {1}", map.OriginalQuality, map.NewQuality)); builder.AppendLine(string.Format("Drop Location: {0}", build.DropLocation)); builder.AppendLine(string.Format("Build Uri: {0}", build.Uri)); builder.AppendLine(string.Format("Script: {0}", map.Script)); builder.AppendLine(string.Format("Executed on Machine: {0}", map.Computer)); builder.AppendLine("Output:"); builder.AppendLine(deployAgentResult.Output); return(builder.ToString()); }
public void VersionControlDeploymentFileSource_should_return_null_if_file_does_not_exist() { // Arrange var buildDetail = new BuildDetail { BuildDefinition = { Process = { ServerPath = "$/TfsDeployer/path_does_not_exist/build.xaml" } } }; var tfsCollection = new TfsTeamProjectCollection(new Uri("https://tfs.codeplex.com/tfs/tfs06")); var versionControlServer = tfsCollection.GetService <VersionControlServer>(); var source = new VersionControlDeploymentFileSource(versionControlServer); // Act var stream = source.DownloadDeploymentFile(buildDetail); // Assert Assert.IsNull(stream); }
public void EmailAlerter_should_return_silently_if_mapping_notification_address_is_blank() { // Arrange var mapping = new Mapping(); var build = new BuildDetail(); var deployAgentResult = new DeployAgentResult(); var emailAlerter = new EmailAlerter(); mapping.NotificationAddress = string.Empty; // Act emailAlerter.Alert(mapping, build, deployAgentResult); // Assert // no exception }
public IEnumerable <WorkItem> Execute(BuildDetail earliestBuild, BuildDetail latestBuild, Uri serverUri, string projectName) { if (earliestBuild == null || latestBuild == null) { return(new WorkItem[] {}); } using (var collection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(serverUri)) { var builds = earliestBuild.BranchRoot.Equals(latestBuild.BranchRoot, StringComparison.InvariantCultureIgnoreCase) ? GetBuildsFromOneBranch(earliestBuild, latestBuild, projectName, collection) : GetBuildsAcrossBranches(earliestBuild, latestBuild, projectName, collection); return(GetWorkItemsForBuilds(builds, collection, projectName)); } }
public DeployAgentData Create(string deployScriptRoot, Mapping mapping, BuildDetail buildDetail, BuildStatusChangeEvent buildStatusChangeEvent) { var data = new DeployAgentData { NewQuality = buildStatusChangeEvent.StatusChange.NewValue, OriginalQuality = buildStatusChangeEvent.StatusChange.OldValue, DeployServer = mapping.Computer, DeployScriptFile = mapping.Script, DeployScriptRoot = deployScriptRoot, DeployScriptParameters = CreateParameters(mapping.ScriptParameters), Timeout = mapping.TimeoutSeconds == 0 ? TimeSpan.MaxValue : TimeSpan.FromSeconds(mapping.TimeoutSeconds), TfsBuildDetail = buildDetail }; return(data); }
private void UpdateLight(BuildDetail buildDetail) { switch (buildDetail.Status) { case BuildStatus.Failed: buildStatusLight.SignalBuildFailed(); break; case BuildStatus.InProgress: buildStatusLight.SignalBuildInProgress(); break; case BuildStatus.NotStarted: buildStatusLight.DisableLight(); break; case BuildStatus.PartiallySucceeded: buildStatusLight.SignalBuildPartiallySucceeded(); break; case BuildStatus.Stopped: buildStatusLight.DisableLight(); break; case BuildStatus.Succeeded: buildStatusLight.SignalBuildSucceeded(); break; default: buildStatusLight.DisableLight(); break; } }
private BuildDetail GetLatestBuildStatus() { using (var tfs = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri(updaterConfiguration.TeamProjectCollectionUri))) { BuildDetail result = null; IBuildServer buildServer = tfs.GetService(typeof(IBuildServer)) as IBuildServer; if (buildServer == null) { throw new NullReferenceException("Reference to build server is null."); } IBuildDetailSpec buildDetailSpec = buildServer.CreateBuildDetailSpec(updaterConfiguration.TeamProject, updaterConfiguration.BuildDefinitionName); buildDetailSpec.MaxBuildsPerDefinition = 1; buildDetailSpec.QueryOrder = BuildQueryOrder.FinishTimeDescending; IBuildQueryResult buildQueryResult = buildServer.QueryBuilds(buildDetailSpec); if (buildQueryResult.Failures.Length == 0 && buildQueryResult.Builds.Length == 1) { IBuildDetail buildDetail = buildQueryResult.Builds[0]; result = new BuildDetail() { BuildNumber = buildDetail.BuildNumber, RequestedBy = buildDetail.RequestedBy, RequestedFor = buildDetail.RequestedFor, Status = buildDetail.Status }; } return result; } }