public void Notify(string eventXml, string tfsIdentityXml) { try { if (ConfigHelper.ParseOrDefault(System.Configuration.ConfigurationManager.AppSettings["LogEventsToFile"]) == true) { var logPath = ConfigHelper.GetLoggingPath(); logger.Info(string.Format("TFSEventsProcessor: DslScriptService Event being logged to [{0}]", logPath)); LoggingHelper.DumpEventToDisk(eventXml, logPath); } // Create a new Tfs helper this.iTfsProvider.UnpackIdentity(tfsIdentityXml); // work out the event type string[] argItems = null; try { var buildDetails = EventXmlHelper.GetBuildStatusChangedAlertFields(eventXml); argItems = new[] { EventTypes.BuildEvent.ToString(), buildDetails.BuildUri.ToString() }; logger.Info(string.Format( "TFSEventsProcessor: DslScriptService Event being processed for Build:{0}", buildDetails.BuildUri)); } catch (NullReferenceException) { // if it not build must be work item // Extract the required information out of the eventXml var workItemId = EventXmlHelper.GetWorkItemValue <int>( eventXml, EventXmlHelper.FieldSection.CoreFields, EventXmlHelper.FieldType.IntegerField, EventXmlHelper.ValueType.NewValue, "System.Id"); if (workItemId > 0) { argItems = new[] { EventTypes.WorkItemEvent.ToString(), workItemId.ToString() }; logger.Info( string.Format("TFSEventsProcessor: DslScriptService Event being processed for WI:{0}", workItemId)); } else { try { var checkInDetails = EventXmlHelper.GetCheckInDetails(eventXml); argItems = new[] { EventTypes.CheckInEvent.ToString(), checkInDetails.Changeset.ToString() }; logger.Info( string.Format( "TFSEventsProcessor: DslScriptService Event being processed for Checkin:{0}", checkInDetails.Changeset)); } catch (NullReferenceException) { // other event type } } } var args = new Dictionary <string, object> { { "Arguments", argItems }, }; var engine = new TFSEventsProcessor.Dsl.DslProcessor(); engine.RunScript( this.dslFolder, this.scriptFolder, GetScriptName(argItems[0], this.scriptFile), args, this.iTfsProvider, this.iEmailProvider, eventXml); } catch (Exception ex) { // using a global exception catch to make sure we don't block any threads this.DumpException(ex); } }
[Authorize] // Require some form of authentication public HttpResponseMessage Post([FromBody] JObject jsondata) { try { if (ConfigHelper.ParseOrDefault(Microsoft.Azure.CloudConfigurationManager.GetSetting("LogEventsToFile")) == true) { var logPath = ConfigHelper.GetLoggingPath(); logger.Info(string.Format("Post: Event being logged to [{0}]", logPath)); LoggingHelper.DumpEventToDisk(jsondata, logPath); } var dataProvider = new Providers.JsonDataProvider(jsondata); var uri = dataProvider.GetServerUrl(); var locationpat = ConfigHelper.GetPersonalAccessToken(uri); logger.Info($"Post: Using a {uri}"); if (string.IsNullOrEmpty(locationpat.Item2) == false) { logger.Info($"Post: Using a PAT token and obtained from {locationpat.Item1}"); this.iAzureDevOpsProvider = new Providers.AzureDevOpsProvider(uri, locationpat.Item2); } else { logger.Info(string.Format("Post: Using default credentials and url {0}", uri)); this.iAzureDevOpsProvider = new Providers.AzureDevOpsProvider(uri); } // work out the event type var eventType = dataProvider.GetEventType(); // work out the subscription ID var subscriptionID = dataProvider.GetSubsriptionID(); string[] argItems = null; switch (eventType) { case "workitem.updated": case "workitem.created": case "workitem.deleted": case "workitem.restored": case "workitem.commented": var workItemId = dataProvider.GetWorkItemDetails().Id; if (workItemId > 0) { argItems = new[] { eventType, workItemId.ToString() }; logger.Info( string.Format("Post: {1} Event being processed for WI:{0}", workItemId, eventType)); } else { logger.Error( string.Format("Post: {0} Event cannot find workitem ID", eventType)); return(new HttpResponseMessage(HttpStatusCode.BadRequest)); } break; case "build.complete": var buildDetails = dataProvider.GetBuildDetails(); argItems = new[] { eventType, buildDetails.Id.ToString() }; logger.Info(string.Format( "Post: Event being processed for Build:{0}", buildDetails.BuildUri)); break; case "ms.vss-release.deployment-approval-completed-event": case "ms.vss-release.deployment-approval-pending-event": case "ms.vss-release.deployment-completed-event": case "ms.vss-release.deployment-started-event": case "ms.vss-release.release-abandoned-event": case "ms.vss-release.release-created-event": var releaseDetails = dataProvider.GetReleaseDetails(); argItems = new[] { eventType, releaseDetails.Id.ToString() }; logger.Info(string.Format( "Post: Event being processed for Release:{0}", releaseDetails.Id)); break; case "tfvc.checkin": var checkInDetails = dataProvider.GetCheckInDetails(); argItems = new[] { eventType, checkInDetails.Changeset.ToString() }; logger.Info( string.Format( "Post: Event being processed for Checkin:{0}", checkInDetails.Changeset)); break; case "message.posted": var messagePostDetails = dataProvider.GetMessagePostDetails(); argItems = new[] { eventType, messagePostDetails.PostRoomId.ToString() }; logger.Info( string.Format( "Post: Event being processed for Meesage Post in Room:{0}", messagePostDetails.PostRoomId)); break; case "git.push": var pushDetails = dataProvider.GetPushDetails(); argItems = new[] { eventType, pushDetails.Repo, pushDetails.PushId.ToString() }; logger.Info( string.Format( "Post: Event being processed for Push:{0}", pushDetails.PushId)); break; case "git.pullrequest.created": case "git.pullrequest.merged": case "git.pullrequest.updated": var pullDetails = dataProvider.GetPullDetails(); argItems = new[] { eventType, pullDetails.Repo, pullDetails.PullId.ToString() }; logger.Info( string.Format( "Post: Event being processed for Pull:{0}", pullDetails.PullId)); break; default: logger.Info(string.Format("Post: Unhandled event cannot processed:{0}", eventType)); return(new HttpResponseMessage(HttpStatusCode.BadRequest)); } var args = new Dictionary <string, object> { { "Arguments", argItems }, }; var engine = new AzureDevOpsEventsProcessor.Dsl.DslProcessor(redirectScriptEngineOutputtoLogging); engine.RunScript( this.dslFolder, this.scriptFolder, FolderHelper.GetScriptName( eventType, subscriptionID, this.scriptFile, this.useSubscriptionID), args, this.iAzureDevOpsProvider, this.iEmailProvider, dataProvider); return(new HttpResponseMessage(HttpStatusCode.OK)); } catch (Exception ex) { // using a global exception catch to make sure we don't block any threads LoggingHelper.DumpException(logger, ex); return(new HttpResponseMessage(HttpStatusCode.BadRequest)); } }