private string FormatMessageInfoSystem([NotNull] BuildServerExecutionInfo executionInfo) { var msg = ""; if (!string.IsNullOrEmpty(executionInfo.JobDescription)) { msg += executionInfo.JobDescription + "\n\n"; } if (executionInfo.ChangeSet.Any()) { var reRedmineParse = new Regex(@"(#(\d+))(\s|$)"); msg += "<i>Изменения:</i>" + "\n"; foreach (var chengeComment in executionInfo.ChangeSet.Distinct()) { var taskAddress = this.RedmineService.FormatTaskAddress(""); var chStr = reRedmineParse.Replace(chengeComment.EscapeHtml().Trim(), @"<a href=""" + taskAddress + @"$2"">$1</a>$3"); msg += chStr + "\n"; } } return(msg); }
/// <summary> Отформатировать сообщение сборки дампа </summary> /// <remarks> /// Тут изменения не важны. Но важно будет описание джобы, что б вытащить информацию по дампам и базам /// </remarks> private string FormatMessageInfoDump([NotNull] BuildServerExecutionInfo executionInfo) { var msg = ""; if (!string.IsNullOrEmpty(executionInfo.JobDescription)) { //SdFu Db: 208.0.0.135/sdfu //Fl: SdFu.2020.02.09.23.36.04 //Upd: C:\Builds\SdFu\91.rc.19 //dbV: 90 rcV: 91 currV: 92 isRc: false //Inst: C:\Builds\SdFu\90.rc.16 var dbNameMatch = Regex.Match(executionInfo.JobDescription, "Db: (.*?)\\n").Groups[1]; var fileNameMatch = Regex.Match(executionInfo.JobDescription, "Fl: (.*?)\\n").Groups[1]; if (dbNameMatch.Success && fileNameMatch.Success) { msg += "База: <b>" + dbNameMatch.Captures[0] + "</b>\n"; var dmpDateString = fileNameMatch.Captures[0].Value; var dateParseMatch = Regex.Match(dmpDateString, @"[^\.]+\.(?<year>\d+)\.(?<mm>\d+)\.(?<dd>\d+)\.(?<tm>.*)"); if (dateParseMatch.Success) { dmpDateString = dateParseMatch.Groups["dd"].Value + "." + dateParseMatch.Groups["mm"].Value + "." + dateParseMatch.Groups["year"].Value + " (" + dateParseMatch.Groups["tm"].Value + ")"; } msg += "Дамп от: <b>" + dmpDateString + "</b>\n"; } msg += "\n\nПрочая информация:\n" + executionInfo.JobDescription; } return(msg); }
/// <summary> Отформатировать сообщение сборки версии </summary> /// <remarks> /// Тут не важно описание джобы (тем более оно в 99% отсутствует). /// Зато ChageSet форматируется следующим образом: /// 1. Если InProgress: Форматируется как для системы (изменения по git). /// 2. Если Faild: Формируется по задачам redmine + те что без задачи из гита. /// 3. Если Success: Формируется по всем задачам из redmine начиная с последней успешной. /// </remarks> private string FormatMessageInfoBuildApp([NotNull] BuildServerExecutionInfo executionInfo) { var msg = ""; var gitMessages = executionInfo.ChangeSet; if (executionInfo.Status == EnumJobStatus.Success) { var prevFailed = this.JenkinsService.GetAllPrevSuccessInfos(executionInfo); foreach (var ch in prevFailed.SelectMany(x => x.ChangeSet)) { gitMessages.Add(ch); } } if (executionInfo.Status == EnumJobStatus.Success) { var baseClientDirectory = this.Configuration.Projects? .SingleOrDefault(x => x.ProjectName == this.Name)? .ProjectClientDirectory; if (!string.IsNullOrEmpty(baseClientDirectory)) { msg += $"Клиент: \"{baseClientDirectory}{this.VersionCurrent}.00.{executionInfo.JobNum}\""; } } var redmineNums = new HashSet <string>(); var otherMessages = new List <string>(); var reFindRedmineNums = new Regex(@"#(\d+)(\s|\n|$)", RegexOptions.Compiled); foreach (var gitMessage in gitMessages) { var mch = reFindRedmineNums.Match(gitMessage); if (mch.Success) { redmineNums.Add(mch.Groups[1].Value); } else { otherMessages.Add(gitMessage.EscapeHtml().Trim()); } } if (redmineNums.Count != 0) { msg += "<b>Изменения по следующим задачам:</b>\n"; var allRedmineTasks = redmineNums.Select(x => this.RedmineService.TryGetTaskDescription(x)).ToList(); List <RedmineTaskDesc> projectTasks; var externalTasks = new List <RedmineTaskDesc>(); if (this.RedmineProjectName != null) { projectTasks = allRedmineTasks.Where(x => x.Project == this.RedmineProjectName).ToList(); externalTasks = allRedmineTasks.Where(x => x.Project != this.RedmineProjectName).ToList(); } else { projectTasks = allRedmineTasks; } foreach (var taskDesc in projectTasks) { msg += $"<a href=\"{this.RedmineService.FormatTaskAddress(taskDesc.Num)}\">#{taskDesc.Num}</a> {taskDesc.Subject}\n"; } if (externalTasks.Any()) { msg += "\n\n\n<b>Изменения по другим проектам:</b>\n"; foreach (var prj in externalTasks.GroupBy(x => x.Project)) { foreach (var taskDesc in prj.OrderBy(x => x.Num)) { msg += $"{prj.Key} <a href=\"{this.RedmineService.FormatTaskAddress(taskDesc.Num)}\">#{taskDesc.Num}</a> {taskDesc.Subject}\n"; } } } } if (otherMessages.Count != 0) { msg += "\n\n\nДругие комментарии:\n" + string.Join("\n", otherMessages); } return(msg); }