示例#1
0
        private static async Task ListBuildsFullAsync()
        {
            var server  = new DevOpsServer("dnceng");
            var builds1 = await server.ListBuildsAsync("public", new[] { 15 });

            var builds2 = await server.ListBuildsAsync("public", top : 10);
        }
示例#2
0
        private static async Task Scratch2()
        {
            var server = new DevOpsServer("dnceng", await GetToken("dnceng"));
            var builds = await server.ListBuildsAsync("public", definitions : new[] { 686 }, top : 3000);

            var buildTimes = new List <(int BuildNumber, DateTime StartTime, DateTime EndTime)>();

            GetBuildTimes();

            var firstDay    = buildTimes.Min(x => x.StartTime).Date;
            var lastDay     = DateTime.UtcNow.Date;
            var maxCapacity = GetCapacity();

            Console.WriteLine($"Max capacity is {maxCapacity}");

            void GetBuildTimes()
            {
                using var writer = new StreamWriter(@"p:\temp\builds.csv", append: false);
                writer.WriteLine("Build Number,Start Time, End Time");
                foreach (var build in builds)
                {
                    if (build.FinishTime is null)
                    {
                        continue;
                    }

                    if (!DateTime.TryParse(build.StartTime, out var startTime) ||
                        !DateTime.TryParse(build.FinishTime, out var endTime))
                    {
                        continue;
                    }

                    writer.WriteLine($"{build.Id},{build.StartTime},{build.FinishTime}");
                    buildTimes.Add((build.Id, startTime, endTime));
                }
            }

            int GetCapacity()
            {
                using var writer = new StreamWriter(@"p:\temp\capacity.csv", append: false);
                writer.WriteLine("Time,Build Count");
                var current = firstDay;
                var max     = 0;

                while (current.Date <= lastDay)
                {
                    var count = buildTimes.Count(x => current >= x.StartTime && current <= x.EndTime);
                    if (count > max)
                    {
                        max = count;
                    }

                    writer.WriteLine($"{current},{count}");
                    current = current.AddMinutes(15);
                }

                return(max);
            }
        }
示例#3
0
        public async Task UpdateDatabaseAsync(int?top = null)
        {
            var builds = await DevOpsServer.ListBuildsAsync(ProjectName, top : top);

            foreach (var build in builds)
            {
                try
                {
                    await UploadBuild(build);
                }
                catch (Exception ex)
                {
                    Logger.LogError($"Unable to upload {build.Id}: {ex.Message}");
                }
            }
        }
示例#4
0
 public async Task <List <Build> > ListBuildsAsync(int top) => await DevOpsServer.ListBuildsAsync(ProjectName, new[] { BuildDefinitionId }, top : top);
示例#5
0
        private static async Task ListStaleChecks()
        {
            var gitHub = new GitHubClient(new ProductHeaderValue("MyAmazingApp"));

            gitHub.Credentials = new Credentials(await GetToken("github"));
            var apiConnection = new ApiConnection(gitHub.Connection);
            var checksClient  = new ChecksClient(apiConnection);
            var server        = new DevOpsServer("dnceng");
            var list          = new List <string>();

            foreach (var build in await server.ListBuildsAsync("public", new[] { 196 }, top: 500))
            {
                if (build.Status == BuildStatus.Completed &&
                    build.Reason == BuildReason.PullRequest &&
                    build.FinishTime is object &&
                    DateTimeOffset.UtcNow - DateTimeOffset.Parse(build.FinishTime) > TimeSpan.FromMinutes(5))
                {
                    try
                    {
                        Console.WriteLine($"Checking {build.Repository.Id} {build.SourceVersion}");
                        // Build is complete for at  least five minutes. Results should be available
                        var name          = build.Repository.Id.Split("/");
                        var pullRequestId = int.Parse(build.SourceBranch.Split("/")[2]);
                        var prUri         = $"https://github.com/{build.Repository.Id}/pull/{pullRequestId}";
                        var repository    = await gitHub.Repository.Get(name[0], name[1]);

                        var pullRequest = await gitHub.PullRequest.Get(repository.Id, pullRequestId);

                        if (pullRequest.MergeableState.Value == MergeableState.Dirty ||
                            pullRequest.MergeableState.Value == MergeableState.Unknown)
                        {
                            // There are merge conflicts. This seems to confuse things a bit below.
                            continue;
                        }

                        // Need to use the HEAD of the PR not Build.SourceVersion here. The Build.SourceVersion
                        // is the HEAD of the PR merged into HEAD of the target branch. The check suites only track
                        // the HEAD of PR
                        var response = await checksClient.Suite.GetAllForReference(repository.Id, pullRequest.Head.Sha);

                        var devOpsResponses = response.CheckSuites.Where(x => x.App.Name == "Azure Pipelines").ToList();
                        var allDone         = devOpsResponses.All(x => x.Status.Value == CheckStatus.Completed);
                        if (!allDone)
                        {
                            // There are merge conflicts. This seems to confuse things a bit below.
                            Console.WriteLine($"\t{DevOpsUtil.GetBuildUri(build)}");
                            Console.WriteLine($"\t{prUri}");
                            list.Add(prUri);
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }
            }

            foreach (var uri in list.ToHashSet())
            {
                Console.WriteLine(uri);
            }
        }
示例#6
0
 public async Task <List <Build> > ListBuildsAsync(int?top = null) =>
 await DevOpsServer.ListBuildsAsync(ProjectName, definitions : new[] { RoslynSignedBuildDefinitionId }, top : top, queryOrder : BuildQueryOrder.FinishTimeDescending);