public void SetRetentionPolicies(IEnumerable <Uri> buildDefinitions, BuildRetentionPolicy policies)
        {
            const BuildReason Reason = BuildReason.Triggered | BuildReason.Manual;

            foreach (var bd in this.buildServer.QueryBuildDefinitionsByUri(buildDefinitions.ToArray()))
            {
                UpdateRetentionPolicy(bd, Reason, policies.StoppedKeep, policies.StoppedDeleteOptions, BuildStatus.Stopped);
                UpdateRetentionPolicy(bd, Reason, policies.FailedKeep, policies.FailedDeleteOptions, BuildStatus.Failed);
                UpdateRetentionPolicy(bd, Reason, policies.PartiallySucceededKeep, policies.PartiallySucceededDeleteOptions, BuildStatus.PartiallySucceeded);
                UpdateRetentionPolicy(bd, Reason, policies.SucceededKeep, policies.SucceededDeleteOptions, BuildStatus.Succeeded);
                bd.Save();
            }
        }
        private static void UpdateRetentionPolicy(IBuildDefinition bd, BuildReason reason, int keep, DeleteOptions options, BuildStatus status)
        {
            var rp = bd.RetentionPolicyList.FirstOrDefault(r => r.BuildReason == reason && r.BuildStatus == status);

            if (rp == null)
            {
                bd.AddRetentionPolicy(reason, BuildStatus.Stopped, keep, options);
            }
            else
            {
                rp.NumberToKeep  = keep;
                rp.DeleteOptions = options;
            }
        }
Esempio n. 3
0
        public Microsoft.TeamFoundation.Build.Server.BuildReason ConvertReason(BuildReason reason)
        {
            if (reason <= BuildReason.UserCreated)
            {
                switch (reason)
                {
                case BuildReason.None:
                    return(Microsoft.TeamFoundation.Build.Server.BuildReason.None);

                case BuildReason.Manual:
                    return(Microsoft.TeamFoundation.Build.Server.BuildReason.Manual);

                case BuildReason.IndividualCI:
                    return(Microsoft.TeamFoundation.Build.Server.BuildReason.IndividualCI);

                case (BuildReason)3:
                case (BuildReason)5:
                case (BuildReason)6:
                case (BuildReason)7:
                    break;

                case BuildReason.BatchedCI:
                    return(Microsoft.TeamFoundation.Build.Server.BuildReason.BatchedCI);

                case BuildReason.Schedule:
                    return(Microsoft.TeamFoundation.Build.Server.BuildReason.Schedule);

                default:
                    if (reason == BuildReason.UserCreated)
                    {
                        return(Microsoft.TeamFoundation.Build.Server.BuildReason.UserCreated);
                    }
                    break;
                }
            }
            else
            {
                if (reason == BuildReason.ValidateShelveset)
                {
                    return(Microsoft.TeamFoundation.Build.Server.BuildReason.ValidateShelveset);
                }
                if (reason == BuildReason.CheckInShelveset)
                {
                    return(Microsoft.TeamFoundation.Build.Server.BuildReason.CheckInShelveset);
                }
            }
            return(Microsoft.TeamFoundation.Build.Server.BuildReason.Manual);
        }
        public override IList <string> ToMessage(BotElement bot, Func <string, string> transform)
        {
            var formatter = new
            {
                TeamProjectCollection = transform(TeamProjectCollection),
                ProjectName           = transform(ProjectName),
                BuildDefinition       = transform(BuildDefinition),
                BuildStatus           = transform(BuildStatus.ToString()),
                BuildUrl,
                BuildNumber             = transform(BuildNumber),
                BuildReason             = transform(BuildReason.ToString()),
                RequestedFor            = transform(RequestedFor),
                RequestedForDisplayName = transform(RequestedForDisplayName),
                DisplayName             = transform(RequestedForDisplayName),
                StartTime,
                FinishTime,
                UserName      = transform(UserName),
                BuildDuration = FormatBuildDuration(bot),
                DropLocation
            };

            return(new[] { bot.Text.BuildFormat.FormatWith(formatter), transform(BuildStatus.ToString()) });
        }
Esempio n. 5
0
        public override IList <string> ToMessage(BotElement bot, Func <string, string> transform)
        {
            var formatter = new
            {
                TeamProjectCollection   = transform(TeamProjectCollection),
                ProjectName             = transform(ProjectName),
                BuildDefinition         = transform(BuildDefinition),
                BuildStatus             = transform(BuildStatus.ToString()), BuildUrl,
                BuildNumber             = transform(BuildNumber),
                BuildReason             = transform(BuildReason.ToString()),
                RequestedFor            = transform(RequestedForUniqueName),
                RequestedForDisplayName = transform(RequestedForDisplayName),
                DisplayName             = transform(RequestedForDisplayName),
                StartTime,
                FinishTime,
                UserName      = transform(UserName),
                BuildDuration = FormatBuildDuration(bot),
                DropLocation,
                NewValue = NewValue == null ? bot.Text.BuildQualityNotSet : transform(NewValue),
                OldValue = OldValue == null ? bot.Text.BuildQualityNotSet : transform(OldValue),
            };

            return(new[] { bot.Text.BuildQualityChangedFormat.FormatWith(formatter) });
        }
 public IRetentionPolicy AddRetentionPolicy(BuildReason reason, BuildStatus status, int numberToKeep, DeleteOptions deleteOptions)
 {
     throw new NotImplementedException();
 }
        /// <summary>
        /// Request a build
        /// </summary>
        /// <param name="projectName"></param>
        /// <param name="buildDefinitionId"></param>
        /// <param name="reason"></param>
        /// <param name="priority"></param>
        /// <param name="queueId"></param>
        /// <returns></returns>
        public async Task <BuildRequest> RequestBuild(string projectName, int buildDefinitionId, BuildReason reason, BuildPriority priority, int?queueId = null)
        {
            string response = await PostResponse("requests",
                                                 new { definition = new { id = buildDefinitionId }, reason = reason.ToString(), priority = priority.ToString(), queue = new { id = queueId } },
                                                 projectName);

            return(JsonConvert.DeserializeObject <BuildRequest>(response));
        }
 private static void UpdateRetentionPolicy(IBuildDefinition bd, BuildReason reason, int keep, DeleteOptions options, BuildStatus status)
 {
     var rp = bd.RetentionPolicyList.FirstOrDefault(r => r.BuildReason == reason && r.BuildStatus == status);
     if (rp == null)
     {
         bd.AddRetentionPolicy(reason, BuildStatus.Stopped, keep, options);
     }
     else
     {
         rp.NumberToKeep = keep;
         rp.DeleteOptions = options;
     }
 }
Esempio n. 9
0
 /// <summary>
 /// Request a build
 /// </summary>
 /// <param name="projectName"></param>
 /// <param name="buildDefinitionId"></param>
 /// <param name="reason"></param>
 /// <param name="priority"></param>
 /// <param name="queueId"></param>
 /// <returns></returns>
 public async Task<BuildRequest> RequestBuild(string projectName, int buildDefinitionId, BuildReason reason, BuildPriority priority, int? queueId = null)
 {
     string response = await PostResponse("requests",
         new { definition = new { id = buildDefinitionId }, reason = reason.ToString(), priority = priority.ToString(), queue = new { id = queueId } },
         projectName);
     return JsonConvert.DeserializeObject<BuildRequest>(response);
 }
Esempio n. 10
0
 public IRetentionPolicy AddRetentionPolicy(BuildReason reason, BuildStatus status, int numberToKeep, DeleteOptions deleteOptions)
 {
     throw new NotImplementedException();
 }
Esempio n. 11
0
 public Microsoft.TeamFoundation.Build.Server.BuildReason ConvertReason(BuildReason reason)
 {
     if (reason <= BuildReason.UserCreated)
     {
         switch (reason)
         {
             case BuildReason.None:
                 return Microsoft.TeamFoundation.Build.Server.BuildReason.None;
             case BuildReason.Manual:
                 return Microsoft.TeamFoundation.Build.Server.BuildReason.Manual;
             case BuildReason.IndividualCI:
                 return Microsoft.TeamFoundation.Build.Server.BuildReason.IndividualCI;
             case (BuildReason)3:
             case (BuildReason)5:
             case (BuildReason)6:
             case (BuildReason)7:
                 break;
             case BuildReason.BatchedCI:
                 return Microsoft.TeamFoundation.Build.Server.BuildReason.BatchedCI;
             case BuildReason.Schedule:
                 return Microsoft.TeamFoundation.Build.Server.BuildReason.Schedule;
             default:
                 if (reason == BuildReason.UserCreated)
                 {
                     return Microsoft.TeamFoundation.Build.Server.BuildReason.UserCreated;
                 }
                 break;
         }
     }
     else
     {
         if (reason == BuildReason.ValidateShelveset)
         {
             return Microsoft.TeamFoundation.Build.Server.BuildReason.ValidateShelveset;
         }
         if (reason == BuildReason.CheckInShelveset)
         {
             return Microsoft.TeamFoundation.Build.Server.BuildReason.CheckInShelveset;
         }
     }
     return Microsoft.TeamFoundation.Build.Server.BuildReason.Manual;
 }
        public override async Task ExecuteAsync()
        {
            StringBuilder notificationMarkdown           = new();
            string        buildUrl                       = string.Empty;
            Dictionary <string, TaskResult?> taskResults = Options.TaskNames
                                                           .ToDictionary(name => name, name => (TaskResult?)null);
            Dictionary <string, string> buildParameters = new();
            BuildResult overallResult = BuildResult.Succeeded;
            BuildReason buildReason   = BuildReason.None;
            string?     correlatedQueueNotificationUrl = null;

            if (!Options.IsDryRun)
            {
                (Uri baseUrl, VssCredentials credentials) = Options.AzdoOptions.GetConnectionDetails();
                using (IVssConnection connection = _connectionFactory.Create(baseUrl, credentials))
                    using (IProjectHttpClient projectHttpClient = connection.GetProjectHttpClient())
                        using (IBuildHttpClient buildClient = connection.GetBuildHttpClient())
                        {
                            TeamProject project = await projectHttpClient.GetProjectAsync(Options.AzdoOptions.Project);

                            TeamFoundation.Build.WebApi.Build build = await buildClient.GetBuildAsync(project.Id, Options.BuildId);

                            buildUrl    = build.GetWebLink();
                            buildReason = build.Reason;

                            // Get the build's queue-time parameters
                            if (build.Parameters is not null)
                            {
                                JObject parametersJson = JsonConvert.DeserializeObject <JObject>(build.Parameters);
                                foreach (KeyValuePair <string, JToken?> pair in parametersJson)
                                {
                                    buildParameters.Add(pair.Key, pair.Value?.ToString() ?? string.Empty);
                                }
                            }

                            overallResult = await GetBuildTaskResultsAsync(taskResults, buildClient, project);

                            correlatedQueueNotificationUrl = await GetCorrelatedQueueNotificationUrlAsync();
                        }
            }

            notificationMarkdown.AppendLine($"# Publish Results");
            notificationMarkdown.AppendLine();

            WriteSummaryMarkdown(notificationMarkdown, buildUrl, overallResult, buildReason, correlatedQueueNotificationUrl);
            notificationMarkdown.AppendLine();

            WriteTaskStatusesMarkdown(taskResults, notificationMarkdown);
            notificationMarkdown.AppendLine();

            WriteBuildParameters(buildParameters, notificationMarkdown);
            notificationMarkdown.AppendLine();

            WriteImagesMarkdown(notificationMarkdown);

            await _notificationService.PostAsync(
                $"Publish Result - {Options.SourceRepo}/{Options.SourceBranch}",
                notificationMarkdown.ToString(),
                new string[]
            {
                NotificationLabels.Publish,
                NotificationLabels.GetRepoLocationLabel(Options.SourceRepo, Options.SourceBranch)
            }.AppendIf(NotificationLabels.Failure, () => overallResult == BuildResult.Failed),
                Options.GitOptions.GetRepoUrl().ToString(),
                Options.GitOptions.AuthToken,
                Options.IsDryRun);
        }
        private void WriteSummaryMarkdown(
            StringBuilder notificationMarkdown, string buildUrl, BuildResult overallResult, BuildReason buildReason, string?correlatedQueueNotificationUrl)
        {
            notificationMarkdown.AppendLine($"## Summary");
            notificationMarkdown.AppendLine();
            notificationMarkdown.AppendLine($"**Repo** - {Options.SourceRepo}");
            notificationMarkdown.AppendLine($"**Branch** - {Options.SourceBranch}");
            notificationMarkdown.AppendLine($"**Overall Result** - {ToEmoji(overallResult)} {overallResult}");
            notificationMarkdown.AppendLine($"**Reason** - {buildReason}");
            notificationMarkdown.AppendLine($"**Build** - [{Options.BuildId}]({buildUrl})");

            if (correlatedQueueNotificationUrl is not null)
            {
                notificationMarkdown.AppendLine($"**Queued by** - [{correlatedQueueNotificationUrl}]({correlatedQueueNotificationUrl})");
            }
        }