public void Run(TFSConfiguration tfsConfiguration = null) { Logger.Log.Info("Run TFS integration"); if (tfsConfiguration == null) { Logger.Log.Info($"Application runs from this location: {System.Reflection.Assembly.GetExecutingAssembly().Location}"); Logger.Log.Info("Read configuration"); tfsConfiguration = ReadTFSConfiguration(Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), CONFIG_FILE)); } Logger.Log.Info($"Authenticate to server {tfsConfiguration.TfsUrl}"); NetworkCredential credentials = CredentialUtil.GetCredential( tfsConfiguration.TfsUrl.AbsoluteUri.Substring(0, tfsConfiguration.TfsUrl.AbsoluteUri.Length - tfsConfiguration.TfsUrl.AbsolutePath.Length + 1)); TfsTeamProjectCollection tfs = new TfsTeamProjectCollection(tfsConfiguration.TfsUrl, credentials); tfs.Authenticate(); Logger.Log.Info("Get build server!"); IBuildServer buildServer = tfs.GetService <IBuildServer>(); Logger.Log.Info($"Build server version: {buildServer.BuildServerVersion}!"); Parallel.ForEach(tfsConfiguration.TFSSettings, (tfsIntegrationSettings) => { Logger.Log.Info($"Get all build definitions from team project {tfsIntegrationSettings.TeamProject}."); IBuildDefinition[] buildDefinitions = buildServer.QueryBuildDefinitions(tfsIntegrationSettings.TeamProject, QueryOptions.Definitions); if (buildDefinitions == null || !buildDefinitions.Any()) { Logger.Log.Info("No build definitions found! Exiting!"); return; } Logger.Log.Info($"Found {buildDefinitions.Length} build definitions."); IBuildDefinition buildDefinition = buildDefinitions.Where(build => build.Name == tfsIntegrationSettings.BuildDefinitionName) .Select(b => b) .FirstOrDefault(); Logger.Log.Info($"Get build details from {buildDefinition.Name}."); IBuildDetail buildDetail = GetLatestBuildDetails(buildServer, buildDefinition, tfsIntegrationSettings.TeamProject); if (buildDetail != null) { DownloadVantageInstaller( Path.Combine(buildDetail.DropLocation, tfsIntegrationSettings.SourcePathFragment, tfsIntegrationSettings.SourceFile), Path.Combine(tfsIntegrationSettings.CopyTo, tfsIntegrationSettings.BuildDefinitionName, buildDetail.BuildNumber, tfsIntegrationSettings.SourceFile)); } Logger.Log.Info("Cleanup old builds"); CleanUp(Path.Combine(tfsIntegrationSettings.CopyTo, tfsIntegrationSettings.BuildDefinitionName), tfsIntegrationSettings.MaxBuildsToKeep); Logger.Log.Info("FINISHED"); }); }
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); } } }
public BuildViewModel(IBuildDetail build) { this.FullBuildDetail = build; this.FullBuildDefinition = build.BuildDefinition; this.Name = build.BuildNumber; this.BuildDefinition = build.BuildDefinition.Name; this.BuildDefinitionUri = build.BuildDefinitionUri; this.TeamProject = build.TeamProject; this.BuildStatus = build.Status.ToString(); this.BuildController = build.BuildController != null ? build.BuildController.Name : "n/a"; this.RequestedBy = build.RequestedFor; this.QueuedTime = build.Requests.Count > 0 ? build.Requests[0].QueueTime.ToString("g") : build.StartTime.ToString("g"); this.StartTime = build.StartTime.ToString("g"); this.SortableStartTime = build.StartTime.ToString("s"); this.SortableQueuedTime = build.Requests.Count > 0 ? build.Requests[0].QueueTime.ToString("s") : build.StartTime.ToString("s"); this.DropLocation = build.DropLocation; if (build.BuildFinished) { this.FinishTime = build.FinishTime.ToString("g"); this.SortableFinishTime = build.FinishTime.ToString("s"); this.Duration = string.Format("{0:dd\\:hh\\:mm\\:ss}", build.FinishTime - build.StartTime); } this.Uri = build.Uri; this.SortableUri = build.Uri.ToString(); this.keep = build.KeepForever; this.Quality = build.Quality; this.BuildAgent = GetBuildAgentName(build); }
public string GetBuildLogLocation(IBuildDetail build) { var linkService = (TswaClientHyperlinkService)this.collection.GetService(typeof(TswaClientHyperlinkService)); var url = linkService.GetViewBuildDetailsUrl(build.Uri); return(url.ToString()); }
private static string GetDropDownloadPath(TfsTeamProjectCollection collection, IBuildDetail buildDetail) { string droplocation = buildDetail.DropLocation; if (string.IsNullOrEmpty(droplocation)) { throw new FailingBuildException(string.Format(CultureInfo.CurrentCulture, "No drop is available for {0}.", buildDetail.BuildNumber)); } ILocationService locationService = collection.GetService<ILocationService>(); string containersBaseAddress = locationService.LocationForAccessMapping(ServiceInterfaces.FileContainersResource, FrameworkServiceIdentifiers.FileContainers, locationService.DefaultAccessMapping); droplocation = BuildContainerPath.Combine(droplocation, string.Format(CultureInfo.InvariantCulture, "{0}.zip", buildDetail.BuildNumber)); try { long containerId; string itemPath; BuildContainerPath.GetContainerIdAndPath(droplocation, out containerId, out itemPath); string downloadPath = string.Format(CultureInfo.InvariantCulture, "{0}/{1}/{2}", containersBaseAddress, containerId, itemPath.TrimStart('/')); return downloadPath; } catch (InvalidPathException) { throw new FailingBuildException(string.Format(CultureInfo.CurrentCulture, "No drop is available for {0}.", buildDetail.BuildNumber)); } }
public CheckinInfo GetCheckinInfo(IBuildDetail buildDetail, BuildStatus buildStatus, MyTfsBuildDefinition buildDefinition) { // Start with some semi-reasonable defaults for comment and author, but we'll try a variety of things to make them better var result = new CheckinInfo(buildDetail); var changesets = buildDetail.Information.GetNodesByType(MyBuildServer.ASSOCIATED_CHANGESET); var commits = buildDetail.Information.GetNodesByType(MyBuildServer.ASSOCIATED_COMMIT); var anyGitChangesets = changesets.Any(); var anyTfsCommits = commits.Any(); if (anyGitChangesets) { // This path does not not require a network call. It is used when the build is not in progress and the project uses git source control result = SetInfoFromAssociatedChangesets(changesets); } else if (anyTfsCommits) { // This path does not not require a network call. It is used when the build is not in progress and the project uses tfs (non-git) source control result = SetInfoFromAssociatedCommits(commits); } else { // this path may require a network call, however we cache requests. It is used the first time an in-progress build is found var latestChangeset = QueryServerForLatestChangesetButCache(buildDefinition, buildStatus); if (latestChangeset != null) { result.Committer = latestChangeset.Committer; result.Comment = latestChangeset.Comment; } } return(result); }
private void cmbBuilds_SelectedIndexChanged(object sender, EventArgs e) { if (this.cmbBuilds.SelectedIndex == -1) { return; } IBuildDetail buildInfo = GetBuildDetail(this.cmbBuilds.SelectedItem as string); this.lbBuild.Text = buildInfo == null ? string.Empty : string.Format(BUILD_DETAIL_MASK, buildInfo.BuildServer.TeamFoundationServer, this.teamProject, string.Empty, //buildInfo.BuildAgent.Name, string.Empty, //buildInfo.BuildAgentUri, buildInfo.BuildDefinition, buildInfo.BuildDefinitionUri, buildInfo.BuildServer, buildInfo.DropLocation, buildInfo.FinishTime, buildInfo.LabelName, buildInfo.Quality, buildInfo.Status, buildInfo.RequestedBy, buildInfo.BuildNumber ); }
public CheckinInfo GetCheckinInfo(IBuildDetail buildDetail, BuildStatus buildStatus, MyTfsBuildDefinition buildDefinition) { // Start with some semi-reasonable defaults for comment and author, but we'll try a variety of things to make them better var result = new CheckinInfo(buildDetail); var changesets = buildDetail.Information.GetNodesByType(MyBuildServer.ASSOCIATED_CHANGESET); var commits = buildDetail.Information.GetNodesByType(MyBuildServer.ASSOCIATED_COMMIT); var anyGitChangesets = changesets.Any(); var anyTfsCommits = commits.Any(); if (anyGitChangesets) { // This path does not not require a network call. It is used when the build is not in progress and the project uses git source control result = SetInfoFromAssociatedChangesets(changesets); } else if (anyTfsCommits) { // This path does not not require a network call. It is used when the build is not in progress and the project uses tfs (non-git) source control result = SetInfoFromAssociatedCommits(commits); } else { // this path may require a network call, however we cache requests. It is used the first time an in-progress build is found var latestChangeset = QueryServerForLatestChangesetButCache(buildDefinition, buildStatus); if (latestChangeset != null) { result.Committer = latestChangeset.Committer; result.Comment = latestChangeset.Comment; } } return result; }
private EColor DetectCurrentBuildColor(CodeActivityContext context) { IBuildDetail buildDetail = context.GetExtension <IBuildDetail>(); EColor successColor = GetColor(context.GetValue(SuccessColor), EColor.Green); EColor compilationFailedColor = GetColor(context.GetValue(CompilationFailedColor), EColor.Red); EColor testsFailedColor = GetColor(context.GetValue(TestsFailedColor), EColor.Yellow); EColor buildRunningColor = GetColor(context.GetValue(BuildRunningColor), EColor.Blue); switch (buildDetail.CompilationStatus) { case BuildPhaseStatus.Failed: return(compilationFailedColor); case BuildPhaseStatus.Succeeded: switch (buildDetail.TestStatus) { case BuildPhaseStatus.Failed: return(testsFailedColor); case BuildPhaseStatus.Succeeded: return(successColor); case BuildPhaseStatus.Unknown: //tests are running return(buildRunningColor); } break; case BuildPhaseStatus.Unknown: return(buildRunningColor); } return(EColor.None); }
public static void FeedBuildDefinition(ICollection <BuildDefinition> collection, IBuildServer bs, string projectName) { IBuildDefinition[] buildDefinitions = bs.QueryBuildDefinitions(projectName); foreach (IBuildDefinition buildDefinition in buildDefinitions) { IBuildDetailSpec buildDetailSpec = bs.CreateBuildDetailSpec(buildDefinition); buildDetailSpec.QueryDeletedOption = QueryDeletedOption.ExcludeDeleted; buildDetailSpec.MaxBuildsPerDefinition = 1; buildDetailSpec.Reason = BuildReason.All;; buildDetailSpec.Status = BuildStatus.Failed; buildDetailSpec.QueryOrder = BuildQueryOrder.FinishTimeDescending; buildDetailSpec.MinFinishTime = DateTime.Now.AddMonths(-1); IBuildQueryResult overallBuildDetailsQueryResults = bs.QueryBuilds(buildDetailSpec); IBuildDetail[] buildDetails = bs.QueryBuilds(buildDefinition); int failedOrPartialCount = buildDetails.Count(x => x.Status == BuildStatus.Failed || x.Status == BuildStatus.PartiallySucceeded); IBuildDetail lastFailedBuild = buildDetails.Where(x => x.Status == BuildStatus.Failed).OrderBy(x => x.FinishTime).LastOrDefault(); IBuildDetail lastSucceededBuild = buildDetails.Where(x => x.Status == BuildStatus.Succeeded).OrderBy(x => x.FinishTime).LastOrDefault(); int buildCount = buildDetails.Count(); BuildDefinition buildDef = new BuildDefinition() { Name = buildDefinition.Name, Enabled = buildDefinition.Enabled, ContinuousIntegrationType = buildDefinition.ContinuousIntegrationType.ToString(), FailedOrPartialRatio = buildCount != 0 ? failedOrPartialCount / buildCount : 0, RetainedBuild = buildCount, LastSuccess = lastSucceededBuild != null ? lastSucceededBuild.FinishTime : DateTime.MinValue, LastFail = lastFailedBuild != null ? lastFailedBuild.FinishTime : DateTime.MinValue }; collection.Add(buildDef); } }
private static void FeedBuildData(ICollection <BuildDefinition> buildDefinitionCollection, TfsTeamProjectCollection tpc, string projectName) { IBuildServer bs = tpc.GetService <IBuildServer>(); IBuildDefinition[] buildDefinitions = bs.QueryBuildDefinitions(projectName, QueryOptions.All); foreach (IBuildDefinition buildDefinition in buildDefinitions) { IBuildDetail[] buildDetails = bs.QueryBuilds(buildDefinition); int failedOrPartialCount = buildDetails.Count(x => x.Status == BuildStatus.Failed || x.Status == BuildStatus.PartiallySucceeded); IBuildDetail lastFailedBuild = buildDetails.Where(x => x.Status == BuildStatus.Failed).OrderBy(x => x.FinishTime).LastOrDefault(); IBuildDetail lastSucceededBuild = buildDetails.Where(x => x.Status == BuildStatus.Succeeded).OrderBy(x => x.FinishTime).LastOrDefault(); int buildCount = buildDetails.Count(); BuildDefinition buildDef = new BuildDefinition() { Name = buildDefinition.Name, Enabled = buildDefinition.Enabled, ContinuousIntegrationType = buildDefinition.ContinuousIntegrationType.ToString(), FailedOrPartialRatio = failedOrPartialCount, RetainedBuild = buildCount, LastSuccess = lastSucceededBuild != null ? lastSucceededBuild.FinishTime : DateTime.MinValue, LastFail = lastFailedBuild != null ? lastFailedBuild.FinishTime : DateTime.MinValue }; buildDefinitionCollection.Add(buildDef); } }
private IList <TestDetailDto> GetTestDetails( CatalogNode teamProjectNode, ITestManagementService testService, IBuildDetail build) { var tests = new List <TestDetailDto>(); try { var testProject = testService.GetTeamProject(teamProjectNode.Resource.DisplayName); var testRuns = testProject.TestRuns.ByBuild(build.Uri); foreach (var testRun in testRuns) { foreach (var erroringTest in testRun.QueryResults()) { tests.Add(new TestDetailDto(erroringTest.TestCaseTitle, erroringTest.DateStarted, erroringTest.DateCompleted)); } } } catch (Exception e) { LogService.WriteError(e); throw; } return(tests); }
public BuildViewModel(IBuildDetail build) { this.FullBuildDetail = build; this.FullBuildDefinition = build.BuildDefinition; this.Name = build.BuildNumber; this.BuildDefinition = build.BuildDefinition.Name; this.BuildDefinitionUri = build.BuildDefinitionUri; this.TeamProject = build.TeamProject; this.BuildStatus = build.Status.ToString(); this.BuildController = build.BuildController != null ? build.BuildController.Name : "n/a"; this.RequestedBy = build.RequestedFor; this.QueuedTime = build.Requests.Count > 0 ? build.Requests[0].QueueTime.ToString("g") : build.StartTime.ToString("g"); this.StartTime = build.StartTime.ToString("g"); this.SortableStartTime = build.StartTime.ToString("s"); this.SortableQueuedTime = build.Requests.Count > 0 ? build.Requests[0].QueueTime.ToString("s") : build.StartTime.ToString("s"); this.DropLocation = build.DropLocation; if (build.BuildFinished) { this.FinishTime = build.FinishTime.ToString("g"); this.SortableFinishTime = build.FinishTime.ToString("s"); this.Duration = string.Format("{0:dd\\:hh\\:mm\\:ss}", build.FinishTime - build.StartTime); } this.Uri = build.Uri; this.SortableUri = build.Uri.ToString(); this.keep = build.KeepForever; this.Quality = build.Quality; this.BuildAgent = GetBuildAgentName(build); }
public static void DialogShow(IBuildDetail buildDetail) { var form = new FormBuildDetail(); form.detailPanel.Initialize(buildDetail); form.ShowDialog(); }
private BuildStoreEventArgs GetBuildStoreEventIfAny(IBuildDetail build) { BuildStoreEventArgs buildStoreEvent; if (!cacheLookup.ContainsKey(build.Uri.AbsoluteUri)) { cacheLookup.Add(build.Uri.AbsoluteUri, build); buildStoreEvent = new BuildStoreEventArgs { Type = BuildStoreEventType.Build, Data = build }; return buildStoreEvent; } IBuildDetail originalBuild = cacheLookup[build.Uri.AbsoluteUri]; cacheLookup[build.Uri.AbsoluteUri] = build; if (originalBuild.Quality != build.Quality || originalBuild.Status != build.Status) { buildStoreEvent = new BuildStoreEventArgs { Data = build, Type = originalBuild.Quality != build.Quality ? BuildStoreEventType.QualityChanged : BuildStoreEventType.Build }; return buildStoreEvent; } return null; }
private static IBuildDetail Arrange(MockRepository mockRepository, IEnumerable <string> existingBuildNumbers) { IBuildDetail mockBuildDetailForCurrentBuild = mockRepository.DynamicMock <IBuildDetail>(); IBuildServer mockBuildServer = mockRepository.DynamicMock <IBuildServer>(); IBuildDetailSpec mockBuildDetailSpec = mockRepository.DynamicMock <IBuildDetailSpec>(); IBuildQueryResult mockBuildQueryResult = mockRepository.DynamicMock <IBuildQueryResult>(); ArrayList previousBuildsList = new ArrayList(); foreach (string existingBuildNumber in existingBuildNumbers) { IBuildDetail mockBuildDetailForPreviousBuild = mockRepository.DynamicMock <IBuildDetail>(); previousBuildsList.Add(mockBuildDetailForPreviousBuild); Expect.Call(mockBuildDetailForPreviousBuild.BuildNumber).Return(existingBuildNumber); } IBuildDetail[] previousBuilds = (IBuildDetail[])previousBuildsList.ToArray(typeof(IBuildDetail)); mockRepository.Record(); Expect.Call(mockBuildDetailForCurrentBuild.BuildServer).Return(mockBuildServer); Expect.Call(mockBuildDetailForCurrentBuild.TeamProject).Return("TeamProjectName"); Expect.Call(mockBuildServer.CreateBuildDetailSpec("TeamProjectName")).Return(mockBuildDetailSpec); Expect.Call(mockBuildServer.QueryBuilds(mockBuildDetailSpec)).Return(mockBuildQueryResult); Expect.Call(mockBuildQueryResult.Builds).Return(previousBuilds); return(mockBuildDetailForCurrentBuild); }
private int GetBuildStatusImage(QueueStatus status, IBuildDetail detail) { int image = 5; switch (status) { case QueueStatus.InProgress: image = 0; break; case QueueStatus.Completed: image = GetBuildStatusImage(detail.Status); break; // case QueueStatus.PartiallySucceeded: // image = 2; // break; // case QueueStatus.Failed: // image = 3; // break; case QueueStatus.Canceled: image = 4; break; case QueueStatus.Postponed: case QueueStatus.Queued: image = 5; break; } return(image); }
private void mniBuildDetail_Click(object sender, EventArgs e) { var itemBuild = GetTreeView().SelectedItems[0].Tag as BuildInfo; IBuildDetail buildDetail = IsQueuedSelected ? itemBuild.queuedBuild.Build : itemBuild.buildDetail; FormBuildDetail.DialogShow(buildDetail); }
public override void ReportInProgress(IBuildDetail build) { ReportStatus( build, "Build In Progress", ToolTipIcon.Info ); }
/// <summary> /// This method should make all necessary server calls to aquire the data /// needed to display the sections and nodes for this factory. /// This method is called on a background thread (no UI work can be done). /// </summary> /// <param name="build">a reference to the IBuildDetail being displayed</param> public void LoadData(IBuildDetail build) { _dropLocation = build.DropLocation; var htmlDocName = string.Format(@"{0}\DotCoverReport\coverage.html", _dropLocation); _codeCoveragePath = build.BuildFinished ? htmlDocName : string.Empty; }
public BuildDetail(IBuildDefinition buildDef, IBuildDetail buildDetail) { Id = buildDef.Id; ContinuousIntegrationType = buildDef.ContinuousIntegrationType; BuildDefinitionName = buildDef.Name; Build = buildDetail; }
private void AddBuildsErrors(IBuildDetail tfsBuild, Build build) { var associatedBuildErrors = InformationNodeConverters.GetBuildErrors(tfsBuild); build.Error = new Error { Total = associatedBuildErrors.Count() }; }
protected virtual bool ShouldDisplayNotification(IBuildDetail build) { return ( LastBuild == null || build.BuildNumber != LastBuild.BuildNumber) || (build.Status != BuildStatus.InProgress && LastBuild.Status == BuildStatus.InProgress ); }
public override void ReportFailure(IBuildDetail build) { ReportStatus( build, "Build Failed", ToolTipIcon.Error ); }
public override void ReportSuccess(IBuildDetail build) { ReportStatus( build, "Build Succeeded", ToolTipIcon.Info ); }
public BuildDetail(IBuildDefinition buildDef, IBuildDetail buildDetail) { Id = buildDef.Id; ContinuousIntegrationType = buildDef.ContinuousIntegrationType; BuildDefinitionName = buildDef.Name; Build = buildDetail; }
public BuildDetailToBuildDataAdapter(IBuildDetail buildDetail) { if (null == buildDetail) { throw new ArgumentNullException("buildDetail"); } _detail = buildDetail; }
private SuccessBuildResult GetSuccessResult(IBuildDetail buildDetail, string project, string build, string friendlyName) { var model = new SuccessBuildResult(project, build, friendlyName); model.PersonName = buildDetail.RequestedFor; model.Completed = buildDetail.FinishTime; return(model); }
private void EnsureConnected() { if (teamProjectCollection == null) { teamProjectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri(tfsUri)); build = teamProjectCollection.GetService <IBuildServer>().GetBuild(new Uri(buildUri)); } }
private FailedBuildResult GetFailedResult(IBuildDetail buildDetail, string project, string build, string friendlyName) { var model = new FailedBuildResult(project, build, friendlyName); model.PersonName = buildDetail.RequestedFor; model.Failed = buildDetail.StartTime; return(model); }
private void mniGotoDefinition_Click(object sender, EventArgs e) { var itemBuild = GetTreeView().SelectedItems[0].Tag as BuildInfo; IBuildDetail buildDetail = IsQueuedSelected ? itemBuild.queuedBuild.Build : itemBuild.buildDetail; IBuildDefinition definition = Context.BuildServer.GetBuildDefinition(buildDetail.BuildDefinition.Uri); //this.parentControl.FocusAndSelectBuildTemplate(definition); UIContext.Instance.ControlTeamBuilds.FocusAndSelectBuildTemplate(definition); }
public Program(IBuildDetail[] builds, IEnumerable<string> options, IEnumerable<string> exclusions, WorkItemStore workItemStore, Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer versionControlServer, TestManagementService tms) { this.Builds = builds; this.NoteOptions = options; this.Exclusions = exclusions; this.WorkItemStore = workItemStore; this.VersionControlServer = versionControlServer; this.TestManagementService = tms; }
public BuildInformation(IBuildDetail buildDetail) { if (null == buildDetail) { throw new ArgumentNullException("buildDetail"); } _detail = buildDetail; _data = new BuildDetailToBuildDataAdapter(buildDetail); }
/// <summary> /// Execute the Update Version Number build step. /// </summary> protected override void InternalExecute() { //-- Get the input parameters string lockingUNCShare = this.ActivityContext.GetValue(this.LockingUNCShare); string[] environmentNames = this.ActivityContext.GetValue(this.EnvironmentList); int maximumWaitTime = this.ActivityContext.GetValue(this.MaximumWaitTimeSeconds); //-- Calculate the end time... DateTime endTime = DateTime.Now.AddSeconds(maximumWaitTime); //-- Get the details about the Project Collection, Build, and LabService... TfsTeamProjectCollection tpc = this.ActivityContext.GetExtension <TfsTeamProjectCollection>(); LabService labService = tpc.GetService <LabService>(); IBuildDetail buildDetail = this.ActivityContext.GetExtension <IBuildDetail>(); //-- Get a list of environments that could be used... ICollection <LabEnvironment> lstEnvironments = labService.QueryLabEnvironments(new LabEnvironmentQuerySpec { Project = buildDetail.TeamProject }); //-- Loop until we have reached the maximum wait time... while (maximumWaitTime == 0 || (DateTime.Now < endTime)) { //-- First, lets loop through the environments to see if any have become available... foreach (string name in environmentNames) { //-- Is the environment locked? if (!File.Exists(Path.Combine(lockingUNCShare, name))) { //-- Locate the environment in the list of potential environments... foreach (LabEnvironment environment in lstEnvironments) { if (environment.Name.Equals(name, StringComparison.OrdinalIgnoreCase)) { //-- Get the environment In-Use information... LabEnvironmentInUseMarker marker = environment.GetInUseMarker(); if (marker == null) { //-- The Environment is not in use... this.ActivityContext.SetValue(this.EnvironmentIsAvailable, true); return; } break; } } } } //-- Wait for 5 seconds and try again... Thread.Sleep(5000); } //-- If we reached here, none of the available environments became available... this.ActivityContext.SetValue(this.EnvironmentIsAvailable, false); }
// If your activity returns a value, derive from CodeActivity<TResult> // and return the value from the Execute method. protected override void Execute(CodeActivityContext context) { // Obtain the runtime value of the Text input argument // Contains the build number IBuildDetail buildDetail = context.GetValue(this.BuildDetail); // The TFS directoty string sourcesDirectory = context.GetValue(this.SourcesDirectory); // web config app setting string TFSBuildNumberSetting = context.GetValue(this.TFSBuildNumberAppSettingName); // output String string output = String.Empty; // Get all AssemblyInfo files foreach (string file in Directory.EnumerateFiles(sourcesDirectory,"web.config", SearchOption.AllDirectories)) { // IS tag founds bool settingFound = false; FileAttributes attributes = File.GetAttributes(file); // Remove readonly attribute if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) { //Remove readonly File.SetAttributes(file,attributes^FileAttributes.ReadOnly); } XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(file); // iterate through all the app settings to find the TFS BUILD foreach (XmlNode node in xmlDoc.SelectNodes("/configuration/appSettings/add")) { // MATCH if (node.Attributes.GetNamedItem("key") != null && node.Attributes.GetNamedItem("value") != null && node.Attributes.GetNamedItem("key").Value.Equals("TFSBuildNumber")) { node.Attributes.GetNamedItem("value").Value = buildDetail.BuildNumber; settingFound = true; output += "MODIFIED with BuildNumber " + buildDetail.BuildNumber.ToString() + " :" + file + "\n"; break; } } // if the app setting is not found then add it if (!settingFound) { XmlNode node = xmlDoc.SelectSingleNode("/configuration/appSettings"); if (null != node) { XmlElement elem = xmlDoc.CreateElement("add"); XmlAttribute attrKey = xmlDoc.CreateAttribute("key"); attrKey.Value = "TFSBuildNumber"; XmlAttribute attrVal = xmlDoc.CreateAttribute("value"); attrVal.Value = buildDetail.BuildNumber; elem.Attributes.Append(attrKey); elem.Attributes.Append(attrVal); node.AppendChild(elem); output += "ADDED with BuildNumber " + buildDetail.BuildNumber.ToString() + " :" + file + "\n"; } } // Save file xmlDoc.Save(file); //add readonly attribute back to web.config file File.SetAttributes(file,attributes | FileAttributes.ReadOnly); } // Set the values context.SetValue<string>(this.TextOut,output); }
/// <summary> /// Executes the logic for this workflow activity /// </summary> protected override void InternalExecute() { this.BuildDetail = this.ActivityContext.GetExtension <IBuildDetail>(); string generatedFile = "Metrics.xml"; if (this.GeneratedFileName != null && !string.IsNullOrEmpty(this.GeneratedFileName.Get(this.ActivityContext))) { generatedFile = Path.Combine(this.BuildDetail.DropLocation, this.GeneratedFileName.Get(this.ActivityContext)); } if (!this.RunCodeMetrics(generatedFile)) { return; } IActivityTracking currentTracking = this.ActivityContext.GetExtension <IBuildLoggingExtension>().GetActivityTracking(this.ActivityContext); IBuildInformationNode rootNode = AddTextNode("Processing metrics", currentTracking.Node); string fileName = Path.GetFileName(generatedFile); string pathToFileInDropFolder = Path.Combine(this.BuildDetail.DropLocation, fileName); AddLinkNode(fileName, new Uri(pathToFileInDropFolder), rootNode); CodeMetricsReport result = CodeMetricsReport.LoadFromFile(generatedFile); if (result == null) { LogBuildMessage("Could not load metric result file "); return; } foreach (var target in result.Targets) { var targetNode = AddTextNode("Target: " + target.Name, rootNode); foreach (var module in target.Modules) { var moduleNode = AddTextNode("Module: " + module.Name, targetNode); this.ProcessMetrics(module.Name, module.Metrics, moduleNode); foreach (var ns in module.Namespaces) { var namespaceNode = AddTextNode("Namespace: " + ns.Name, moduleNode); this.ProcessMetrics(ns.Name, ns.Metrics, namespaceNode); foreach (var type in ns.Types) { var typeNode = AddTextNode("Type: " + type.Name, namespaceNode); this.ProcessMetrics(type.Name, type.Metrics, typeNode); foreach (var member in type.Members) { var memberNode = AddTextNode("Member: " + member.Name, typeNode); this.ProcessMetrics(member.Name, member.Metrics, memberNode); } } } } } }
/// <summary> /// Get test result for particular build detail and team project /// </summary> /// <param name="bd"></param> /// <param name="teamProjectName"></param> /// <returns></returns> public IEnumerable <ITestRun> GetTestRuns(IBuildDetail bd, string teamProjectName) { if (_testTeamProject == null) { _testTeamProject = this._testManagementService.GetTeamProject(teamProjectName); } var testRuns = _testTeamProject.TestRuns.ByBuild(bd.Uri); return(testRuns); }
public BuildStatus GetLatestBuildStatusForProject(IBuildDetail bd) { BuildStatus status = BuildStatus.None; if (bd != null) { status = bd.Status; } return(status); }
public BuildInfo(IBuildDetail buildDetails) { DropLocation = buildDetails.DropLocation; FinishTime = buildDetails.FinishTime; Number = buildDetails.BuildNumber; RequestedFor = buildDetails.RequestedFor; StartTime = buildDetails.StartTime; SourceVersion = buildDetails.SourceGetVersion; Status = buildDetails.Status.ToString(); Definition = buildDetails.BuildDefinition.Name; }
public string TransformSonarProperties(string templatePath, string solutionPath) { StringList properties = this.SonarProperties.Get(this.ActivityContext); IBuildDetail build = this.ActivityContext.GetExtension <IBuildDetail>(); string buildDefinition = build.BuildDefinition.Name; string buildNumber = build.BuildNumber; string content = File.ReadAllText(templatePath); if (properties != null) { Regex nameRegex = new Regex("^\\s*(?<name>[^#=\\s]+)\\s*=*."); foreach (string propertyLine in properties) { MatchCollection matches = nameRegex.Matches(propertyLine); if (matches.Count > 0) { string propertyName = matches[0].Groups["name"].Value; Regex lineRegex = new Regex("[\\x020\\t]*" + propertyName.Replace(".", "\\.") + "[\\x020\\t]*=.*\\r?\\n"); if (lineRegex.IsMatch(content)) { content = lineRegex.Replace(content, propertyLine + "\r\n"); } else { content += "\r\n" + propertyLine; } } } } string binariesDirectory = Path.GetFullPath(this.BinariesDirectory.Get(this.ActivityContext)); // remove trailing \ if found if (binariesDirectory.EndsWith("\\", StringComparison.OrdinalIgnoreCase)) { binariesDirectory = binariesDirectory.Remove(binariesDirectory.Length - 1); } StringBuilder sb = new StringBuilder(content); sb.Replace("%BUILD_DEFINITION%", buildDefinition); sb.Replace("%BUILD_DEFINITION_UNDERSCORE%", buildDefinition.Replace(' ', '_')); sb.Replace("%BUILD_NUMBER%", buildNumber); sb.Replace("%BUILD_NUMBER_UNDERSCORE%", buildNumber.Replace(' ', '_')); sb.Replace("%BUILD_NUMBER_DEFAULT_SUFFIX%", buildNumber.Replace(buildDefinition + "_", string.Empty)); sb.Replace("%SOLUTION_FILE%", Path.GetFileName(solutionPath)); sb.Replace("%SOLUTION_FILE_PATH%", solutionPath); sb.Replace("%SOLUTION_DIRECTORY_PATH%", Path.GetDirectoryName(solutionPath)); sb.Replace("%BINARIES_DIRECTORY_PATH%", binariesDirectory); sb.Replace("%BINARIES_DIRECTORY_PATH_SLASH%", binariesDirectory.Replace('\\', '/')); return(sb.ToString()); }
public override void ReportInProgress(IBuildDetail build) { var sequence = new PulseSequence { Color = BusylightColor.Blue, Step1 = 0, Step2 = 255, Step3 = 0, Step4 = 255 }; _busylight.Pulse(sequence); }
private void ShowBuilds() { while (true) { try { ClearItems(); ImageIndex overallImageIndex = ImageIndex.Green; string culprit = ""; foreach (ServerBuild serverBuild in _serverBuilds) { IBuildServer buildServer = GetBuildServer(serverBuild.ServerUri.ToString()); IBuildDefinition buildDefinition = buildServer.QueryBuildDefinitionsByUri(new[] { serverBuild.BuildUri })[0]; string[] buildInformation = new string[2]; buildInformation[0] = buildDefinition.Name; IBuildDetail lastBuildDetails = buildServer.QueryBuildsByUri(new[] { buildDefinition.LastBuildUri }, null, QueryOptions.None)[0]; if (lastBuildDetails != null) { buildInformation[1] = lastBuildDetails.Status.ToString(); } ImageIndex imageIndex = lastBuildDetails == null ? ImageIndex.Red : GetImageIndex(lastBuildDetails.Status); ListViewItem listViewItem = new ListViewItem(buildInformation, (int)imageIndex) { Tag = serverBuild }; AddItem(listViewItem); if (imageIndex == ImageIndex.Red) { overallImageIndex = ImageIndex.Red; culprit = lastBuildDetails == null ? "Unable to find build" : lastBuildDetails.RequestedFor; } else if (imageIndex == ImageIndex.Yellow && overallImageIndex == ImageIndex.Green) { overallImageIndex = ImageIndex.Yellow; } } SetSystemTrayIcon(overallImageIndex); // SetX10IntegrationStatus(overallImageIndex); if (overallImageIndex != _lastBuildStatus) { SetRadiatorBuildStatusColor(overallImageIndex); AnnounceCulprit(culprit); _lastBuildStatus = overallImageIndex; } } catch (Exception exception) { Console.WriteLine(exception); } Thread.Sleep(5000); } }
public BuildData Generate(IBuildDetail buildDetail) { return new BuildData { BuildName = buildDetail.BuildDefinition.Name, BuildRequestedFor = buildDetail.RequestedFor, EventType = BuildStoreEventType.Build, Status = GetStatus(buildDetail.Status), Quality = buildDetail.Quality }; }
public int GetHighestExistingBuildNumber(string expandedPrefix, IBuildDetail buildDetail, int numberDigits, int max) { IBuildDetailSpec spec = buildDetail.BuildServer.CreateBuildDetailSpec(new[] {buildDetail.BuildDefinitionUri}); spec.QueryOptions = QueryOptions.None; spec.InformationTypes = null; spec.QueryOrder = BuildQueryOrder.FinishTimeDescending; spec.QueryDeletedOption = QueryDeletedOption.IncludeDeleted; spec.MaxBuildsPerDefinition = 100; spec.BuildNumber = expandedPrefix + ".*"; max = HighestExistingBuildNumber(expandedPrefix, buildDetail, spec, max); return max; }
private double GetCodeCoverage(IBuildDetail build, string projectName) { var testManagementProject = GetTestManagementProject(GetTeamServer(), projectName); var codeCoverage = testManagementProject.CoverageAnalysisManager.QueryBuildCoverage(build.Uri.AbsoluteUri, CoverageQueryFlags.Modules); Double blocksCovered = codeCoverage[0].Modules.Sum(b => b.Statistics.BlocksCovered); Double blocksNotCovered = codeCoverage[0].Modules.Sum(c => c.Statistics.BlocksNotCovered); Double totalBlocks = blocksCovered + blocksNotCovered; var percentage = ((blocksCovered / totalBlocks) * 100); return percentage; }
private String invokeWorkflow(IBuildDetail BuildDetail, String SonarRunnerPath = null, String LocalSolutionPath = null, bool GeneratePropertiesIfMissing = false, String TemplatePropertiesPath = null, bool FailBuildOnError = true, bool FailBuildOnAlert = false, String RunnerCmdFile = "fake-runner.cmd", StringList SonarProperties = null, String BinariesDirectory = "BinDir") { // Default values that work if (SonarRunnerPath == null) SonarRunnerPath = Path.Combine(TestContext.DeploymentDirectory, RunnerCmdFile); if (LocalSolutionPath == null) LocalSolutionPath = Path.Combine(TestContext.DeploymentDirectory, "Dummy.sln"); if (TemplatePropertiesPath == null) TemplatePropertiesPath = Path.Combine(TestContext.DeploymentDirectory, "sonar-properties.template"); ShimWorkspace workpace = new ShimWorkspace() { GetLocalItemForServerItemString = (s) => LocalSolutionPath }; // constants (literals) var activity = new Sonar { SonarRunnerPath = SonarRunnerPath, FailBuildOnError = FailBuildOnError, GeneratePropertiesIfMissing = GeneratePropertiesIfMissing, SonarPropertiesTemplatePath = TemplatePropertiesPath, FailBuildOnAlert = FailBuildOnAlert, BinariesDirectory = BinariesDirectory }; // object variables var parameters = new Dictionary<string, object> { { "BuildWorkspace", workpace.Instance }, { "ProjectsToAnalyze", new StringList("dummy.sln") } }; if (SonarProperties == null) SonarProperties = new StringList(); if (SonarProperties != null) parameters.Add("SonarProperties", SonarProperties); var workflowLogger = new BuildMessageTrackingParticipant(); // Create a WorkflowInvoker and add the IBuildDetail Extension WorkflowInvoker invoker = new WorkflowInvoker(activity); invoker.Extensions.Add(BuildDetail); invoker.Extensions.Add(workflowLogger); invoker.Invoke(parameters); return workflowLogger.ToString(); }
public static Build ExtractBuildInfoForArtifactory(IBuildDetail buildDetail, CodeActivityContext context) { Build build = new Build { modules = new List<Module>(), }; build.started = string.Format(Build.STARTED_FORMAT, buildDetail.StartTime.ToString(artifactoryDateFormat)); IBuildAgent currentAgent = null; foreach (IBuildAgent agent in buildDetail.BuildController.Agents) { if (Uri.Equals(agent.ReservedForBuild, buildDetail.Uri)) { currentAgent = agent; break; } } // build.buildAgent = new BuildAgent { name = currentAgent.Name, version = task.ToolVersion }; build.type = "TFS"; build.agent = new AgentTFS { name = currentAgent.Name, version = "", }; //get the current use from the windows OS System.Security.Principal.WindowsIdentity user; user = System.Security.Principal.WindowsIdentity.GetCurrent(); if (user != null) build.principal = string.Format(@"{0}", user.Name); //Calculate how long it took to do the build build.startedDateMillis = GetTimeStamp(); build.durationMillis = Convert.ToInt64((DateTime.Now - buildDetail.StartTime).TotalMilliseconds); build.number = string.IsNullOrWhiteSpace(buildDetail.BuildNumber) ? build.startedDateMillis : buildDetail.BuildNumber; build.name = buildDetail.BuildDefinition.Name; build.url = string.Format(@"{0}/{1}/_build#_a=summary&buildUri={2}", buildDetail.BuildServer.TeamProjectCollection.Uri.AbsoluteUri, buildDetail.TeamProject, buildDetail.Uri.AbsoluteUri) ; build.vcsRevision = buildDetail.SourceGetVersion; //Add build server properties, if exists. //AddSystemVariables(artifactoryConfig, build); //AddLicenseControl(artifactoryConfig, build, log); //AddBlackDuck(artifactoryConfig, build, log); //ConfigHttpClient(artifactoryConfig, build); return build; }
public int GetHighestExistingBuildNumber(BuildVersionInfo versionInfo, IBuildDetail buildDetail) { var spec = buildDetail.BuildServer.CreateBuildDetailSpec(new[] { buildDetail.BuildDefinitionUri }); spec.QueryOptions = QueryOptions.None; spec.InformationTypes = null; spec.QueryOrder = BuildQueryOrder.FinishTimeDescending; spec.QueryDeletedOption = QueryDeletedOption.IncludeDeleted; spec.MaxBuildsPerDefinition = 100; spec.BuildNumber = "*{0}*{1}.{2}.{3}.*".StringFormat(versionInfo.ProductName, versionInfo.Major, versionInfo.Minor, versionInfo.Build); return HighestExistingBuildNumber(buildDetail, spec); }
private static Project MapBuildToProject(IBuildDetail build, string definitionName) { var project = new Project { DefinitionName = definitionName, Name = build.TeamProject, Status = build.Status.ToString(), StartTime = build.StartTime, FinishTime = build.FinishTime, BuildNumber = build.BuildNumber, RequestedFor = build.RequestedFor }; return project; }
static int HighestExistingBuildNumber(string expandedPrefix, IBuildDetail buildDetail, IBuildDetailSpec spec, int max) { IBuildQueryResult result = buildDetail.BuildServer.QueryBuilds(spec); int length = expandedPrefix.Length; foreach (IBuildDetail detail in result.Builds) { int num2; string buildNumber = detail.BuildNumber; if (((buildNumber.Length > (length + 1)) && int.TryParse(buildNumber.Substring(length + 1), out num2)) && (num2 > max)) { max = num2; } } return max; }
public static string GetBuildAgent(IBuildDetail build) { if (build != null) { build.RefreshAllDetails(); foreach (var child in build.Information.Nodes) { string AgentName = ShowChild(child, 1); if (!string.IsNullOrEmpty(AgentName)) { return AgentName; } } } return string.Empty; }
private void ReportStatus(IBuildDetail build, string text, ToolTipIcon icon = ToolTipIcon.None) { if (ShouldDisplayNotification(build)) { StringBuilder message = new StringBuilder(); message.AppendFormat("Build Number: {0}\n", build.BuildNumber); message.AppendFormat("User: {0}\n", build.RequestedFor); _notifyIcon.ShowBalloonTip( BalloonTimeout, text, message.ToString(), icon ); } LastBuild = build; }
internal static Build ConvertBuildDetailToDomainType(IBuildDetail buildDetail) { var build = new Build { SystemId = buildDetail.BuildNumber, FinishedTime = buildDetail.FinishTime, StartTime = buildDetail.StartTime, Status = ConvertTFSStatusToBuildStatus(buildDetail.Status), Trigger = new Trigger { // NOTE: TFS has no concept of what triggered a build. Cause = "TFS Build", InvokedBy = StripWindowsUsername(buildDetail.RequestedBy) } }; return build; }
private void ReportStatus(IBuildDetail build, string color) { if (!ShouldDisplayNotification(build)) { return; } using (var blink1 = new Blink1()) { try { blink1.Open(); blink1.SetColor(0, 0, 0); blink1.FadeToColor(750, new HtmlHexadecimal(color), true); } catch (InvalidOperationException exception) { _logger.ErrorException(exception.Message, exception); } finally { blink1.Complete(); } } }
private void Init(IBuildDetail buildDetail, string flavour, string platform, IEnumerable<ITestRun> testRuns, ICoverageAnalysisManager coverageAnalysisManager) { this.TestsFailed = testRuns.Select(run => run.Statistics.FailedTests).Sum(); this.TestsPassed = testRuns.Select(run => run.Statistics.PassedTests).Sum(); this.TestsTotal = testRuns.Select(run => run.Statistics.TotalTests).Sum(); var configurationSummary = InformationNodeConverters.GetConfigurationSummary(buildDetail, flavour, platform); if (configurationSummary != null) { this.HasWarnings = configurationSummary.TotalCompilationWarnings > 0; } this.BuildFinished = buildDetail.BuildFinished; this.FinishTime = buildDetail.FinishTime; this.Status = BuildStatusConverter.Convert(buildDetail.Status); this.RequestedFor = buildDetail.RequestedFor; this.StartTime = buildDetail.StartTime; this.CodeCoverage = GetCodeCoverage(buildDetail, coverageAnalysisManager); }
public int? GetCodeCoverage(IBuildDetail buildDetail, ICoverageAnalysisManager analysisManager) { IBuildCoverage[] queryBuildCoverage = analysisManager.QueryBuildCoverage(buildDetail.Uri.ToString(), CoverageQueryFlags.Modules); int blocksCovered = 0; int blocksNotCovered = 0; foreach (var coverage in queryBuildCoverage) { foreach (var moduleInfo in coverage.Modules) { blocksCovered += moduleInfo.Statistics.BlocksCovered; blocksNotCovered += moduleInfo.Statistics.BlocksNotCovered; } } if (blocksCovered + blocksNotCovered == 0) { return null; } return 100 * blocksCovered / (blocksCovered + blocksNotCovered); }
int HighestExistingBuildNumber(IBuildDetail buildDetail, IBuildDetailSpec detailSpec) { var queryResult = buildDetail.BuildServer.QueryBuilds(detailSpec); var result = 0; foreach (IBuildDetail detail in queryResult.Builds) { // Parse the build number var buildParts = BuildNumberRegex.Match(detail.BuildNumber); if (!buildParts.Success) continue; // If this build has a higher revision number than the current one, // update the revision number to return. var revisionNumber = int.Parse(buildParts.Groups["Revision"].Value); if (revisionNumber > result) result = revisionNumber; } return result; }
private void Init(IBuildDetail buildDetail, string flavour, string platform) { var configurationSummary = InformationNodeConverters.GetConfigurationSummary(buildDetail, flavour, platform); if (configurationSummary != null) { if (configurationSummary.TestSummaries.Count > 0) { var testSummary = configurationSummary.TestSummaries[0]; this.TestsFailed = testSummary.TestsFailed; this.TestsPassed = testSummary.TestsPassed; this.TestsTotal = testSummary.TestsTotal; } this.HasWarnings = configurationSummary.TotalCompilationWarnings > 0; } this.BuildFinished = buildDetail.BuildFinished; this.FinishTime = buildDetail.FinishTime; this.Status = BuildStatusConverter.Convert(buildDetail.Status); this.RequestedFor = buildDetail.RequestedFor; this.StartTime = buildDetail.StartTime; }
public void UpdateProjectStatus(IBuildDetail buildDetail) { // update the project status lock (_statusCacheLock) { ProjectStatus oldStatus = new ProjectStatus(); if (_projectStatusCache.ContainsKey(buildDetail.BuildDefinition.Name)) { oldStatus = _projectStatusCache[buildDetail.BuildDefinition.Name]; _projectStatusCache.Remove(buildDetail.BuildDefinition.Name); _projectStatusLastUpdate.Remove(buildDetail.BuildDefinition.Name); } ProjectStatus newStatus = _manager.GetProjectStatus(buildDetail, oldStatus); _projectStatusCache.Add(buildDetail.BuildDefinition.Name, newStatus); _projectStatusLastUpdate.Add(buildDetail.BuildDefinition.Name, DateTime.Now); } if (buildDetail.Status == BuildStatus.InProgress) { DetachFromBuild(buildDetail.BuildDefinition.Name); AttachToBuild(buildDetail); } }
public TfsBuildInfo(IBuildDetail buildDetail) { this.BuildNumber = buildDetail.BuildNumber; this.DropLocation = buildDetail.DropLocation; }