public static async Task <Comment> CreateComment(IssueRef issue, string caseComment) { IJiraClient jira = new JiraClient("https://accelaeng.atlassian.net/", "*****@*****.**", "peter.peng"); var jiraComments = jira.GetComments(issue); bool isFound = false; Comment jiraComment = null; foreach (Comment temp in jiraComments) { if (temp.body.Equals(caseComment, System.StringComparison.InvariantCultureIgnoreCase)) { jiraComment = temp; isFound = true; break; } } if (!isFound) { jiraComment = jira.CreateComment(issue, caseComment); } return(jiraComment); }
/// <summary> /// Обновить статусы у задач в жире /// </summary> /// <param name="branchName">название бранча</param> /// <param name="branchUrl">урл среды</param> /// <param name="failMessage">сообщение падения</param> /// <param name="url">урл тимсити</param> /// <param name="buildId">номер билда</param> public void UpdateJiraStatus(string branchName, string branchUrl, string failMessage, string url, string buildId) { //список задач ожидающихся в тест var issueListTest = _jiraClient.GetIssuesByQuery(_jiraInfo.ProjectKey, null, "status = \"" + _jiraInfo.TransitionTestName + "\" and resolution = Fixed and cf[11104] = \"" + branchName + "\"").ToList(); //список задач ожидающихся в релиз var issueListRelease = _jiraClient.GetIssuesByQuery(_jiraInfo.ProjectKey, null, "status = \"" + _jiraInfo.TransitionReleaseName + "\" and resolution = Fixed and cf[11104] = \"" + branchName + "\"").ToList(); if (failMessage == null) { //переводим в тест var tranTest = new Transition { id = _jiraInfo.TransitionTestId, fields = new { environment = branchUrl } }; foreach (var issue in issueListTest) { _jiraClient.TransitionIssue(issue, tranTest); Console.WriteLine("Задача " + issue.key + " переведена в тест"); } //переводим в релиз var tranRelease = new Transition { id = _jiraInfo.TransitionReleaseId, fields = new { environment = branchUrl } }; foreach (var issue in issueListRelease) { _jiraClient.TransitionIssue(issue, tranRelease); Console.WriteLine("Задача " + issue.key + " переведена в релиз"); } } //билд упал - переводим задачи Fixed в develop else { //переводим в develop var tranTest = new Transition { id = _jiraInfo.TransitionFailedTestId }; foreach (var issue in issueListTest) { _jiraClient.TransitionIssue(issue, tranTest); _jiraClient.CreateComment(issue, "Билд упал. Cообщение об ошибке: " + failMessage + Environment.NewLine + url + "/viewLog.html?buildId=" + buildId); Console.WriteLine("Задача " + issue.key + " переведена в develop"); } //переводим в develop var tranRelease = new Transition { id = _jiraInfo.TransitionFailedReleaseId }; //переводим в develop foreach (var issue in issueListRelease) { _jiraClient.TransitionIssue(issue, tranRelease); _jiraClient.CreateComment(issue, "Билд упал. Cообщение об ошибке: " + failMessage + Environment.NewLine + url + "/viewLog.html?buildId=" + buildId); Console.WriteLine("Задача " + issue.key + " переведена в Failed Build"); } } //список задач ожидающихся в тест в резолюции не fixed var issueListTestNotFixed = _jiraClient.GetIssuesByQuery(_jiraInfo.ProjectKey, null, "status = \"" + _jiraInfo.TransitionTestName + "\" and resolution != Fixed").ToList(); //список задач ожидающихся в релиз в резолюции не fixed var issueListReleaseNotFixed = _jiraClient.GetIssuesByQuery(_jiraInfo.ProjectKey, null, "status = \"" + _jiraInfo.TransitionReleaseName + "\" and resolution != Fixed").ToList(); //Задачи которые в резолюции не фиксед //по умолчанию переводим в тест и в релиз без указания урла //так как для них скорей всего не создавали бранча var tranTestNotFixed = new Transition { id = _jiraInfo.TransitionTestId, fields = new { environment = _jiraInfo.UrlByDefault } }; foreach (var issue in issueListTestNotFixed) { _jiraClient.TransitionIssue(issue, tranTestNotFixed); Console.WriteLine("Задача " + issue.key + " переведена в тест"); } var tranReleaseNotFixed = new Transition { id = _jiraInfo.TransitionReleaseId, fields = new { environment = _jiraInfo.UrlByDefault } }; foreach (var issue in issueListReleaseNotFixed) { _jiraClient.TransitionIssue(issue, tranReleaseNotFixed); Console.WriteLine("Задача " + issue.key + " переведена в релиз"); } //вывод Console.WriteLine( "Перевод задач для бранча " + branchName + " (" + branchUrl + ") :" + Environment.NewLine + issueListTest.Count + " задач было переведено " + (failMessage != null ? "в develop" : "в тест - Fixed") + Environment.NewLine + issueListTestNotFixed.Count + " задач было переведено в тест - не Fixed" + Environment.NewLine + issueListRelease.Count + " задач было переведено " + (failMessage != null ? "в develop" : "в релиз - Fixed") + Environment.NewLine + issueListReleaseNotFixed.Count + " задач было переведено в релиз - не Fixed"); }
public static async Task<Comment> CreateComment(IssueRef issue, string caseComment) { IJiraClient jira = new JiraClient("https://accelaeng.atlassian.net/", "*****@*****.**", "peter.peng"); var jiraComments = jira.GetComments(issue); bool isFound = false; Comment jiraComment = null; foreach (Comment temp in jiraComments) { if (temp.body.Equals(caseComment, System.StringComparison.InvariantCultureIgnoreCase)) { jiraComment = temp; isFound = true; break; } } if (!isFound) { jiraComment = jira.CreateComment(issue, caseComment); } return jiraComment; }
void CheckJira() { using (var repository = new Repository <DbContext>()) //создаю репозиторий для работы с БД { var jira = new JiraClient(jiraParam.Value, userLoginParam.Value, userPasswordParam.Value); //объявляю клиент jira while (true) //бесконечный цикл по проверке тикетов, переданных разработчикам { repository.Create(new Log { Date = DateTime.Now, MessageTipe = "info", Operation = "Начал получать тикеты из фильтра \"" + filterParam.Value + " \"", Exception = "" }); IEnumerable <Issue> issues = null; //список тикетов в Escallation int cnt = 0; //количество тикетов в Escallation try { issues = jira.EnumerateIssuesByQuery(filterParam.Value, null, 0).ToList(); cnt = issues.Count(); } catch (Exception ex) { repository.Create(new Log { Date = DateTime.Now, MessageTipe = "error", Operation = "Не удалось получить тикеты из Jira", Exception = ex.Message }); continue; //прерываю щикл } repository.Create(new Log { Date = DateTime.Now, MessageTipe = "info", Operation = "Получено тикетов " + cnt, Exception = "" }); foreach (var issue in issues) //смотрю все тикеты { try { if (issue.fields.labels.Contains("watch")) //если есть метка watch перехожу к следующему тикету { continue; //прерываю цикл foreach } //здесь уже метки watch у тикета нет var links = issue.fields.issuelinks; //смотрю, есть ли линки у тикета if (links != null) { int countOfLinks = links.Count; //суммарное количество ссылок int countOfClosedLinks = 0; //количество ссылок на закрытые тикеты foreach (var link in links) { var inwardIssue = link.inwardIssue; //есть входящие и исходящие связи в тикете var outwardIssue = link.outwardIssue; if (link.inwardIssue.id != null) //считаем входящие связи с закрытыми тикетами { var ticket = jira.LoadIssue(inwardIssue); if ((!ticket.key.Contains("WAPI") && !ticket.key.Contains("OLAP") && !ticket.key.Contains("ONLINE") && ticket.fields.status.name == "Закрыто") || (ticket.key.Contains("WAPI") && ticket.fields.status.name == "Выпущено") || (ticket.key.Contains("OLAP") && ticket.fields.status.name == "Выпущено") || (ticket.key.Contains("ONLINE") && ticket.fields.status.name == "Выпущено")) { countOfClosedLinks++; } } if (link.outwardIssue.id != null) //считаем исходящие связи с закрытыми тикетами { var ticket = jira.LoadIssue(outwardIssue); if ((!ticket.key.Contains("WAPI") && !ticket.key.Contains("OLAP") && !ticket.key.Contains("ONLINE") && ticket.fields.status.name == "Закрыто") || (ticket.key.Contains("WAPI") && ticket.fields.status.name == "Выпущено") || (ticket.key.Contains("OLAP") && ticket.fields.status.name == "Выпущено") || (ticket.key.Contains("ONLINE") && ticket.fields.status.name == "Выпущено")) { countOfClosedLinks++; } } } if (countOfLinks == countOfClosedLinks) //смотрим что суммарное количество линков равно сумме линков к решёнными и закрытым тикетам { //у тикета нет метода Refresh, поэтому я смотрю, что его статус всё еще Решён if (jira.EnumerateIssuesByQuery("key = " + issue.key, null, 0) .FirstOrDefault() .fields.status.name == "Решено") { continue; } issue.fields.labels.Add("watch"); jira.CreateComment(issue, "Все связанные тикеты на команду разработки были решены или закрыты." + Environment.NewLine + "Необходимо убедиться, что проблема решена и закрыть данный тикет, сообщив пользователю, когда исправление будет в релизе.", new Visibility { type = "role", value = "Service Desk Collaborators" }); repository.Create(new Log { Date = DateTime.Now, MessageTipe = "info", Operation = "Тикету " + issue.key + " добавлена метка watch", Exception = "" }); } } Thread.Sleep(1000); //ждём секунду, чтобы не перенапряч jira } catch (Exception e) { repository.Create(new Log { Date = DateTime.Now, MessageTipe = "error", Operation = "Ошибка при обработке тикета " + issue.key, Exception = e.Message }); } } Thread.Sleep(10000); //ждём 10 секунд, прежде чем снова начать проверять все тикеты в Escalation } } }