Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        /// <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);
        }
Exemplo n.º 3
0
        /// <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);
        }
Exemplo n.º 4
0
        /// <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);
            }
        }
Exemplo n.º 5
0
 /// <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);
 }
Exemplo n.º 6
0
 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);
 }
Exemplo n.º 7
0
 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);
 }
Exemplo n.º 8
0
        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);
            }
        }