/// <summary> /// Populate the build table by processing the given message. This function doesn't handle /// any build state semantics. Instead it just processes the build and updates the build /// result tables. /// </summary> public static async Task PopulateBuildData( [QueueTrigger(QueueNames.ProcessBuild)] string message, [Table(TableNames.BuildState)] CloudTable buildStateTable, [Table(TableNames.BuildStateKey)] CloudTable buildStateKeyTable, [Table(TableNames.BuildResultDate)] CloudTable buildResultDateTable, [Table(TableNames.BuildResultExact)] CloudTable buildResultExactTable, [Table(TableNames.BuildFailureDate)] CloudTable buildFailureDateTable, [Table(TableNames.BuildFailureExact)] CloudTable buildFailureExactTable, [Table(TableNames.CounterBuilds)] CloudTable counterBuildsTable, [Table(TableNames.ViewNameDate)] CloudTable viewNameDateTable, [Queue(QueueNames.ProcessBuild)] CloudQueue processBuildQueue, [Queue(QueueNames.EmailBuild)] CloudQueue emailBuildQueue, TextWriter logger, CancellationToken cancellationToken) { var buildIdJson = (BuildStateMessage)JsonConvert.DeserializeObject(message, typeof(BuildStateMessage)); var client = StateUtil.CreateJenkinsClient(buildIdJson.BoundBuildId); var populator = new BuildTablePopulator( buildResultDateTable: buildResultDateTable, buildResultExactTable: buildResultExactTable, buildFailureDateTable: buildFailureDateTable, buildFailureExactTable: buildFailureExactTable, viewNameDateTable: viewNameDateTable, buildCounterUtil: CounterUtilFactory.Create<BuildCounterEntity>(counterBuildsTable), client: client, textWriter: logger); var stateUtil = new StateUtil( buildStateKeyTable: buildStateKeyTable, buildStateTable: buildStateTable, processBuildQueue: processBuildQueue, emailBuildQueue: emailBuildQueue, logger: logger); await stateUtil.Populate(buildIdJson, populator, cancellationToken); }
/// <summary> /// Populate the build table by processing the given message. This function doesn't handle /// any build state semantics. Instead it just processes the build and updates the build /// result tables. /// </summary> public static async Task PopulateBuildData( [QueueTrigger(QueueNames.ProcessBuild)] string message, [Table(TableNames.BuildState)] CloudTable buildStateTable, [Table(TableNames.BuildStateKey)] CloudTable buildStateKeyTable, [Table(TableNames.BuildResultDate)] CloudTable buildResultDateTable, [Table(TableNames.BuildResultExact)] CloudTable buildResultExactTable, [Table(TableNames.BuildFailureDate)] CloudTable buildFailureDateTable, [Table(TableNames.BuildFailureExact)] CloudTable buildFailureExactTable, [Table(TableNames.CounterBuilds)] CloudTable counterBuildsTable, [Table(TableNames.ViewNameDate)] CloudTable viewNameDateTable, [Queue(QueueNames.ProcessBuild)] CloudQueue processBuildQueue, [Queue(QueueNames.EmailBuild)] CloudQueue emailBuildQueue, TextWriter logger, CancellationToken cancellationToken) { var buildIdJson = (BuildStateMessage)JsonConvert.DeserializeObject(message, typeof(BuildStateMessage)); var client = StateUtil.CreateJenkinsClient(buildIdJson.BoundBuildId); var populator = new BuildTablePopulator( buildResultDateTable: buildResultDateTable, buildResultExactTable: buildResultExactTable, buildFailureDateTable: buildFailureDateTable, buildFailureExactTable: buildFailureExactTable, viewNameDateTable: viewNameDateTable, buildCounterUtil: CounterUtilFactory.Create <BuildCounterEntity>(counterBuildsTable), client: client, textWriter: logger); var stateUtil = new StateUtil( buildStateKeyTable: buildStateKeyTable, buildStateTable: buildStateTable, processBuildQueue: processBuildQueue, emailBuildQueue: emailBuildQueue, logger: logger); await stateUtil.Populate(buildIdJson, populator, cancellationToken); }
/// <summary> /// Populate the build table by processing the given message. This function doesn't handle /// any build state semantics. Instead it just processes the build and updates the build /// result tables. /// </summary> public static async Task PopulateBuildData( [QueueTrigger(AzureConstants.QueueNames.ProcessBuild)] string message, [Table(AzureConstants.TableNames.UnprocessedBuild)] CloudTable unprocessedBuildTable, [Table(AzureConstants.TableNames.BuildResultDate)] CloudTable buildResultDateTable, [Table(AzureConstants.TableNames.BuildResultExact)] CloudTable buildResultExactTable, [Table(AzureConstants.TableNames.BuildFailureDate)] CloudTable buildFailureDateTable, [Table(AzureConstants.TableNames.BuildFailureExact)] CloudTable buildFailureExactTable, [Table(AzureConstants.TableNames.ViewNameDate)] CloudTable viewNameDateTable, TextWriter logger, CancellationToken cancellationToken) { var buildIdJson = (BuildIdJson)JsonConvert.DeserializeObject(message, typeof(BuildIdJson)); var client = StateUtil.CreateJenkinsClient(buildIdJson.JenkinsUrl, buildIdJson.JobId); var populator = new BuildTablePopulator( buildResultDateTable: buildResultDateTable, buildResultExactTable: buildResultExactTable, buildFailureDateTable: buildFailureDateTable, buildFailureExactTable: buildFailureExactTable, viewNameDateTable: viewNameDateTable, client: client, textWriter: logger); var stateUtil = new StateUtil( unprocessedBuildTable: unprocessedBuildTable, buildResultExact: buildResultExactTable, logger: logger); await stateUtil.Populate(buildIdJson.BuildId, populator, force : false, cancellationToken : cancellationToken); }
/// <summary> /// Clean out the old entries in the unprocessed table. /// </summary> public static async Task CleanUnprocessedTable( [TimerTrigger("0 0 * * * *", RunOnStartup = true)] TimerInfo timerInfo, [Table(AzureConstants.TableNames.UnprocessedBuild)] CloudTable unprocessedBuildTable, [Table(AzureConstants.TableNames.BuildResultExact)] CloudTable buildResultExactTable, TextWriter logger, CancellationToken cancellationToken) { var util = new StateUtil( unprocessedBuildTable: unprocessedBuildTable, buildResultExact: buildResultExactTable, logger: logger); var message = await util.Clean(cancellationToken); if (message != null) { message.AddTo("*****@*****.**"); message.AddTo("*****@*****.**"); message.From = new MailAddress("*****@*****.**"); message.Subject = "Jenkins Build Populate Errors"; var key = CloudConfigurationManager.GetSetting(SharedConstants.SendGridApiKeySettingName); var web = new Web(apiKey: key); await web.DeliverAsync(message).ConfigureAwait(false); } }
/// <summary> /// Update the jobs in the unprocessed table. /// </summary> public static async Task UpdateUnprocessedTable( [TimerTrigger("0 0/30 * * * *", RunOnStartup = true)] TimerInfo timerInfo, [Queue(AzureConstants.QueueNames.ProcessBuild)] CloudQueue processBuildQueue, [Table(AzureConstants.TableNames.UnprocessedBuild)] CloudTable unprocessedBuildTable, [Table(AzureConstants.TableNames.BuildResultExact)] CloudTable buildResultExactTable, TextWriter logger, CancellationToken cancellationToken) { var util = new StateUtil( unprocessedBuildTable: unprocessedBuildTable, buildResultExact: buildResultExactTable, logger: logger); await util.Update(processBuildQueue, cancellationToken); }
public static async Task BuildEvent( [QueueTrigger(QueueNames.BuildEvent)] string message, [Queue(QueueNames.ProcessBuild)] CloudQueue processBuildQueue, [Queue(QueueNames.EmailBuild)] CloudQueue emailBuildQueue, [Table(TableNames.BuildState)] CloudTable buildStateTable, [Table(TableNames.BuildStateKey)] CloudTable buildStateKeyTable, TextWriter logger, CancellationToken cancellationToken) { var messageJson = JsonConvert.DeserializeObject<BuildEventMessageJson>(message); var stateUtil = new StateUtil( buildStateTable, buildStateKeyTable, processBuildQueue, emailBuildQueue, logger); await stateUtil.ProcessBuildEvent(messageJson, cancellationToken); }
public static async Task BuildEvent( [QueueTrigger(QueueNames.BuildEvent)] string message, [Queue(QueueNames.ProcessBuild)] CloudQueue processBuildQueue, [Queue(QueueNames.EmailBuild)] CloudQueue emailBuildQueue, [Table(TableNames.BuildState)] CloudTable buildStateTable, [Table(TableNames.BuildStateKey)] CloudTable buildStateKeyTable, TextWriter logger, CancellationToken cancellationToken) { var messageJson = JsonConvert.DeserializeObject <BuildEventMessageJson>(message); var stateUtil = new StateUtil( buildStateTable, buildStateKeyTable, processBuildQueue, emailBuildQueue, logger); await stateUtil.ProcessBuildEvent(messageJson, cancellationToken); }
public static async Task BuildEvent( [QueueTrigger(AzureConstants.QueueNames.BuildEvent)] string message, [Queue(AzureConstants.QueueNames.ProcessBuild)] CloudQueue processBuildQueue, [Table(AzureConstants.TableNames.UnprocessedBuild)] CloudTable unprocessedBuildTable, TextWriter logger, CancellationToken cancellationToken) { var messageJson = (BuildEventMessageJson)JsonConvert.DeserializeObject(message, typeof(BuildEventMessageJson)); // First make sure that we note this value in the unprocessed table as it has not yet // been processed. var entity = new UnprocessedBuildEntity(messageJson.BoundBuildId); var operation = TableOperation.InsertOrReplace(entity); await unprocessedBuildTable.ExecuteAsync(TableOperation.InsertOrReplace(entity)); // If this is a finalized event then the build is ready. Go ahead and process it now. if (messageJson.Phase == "FINALIZED") { logger.WriteLine($"Queue event to process build {messageJson.BuildId}"); await StateUtil.EnqueueProcessBuild(processBuildQueue, messageJson.JenkinsHostName, messageJson.BuildId); } }