/// <summary> /// Populate the given build and update the unprocessed table accordingly. If there is no /// existing entity in the unprocessed table, this won't add one. It will only update existing /// ones. /// </summary> internal async Task Populate(BuildStateMessage message, BuildTablePopulator populator, CancellationToken cancellationToken) { var buildId = message.BuildId; var entityKey = BuildStateEntity.GetEntityKey(message.BuildStateKey, message.BoundBuildId); var entity = await AzureUtil.QueryAsync<BuildStateEntity>(_buildStateTable, entityKey, cancellationToken); var completed = await PopulateCore(entity, populator, cancellationToken); // Unable to complete the build, consider this is a 404 missing that we need to handle. if (!completed && entity.BuildMissingCount > MissingBuildLimit) { completed = await PopulateMissing(entity, populator, cancellationToken); } if (completed) { return; } var isDone = (DateTimeOffset.UtcNow - entity.BuildStateKey.DateTime).TotalDays > DayWindow; if (isDone) { await EnqueueEmailBuild(entity.BuildStateKey, entity.BoundBuildId, cancellationToken); } else { // Wait an hour to retry. Hope that a bug fix is uploaded or jenkins gets back into a good state. await EnqueueProcessBuild(entity.BuildStateKey, entity.BoundBuildId, TimeSpan.FromHours(1), cancellationToken); } }
public async Task StatusRefresh() { var key = BuildStateEntity.GetPartitionKey(DateTimeOffset.UtcNow); var table = _storageAccount.CreateCloudTableClient().GetTableReference(TableNames.BuildState); var query = TableQueryUtil.PartitionKey(key); var list = await AzureUtil.QueryAsync<BuildStateEntity>(table, query); var queue = _storageAccount.CreateCloudQueueClient().GetQueueReference(QueueNames.ProcessBuild); foreach (var entity in list.Where(x => !x.IsDataComplete)) { var buildMessage = new BuildStateMessage(entity.BuildStateKey, entity.BoundBuildId); var queueMessage = new CloudQueueMessage(JsonConvert.SerializeObject(buildMessage)); await queue.AddMessageAsync(queueMessage); } }
private static async Task EnqueueCore(CloudQueue queue, DateTimeKey buildStateKey, BoundBuildId buildId, TimeSpan? delay, CancellationToken cancellationToken) { // Enqueue a message to process the build. Insert a delay if the build isn't finished yet so that // we don't unnecessarily ask Jenkins for information. var buildMessage = new BuildStateMessage() { BuildStateKeyRaw = buildStateKey.Key, BuildNumber = buildId.Number, HostRaw = buildId.Host.ToString(), JobName = buildId.JobName }; var queueMessage = new CloudQueueMessage(JsonConvert.SerializeObject(buildMessage)); await queue.AddMessageAsync( queueMessage, timeToLive: null, initialVisibilityDelay: delay, options: null, operationContext: null, cancellationToken: cancellationToken); }