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); }
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"); }
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); }
private static CiEvent CreateScmEvent(CiEvent finishEvent, ScmData scmData) { var scmEventEvent = finishEvent.Clone(); scmEventEvent.EventType = CiEventType.Scm; scmEventEvent.ScmData = scmData; return(scmEventEvent); }
/// <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); } }
public void Add(CiEvent ciEvent) { list.Add(ciEvent); //if exceed limit, remove the oldest event if (list.Count > QUEUE_LIMIT) { list.RemoveAt(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."); }
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); } }); }
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); }
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); }
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); }
public void Add(CiEvent ciEvent) { queue.Enqueue(ciEvent); }
public bool Remove(CiEvent ciEvent) { return(list.Remove(ciEvent)); }