예제 #1
0
        public EventNotificationStatus ProcessEvent(IVssRequestContext requestContext, NotificationType notificationType,
                                                    object notificationEventArgs, out int statusCode, out string statusMessage,
                                                    out Microsoft.TeamFoundation.Common.ExceptionPropertyCollection properties)
        {
            statusCode    = 0;
            properties    = null;
            statusMessage = String.Empty;
            try
            {
                BuildUpdatedEvent updatedEvent = (BuildUpdatedEvent)notificationEventArgs;
                Build             build        = updatedEvent.Build;
                Log.Info($"ProcessEvent {notificationEventArgs.GetType().Name} for build {updatedEvent.BuildId} (Build Number : {updatedEvent.Build.BuildNumber}, Build Definition: {updatedEvent.Build.Definition.Name})");

                CiEvent ciEvent = CiEventUtils.ToCiEvent(build);
                if (notificationEventArgs is BuildStartedEvent)
                {
                    ciEvent.EventType = CiEventType.Started;
                    _pluginManager.GeneralEventsQueue.Add(ciEvent);
                }
                else if (notificationEventArgs is BuildCompletedEvent)
                {
                    ciEvent.EventType = CiEventType.Finished;
                    _pluginManager.HandleFinishEvent(ciEvent);
                }
            }
            catch (Exception e)
            {
                var msg = $"ProcessEvent {notificationEventArgs.GetType().Name} failed {e.Message}";
                Log.Error(msg, e);
                TeamFoundationApplicationCore.LogException(requestContext, msg, e);
            }
            return(EventNotificationStatus.ActionPermitted);
        }
예제 #2
0
        private static void ProcessFinishEvents(CancellationToken token, EventsQueue queue, string queueName, Action <CiEvent> action, SleepTimeWrapper sleepTimeWrapper)
        {
            Log.Debug($"{queueName} task - started");
            while (!token.IsCancellationRequested)
            {
                try
                {
                    while (!queue.IsEmpty())
                    {
                        var ciEvent = queue.Peek();

                        action(ciEvent);

                        //remove item from _finishedEventsQueue
                        queue.Dequeue();
                        sleepTimeWrapper.SleepTime = SleepTimeWrapper.DEFAULT_SLEEP_TIME;
                    }
                }
                catch (Exception e)
                {
                    ExceptionHelper.HandleExceptionAndRestartIfRequired(e, Log, "ProcessFinishEvents");

                    sleepTimeWrapper.SleepTime = sleepTimeWrapper.SleepTime * 2;
                    if (sleepTimeWrapper.SleepTime > SleepTimeWrapper.MAX_SLEEP_TIME)
                    {
                        CiEvent ciEvent = queue.Dequeue();
                        Log.Error($"Build {ciEvent.BuildInfo} - Impossible to handle event in {queueName} queue. Event is removed from queue.");
                        sleepTimeWrapper.SleepTime = SleepTimeWrapper.DEFAULT_SLEEP_TIME;
                    }
                }

                Thread.Sleep(sleepTimeWrapper.SleepTime * 1000);//wait before next loop
            }
            Log.Debug($"{queueName} task - finished");
        }
예제 #3
0
        private void SendTestResults(CiEvent ciEvent)
        {
            try
            {
                DateTime start = DateTime.Now;
                string   msg   = "";
                if (_octaneApis.IsTestResultRelevant(ciEvent.Project))
                {
                    var run = _tfsApis.GetRunForBuild(ciEvent.BuildInfo.CollectionName, ciEvent.BuildInfo.Project, ciEvent.BuildInfo.BuildId);
                    if (run == null)
                    {
                        msg = "Run was not created for build. No test results.";
                    }
                    else
                    {
                        var testResults = _tfsApis.GetTestResultsForRun(ciEvent.BuildInfo.CollectionName, ciEvent.BuildInfo.Project, run.Id.ToString());
                        OctaneTestResult octaneTestResult = OctaneTestResutsUtils.ConvertToOctaneTestResult(_octaneApis.PluginInstanceId, ciEvent.Project, ciEvent.BuildId, testResults, run.WebAccessUrl);
                        _octaneApis.SendTestResults(octaneTestResult);
                        msg = $"TestResults are sent ({octaneTestResult.TestRuns.Count} tests)";
                    }
                }
                else
                {
                    msg = "GetTestResultRelevant = false";
                }

                DateTime end = DateTime.Now;
                Log.Info($"Build {ciEvent.BuildInfo} - {msg}. Handling time is {(long)((end - start).TotalMilliseconds)} ms.");
            }
            catch (Exception ex)
            {
                Log.Error($"Build {ciEvent.BuildInfo} : error in SendTestResults : {ex.Message}", ex);
                throw ex;
            }
        }
        private static CiEvent createEvent(TfsBuildInfo buildInfo, String buildDefinitionName, bool isManualCause, DateTime?startTime,
                                           DateTime?finishTime)
        {
            var ciEvent = new CiEvent();

            ciEvent.BuildInfo = buildInfo;

            ciEvent.BuildId    = buildInfo.BuildId + "." + buildInfo.BuildNumber;
            ciEvent.BuildTitle = buildInfo.BuildNumber;

            ciEvent.ProjectDisplayName = buildDefinitionName;
            ciEvent.PhaseType          = "post";

            //cause
            var cause = new CiEventCause();

            cause.CauseType = isManualCause ? CiEventCauseType.User : CiEventCauseType.Undefined;
            ciEvent.Causes.Add(cause);

            if (startTime.HasValue)
            {
                ciEvent.StartTime = OctaneUtils.ConvertToOctaneTime(startTime.Value);
                if (finishTime.HasValue)
                {
                    ciEvent.Duration = (long)(finishTime.Value - startTime.Value).TotalMilliseconds;
                }
            }

            return(ciEvent);
        }
예제 #5
0
        private static CiEvent CreateScmEvent(CiEvent finishEvent, ScmData scmData)
        {
            var scmEventEvent = finishEvent.Clone();

            scmEventEvent.EventType = CiEventType.Scm;
            scmEventEvent.ScmData   = scmData;
            return(scmEventEvent);
        }
예제 #6
0
 /// <summary>
 /// enrich CiEvent.Project property with collection name
 /// </summary>
 /// <param name="ev"></param>
 private void EnrichEvent(CiEvent ev)
 {
     if (ev.Project == null)
     {
         String collectionName = _tfsApis.GetCollectionNameByProjectId(ev.BuildInfo.ProjectId);
         ev.Project = OctaneUtils.GenerateOctaneJobCiId(collectionName, ev.BuildInfo.ProjectId, ev.BuildInfo.BuildDefinitionId);
     }
 }
예제 #7
0
        public void Add(CiEvent ciEvent)
        {
            list.Add(ciEvent);

            //if exceed limit, remove the oldest event
            if (list.Count > QUEUE_LIMIT)
            {
                list.RemoveAt(0);
            }
        }
예제 #8
0
        private void SendScmEvent(CiEvent ciEvent)
        {
            DateTime start   = DateTime.Now;
            var      scmData = ScmEventHelper.GetScmData(_tfsApis, ciEvent.BuildInfo);
            DateTime end     = DateTime.Now;

            int commitCount = 0;

            if (scmData != null)
            {
                commitCount = scmData.Commits.Count;
                var scmEvent = CreateScmEvent(ciEvent, scmData);
                _generalEventsQueue.Add(scmEvent);
            }
            Log.Info($"Build {ciEvent.BuildInfo} - SCM data contains {commitCount} commits. Handling time is {(long)((end - start).TotalMilliseconds)} ms.");
        }
예제 #9
0
        public void HandleFinishEvent(CiEvent ciEvent)
        {
            Task.Factory.StartNew(() =>
            {
                try
                {
                    if (_queuesManager != null)
                    {
                        _queuesManager.TfsApis.ConnectionValidation("warm-up");
                    }
                }
                finally
                {
                    _scmEventsQueue.Add(ciEvent);
                    _testResultsQueue.Add(ciEvent);

                    Thread.Sleep(5000);
                    _generalEventsQueue.Add(ciEvent);
                }
            });
        }
예제 #10
0
        public EventNotificationStatus ProcessEvent(IVssRequestContext requestContext, NotificationType notificationType,
                                                    object notificationEventArgs, out int statusCode, out string statusMessage,
                                                    out Microsoft.TeamFoundation.Common.ExceptionPropertyCollection properties)
        {
            //Log.Info($"ProcessEvent {notificationEventArgs.GetType().Name} - {notificationEventArgs.ToString()}");
            //Log.Info(JsonHelper.SerializeObject(notificationEventArgs, true));
            statusCode    = 0;
            properties    = null;
            statusMessage = String.Empty;
            try
            {
#if Package2019
                if (notificationEventArgs is Microsoft.TeamFoundation.Build2.Server.BuildEventBase)
                {
                    Microsoft.TeamFoundation.Build2.Server.BuildData build = (Microsoft.TeamFoundation.Build2.Server.BuildData)((Microsoft.TeamFoundation.Build2.Server.BuildEventBase)notificationEventArgs).Build;
                    Log.Info($"ProcessEvent {notificationEventArgs.GetType().Name} for project {build.ProjectId}, status: {build.Status}, BuildNumber: {build.BuildNumber}, DefinitionName: {build.Definition.Name}, DefinitionId: {build.Definition.Id}");
                    CiEvent ciEvent = ConvertToCiEvent2019(build);
                    if (notificationEventArgs is Microsoft.TeamFoundation.Build2.Server.BuildStartedEvent)
                    {
                        ciEvent.EventType = CiEventType.Started;
                        _pluginManager.GeneralEventsQueue.Add(ciEvent);
                    }
                    else if (notificationEventArgs is Microsoft.TeamFoundation.Build2.Server.BuildCompletedEvent)
                    {
                        ciEvent.EventType = CiEventType.Finished;
                        _pluginManager.HandleFinishEvent(ciEvent);
                    }
                }
#endif
            }
            catch (Exception e)
            {
                var msg = $"ProcessEvent {notificationEventArgs.GetType().Name} failed {e.Message}";
                Log.Error(msg, e);
            }
            return(EventNotificationStatus.ActionPermitted);
        }
예제 #11
0
        public CiEvent ToCiEvent()
        {
            var ciEvent = new CiEvent();

            //create  build info
            var elements = Resource.Definition.Url.Split('/').ToList();
            var i        = elements.FindIndex(x => x == "_apis");

            ciEvent.BuildInfo = new TfsBuildInfo(Resource.Id.ToString(), Resource.BuildNumber, elements[i - 1], Resource.Definition.Id);

            //start filling ciEvent
            switch (EventType)
            {
            case "build.complete":
                ciEvent.EventType = CiEventType.Finished;
                break;

            default:
                ciEvent.EventType = CiEventType.Undefined;
                break;
            }

            ciEvent.BuildId = ciEvent.BuildInfo.BuildId + "." + ciEvent.BuildInfo.BuildNumber;
            //ciEvent.Project = OctaneUtils.GenerateOctaneJobCiId(ciEvent.BuildInfo.ProjectId, ciEvent.BuildInfo.BuildDefinitionId);
            ciEvent.BuildTitle = ciEvent.BuildInfo.BuildNumber;
            var cause = new CiEventCause();

            switch (Resource.Reason)
            {
            case "manual":
                cause.CauseType = CiEventCauseType.User;
                break;

            default:
                cause.CauseType = CiEventCauseType.Undefined;
                break;
            }
            ciEvent.Causes.Add(cause);
            ciEvent.StartTime          = OctaneUtils.ConvertToOctaneTime(Resource.StartTime);
            ciEvent.Duration           = (long)(Resource.FinishTime - Resource.StartTime).TotalMilliseconds;
            ciEvent.ProjectDisplayName = Resource.Definition.Name;
            ciEvent.PhaseType          = "post";

            switch (Resource.Status)
            {
            case "succeeded":
                ciEvent.BuildResult = CiBuildResult.Success;
                break;

            case "partiallySucceeded":
                ciEvent.BuildResult = CiBuildResult.Unstable;
                break;

            case "failed":
                ciEvent.BuildResult = CiBuildResult.Failure;
                break;

            case "stopped":
                ciEvent.BuildResult = CiBuildResult.Aborted;
                break;

            default:
                ciEvent.BuildResult = CiBuildResult.Unavailable;
                break;

                //UNSTABLE("unstable"),
            }

            return(ciEvent);
        }
예제 #12
0
        public static CiEvent ToCiEvent(Build build)
        {
            var ciEvent = new CiEvent();


            //create  build info
            TfsBuildInfo buildInfo = new TfsBuildInfo();
            var          elements  = build.Definition.Url.Split('/').ToList();
            var          i         = elements.FindIndex(x => x == "_apis");

            buildInfo.CollectionName    = elements[i - 2];
            buildInfo.Project           = elements[i - 1];
            buildInfo.BuildDefinitionId = build.Definition.Id.ToString();
            buildInfo.BuildId           = build.Id.ToString();
            buildInfo.BuildName         = build.BuildNumber;
            ciEvent.BuildInfo           = buildInfo;

            //start filling ciEvent
            ciEvent.BuildId = buildInfo.BuildId + "." + buildInfo.BuildName;

            ciEvent.Project    = OctaneUtils.GenerateOctaneJobCiId(buildInfo.CollectionName, buildInfo.Project, buildInfo.BuildDefinitionId);
            ciEvent.BuildTitle = buildInfo.BuildName;
            var cause = new CiEventCause();

            switch (build.Reason)
            {
            case BuildReason.Manual:
                cause.CauseType = CiEventCauseType.User;
                break;

            default:
                cause.CauseType = CiEventCauseType.Undefined;
                break;
            }
            ciEvent.Causes.Add(cause);

            ciEvent.ProjectDisplayName = build.Definition.Name;
            ciEvent.PhaseType          = "post";


            if (build.StartTime.HasValue)
            {
                ciEvent.StartTime = OctaneUtils.ConvertToOctaneTime(build.StartTime.Value);
                if (build.FinishTime.HasValue)
                {
                    ciEvent.Duration = (long)(build.FinishTime.Value - build.StartTime.Value).TotalMilliseconds;
                }
            }

            if (build.Result.HasValue)
            {
                switch (build.Result)
                {
                case BuildResult.Succeeded:
                    ciEvent.BuildResult = CiBuildResult.Success;
                    break;

                case BuildResult.Failed:
                    ciEvent.BuildResult = CiBuildResult.Failure;
                    break;

                case BuildResult.Canceled:
                    ciEvent.BuildResult = CiBuildResult.Aborted;
                    break;

                case BuildResult.PartiallySucceeded:
                    ciEvent.BuildResult = CiBuildResult.Unstable;
                    break;

                default:
                    ciEvent.BuildResult = CiBuildResult.Unavailable;
                    break;
                }
            }


            return(ciEvent);
        }
예제 #13
0
 public void Add(CiEvent ciEvent)
 {
     queue.Enqueue(ciEvent);
 }
예제 #14
0
 public bool Remove(CiEvent ciEvent)
 {
     return(list.Remove(ciEvent));
 }