コード例 #1
0
        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");
            });
        }
コード例 #2
0
        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);
                }
            }
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        public string GetBuildLogLocation(IBuildDetail build)
        {
            var linkService = (TswaClientHyperlinkService)this.collection.GetService(typeof(TswaClientHyperlinkService));
            var url         = linkService.GetViewBuildDetailsUrl(build.Uri);

            return(url.ToString());
        }
コード例 #5
0
        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));
            }
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        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
                                              );
        }
コード例 #8
0
        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;
        }
コード例 #9
0
        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);
        }
コード例 #10
0
        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);
            }
        }
コード例 #11
0
        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);
            }
        }
コード例 #12
0
        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);
        }
コード例 #13
0
        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);
        }
コード例 #14
0
ファイル: FormBuildDetail.cs プロジェクト: psulek/tfsman
        public static void DialogShow(IBuildDetail buildDetail)
        {
            var form = new FormBuildDetail();

            form.detailPanel.Initialize(buildDetail);
            form.ShowDialog();
        }
コード例 #15
0
        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;
        }
コード例 #16
0
        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);
        }
コード例 #17
0
        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);
        }
コード例 #18
0
        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);
        }
コード例 #19
0
 public override void ReportInProgress(IBuildDetail build)
 {
     ReportStatus(
         build,
         "Build In Progress",
         ToolTipIcon.Info
     );
 }
コード例 #20
0
        /// <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;
        }
コード例 #21
0
        public BuildDetail(IBuildDefinition buildDef, IBuildDetail buildDetail)
        {
            Id = buildDef.Id;
            ContinuousIntegrationType = buildDef.ContinuousIntegrationType;
            BuildDefinitionName       = buildDef.Name;

            Build = buildDetail;
        }
コード例 #22
0
        private void AddBuildsErrors(IBuildDetail tfsBuild, Build build)
        {
            var associatedBuildErrors = InformationNodeConverters.GetBuildErrors(tfsBuild);

            build.Error = new Error {
                Total = associatedBuildErrors.Count()
            };
        }
コード例 #23
0
 protected virtual bool ShouldDisplayNotification(IBuildDetail build)
 {
     return (
         LastBuild == null
         || build.BuildNumber != LastBuild.BuildNumber)
         || (build.Status != BuildStatus.InProgress && LastBuild.Status == BuildStatus.InProgress
     );
 }
コード例 #24
0
 public override void ReportFailure(IBuildDetail build)
 {
     ReportStatus(
         build,
         "Build Failed",
         ToolTipIcon.Error
     );
 }
コード例 #25
0
 public override void ReportSuccess(IBuildDetail build)
 {
     ReportStatus(
         build,
         "Build Succeeded",
         ToolTipIcon.Info
     );
 }
コード例 #26
0
ファイル: BuildDetail.cs プロジェクト: onlyutkarsh/TFSCleaner
        public BuildDetail(IBuildDefinition buildDef,  IBuildDetail buildDetail)
        {
            Id = buildDef.Id;
            ContinuousIntegrationType = buildDef.ContinuousIntegrationType;
            BuildDefinitionName = buildDef.Name;

            Build = buildDetail;
        }
コード例 #27
0
 public BuildDetailToBuildDataAdapter(IBuildDetail buildDetail)
 {
     if (null == buildDetail)
     {
         throw new ArgumentNullException("buildDetail");
     }
     _detail = buildDetail;
 }
コード例 #28
0
        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);
        }
コード例 #29
0
 private void EnsureConnected()
 {
     if (teamProjectCollection == null)
     {
         teamProjectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri(tfsUri));
         build = teamProjectCollection.GetService <IBuildServer>().GetBuild(new Uri(buildUri));
     }
 }
コード例 #30
0
        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);
        }
コード例 #31
0
        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);
        }
コード例 #32
0
ファイル: Program.cs プロジェクト: nagyist/BuildManager
 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;
 }
コード例 #33
0
 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);
        }
コード例 #35
0
 // 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);
 }
コード例 #36
0
        /// <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);
                            }
                        }
                    }
                }
            }
        }
コード例 #37
0
        /// <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);
        }
コード例 #38
0
        public BuildStatus GetLatestBuildStatusForProject(IBuildDetail bd)
        {
            BuildStatus status = BuildStatus.None;

            if (bd != null)
            {
                status = bd.Status;
            }

            return(status);
        }
コード例 #39
0
 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;
 }
コード例 #40
0
        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());
        }
コード例 #41
0
 public override void ReportInProgress(IBuildDetail build)
 {
     var sequence = new PulseSequence {
         Color = BusylightColor.Blue,
         Step1 = 0,
         Step2 = 255,
         Step3 = 0,
         Step4 = 255
     };
     _busylight.Pulse(sequence);
 }
コード例 #42
0
        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);
            }
        }
コード例 #43
0
ファイル: TfsBridge.cs プロジェクト: Hdesai/XBuildLight
 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
     };
 }
コード例 #44
0
 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;
 }
コード例 #45
0
        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;
        }
コード例 #46
0
        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();
        }
コード例 #47
0
        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;
        }
コード例 #48
0
        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);
        }
コード例 #49
0
 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;
 }
コード例 #50
0
 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;
 }
コード例 #51
0
 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;
 }
コード例 #52
0
        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;
        }
コード例 #53
0
ファイル: BuildRepository.cs プロジェクト: ArildF/Smeedee
 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;
 }
コード例 #54
0
        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();
                }
            }
        }
コード例 #55
0
        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);
        }
コード例 #56
0
        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);
        }
コード例 #57
0
        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;
        }
コード例 #58
0
        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;
        }
コード例 #59
0
        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);
            }
        }
コード例 #60
0
ファイル: TfsBuildInfo.cs プロジェクト: mwpnl/bmx-tfs
 public TfsBuildInfo(IBuildDetail buildDetail)
 {
     this.BuildNumber = buildDetail.BuildNumber;
     this.DropLocation = buildDetail.DropLocation;
 }