示例#1
0
        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);
        }
示例#2
0
        /// <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");
        }
示例#3
0
        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;
        }
示例#4
0
        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
                }
            }
        }