Esempio n. 1
0
        /// <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);
            }
        }
Esempio n. 2
0
        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);
            }
        }
Esempio n. 3
0
        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);
        }