В этой части нашего исследования мы поговорим о том, как настроить Jira выполнять автоматические действия, которые упрощают эксплуатацию системы управления задачами, настройку данной системы производят DevOps администраторы.nnПервое, с чем сталкиваешься при внедрении любой системы управления задачами или сервис –деск – это отсутствием времени на заведение задач в систему. Но по сути каждый это и так делает, когда описывает задачу для подчиненного в электронной почте, чате или просто пишет план на бумаге. Как можно упростить процесс создания задачи? С точки зрения автора достаточно удобным и применимым к различным сценариям использования является создание задачи из электронного письма.n
Давайте настроим эту возможность.
В первую очередь нужно создать почтовый ящик для Jira, на который будут приходить сообщения.nnСледующим этапом в меню System – Incoming Mail добавить mail server. Для этого нужно иметь стандартные настройки для подключения: сервер imap, порт, логин и пароль от почтового ящика.nnПосле того, как настроен сервер приема почты, нужно добавить mail handler для нашего проекта.nnЭто делается в 2 шага: на первом мы указываем имя для mailHandler, mail сервер, задержку проверки почтового ящика, что нужно сделать из полученного письма. Можно сделать задачу, комментарий, можно из первого письма с определенной темой делать задачу, а из последующих комментарии и еще несколько вариантов.nnnnНа втором шаге задаются остальные настройки обработки сообщения и задачи.nnКомментарии к полям говорят сами за себя.nnnnНажатием на кнопку тест проверяем настройки и при успешном результате добавляем MailHandler.nnnnПроверим задачи проекта и увидим, что из отправленного письма создалась новая задача с указанными в настройках параметрами.nnnnnnПерейдем к следующей полезной автоматизации. Выполнение каждой задачи должно контролироваться автором. Настроим автоматическое переназначение задачи, если был установлен статус done.nnДля этого нужно выбрать Workflow проекта. Включить его редактирование.nnnnКликнуть на переход в Done. И добавить пост-функцию «Assign to Reporter». После этого переход в Done выглядит так:nnПосле этого нужно опубликовать новую версиюworkflow нажатием PublishDraft. И наш Workflow снова в работе.nnА ниже будет я покажу, как сделать полезную автоматизацию на основе полученных знаний и небольших заготовок. В качестве примера я буду использовать процесс плановой проверки состояния сервера, подобно такой, которая ежемесячно выполняется на серверах в зоне обслуживания нашей компании.nnИтак, на каждом подконтрольном сервере планировщиком задач выполняется скрипт, который собирает параметры, позволяющие оценить состояние здоровья сервера и отправляет его на определенный e-mail. В моем случае скрипт работает на PowerShell, что позволяет собирать инфо с Windows серверов и не только ;). Как вы уже догадались – скрипт отправляет письмо на e-mail Jira, которая в свою очередь создает задачу по обслуживанию которое требуется исходя из того, что собрал скрипт. Технический специалист, получив задачу обработав результат работы скрипта приступает к обслуживанию сервера, при этом задача переводится в состояние inProgress. Когда обслуживание закончено (или приостановлено), задача переводится в Resolved (или Open). На время работы с сервером система мониторинга приостанавливает оповещения об изменении состояния сервера.nnТеперь о тонкостях реализации. Во-первых, под эту реализацию создается отдельный тип задачи: Operation. Для этого Типа создается свой workflow из копии основного. Для того, чтобы создать задачу типа Operation (для выделения ее из остального потока задач) с помощью потового сообщения создается дополнительный MailHandler. Для того, чтобы создать новый MailHandler, нужен новый e-mail адрес, в связи с чем создаем алиас для нашего почтового ящика Jira.nnnn nnВсе вышесказанное мы уже проделывали. Jira успешно получает задачу. Как же настроить в jira для управления системой мониторинга? Для этого мы будем использовать webHooks. ВебХуки – это вызов некоторого URL, при появлении определенного события. В нашем случае – это будет переход из одного статуса в другой. Jira Делает POST запрос на указанный URL и в качестве параметров передает в виде JSONсодержимое всех полей задачи. Выглядит это вот так:n
{"transition":{n"workflowId":10001,n"workflowName":"KOT: Project Management Workflow",n"transitionId":11,n"transitionName":"Start Progress",n"from_status":"To Do",n"to_status":"In Progress"},n"comment":"",n"user":{n"self":"http://192.168.100.100:8080/rest/api/2/user?username=root",n"name":"root",n"key":"root",n"emailAddress":"[email protected]",n"avatarUrls":{n"48x48":"http://www.gravatar.com/avatar/949e07b4006ecaa6a8a6ae62031e50f8?d=mm&s=48",n"24x24":"http://www.gravatar.com/avatar/949e07b4006ecaa6a8a6ae62031e50f8?d=mm&s=24",n"16x16":"http://www.gravatar.com/avatar/949e07b4006ecaa6a8a6ae62031e50f8?d=mm&s=16",n"32x32":"http://www.gravatar.com/avatar/949e07b4006ecaa6a8a6ae62031e50f8?d=mm&s=32"},n"displayName":"root",n"active":true,n"timeZone":"Europe/Minsk"},n"issue":{n"id":"10001",n"self":"http://192.168.100.100:8080/rest/api/2/issue/10001",n"key":"KOT-2",n"fields":{n"issuetype":{n"self":"http://192.168.100.100:8080/rest/api/2/issuetype/10000",n"id":"10000",n"description":"A task that needs to be done.",n"iconUrl":"http://192.168.100.100:8080/secure/viewavatar?size=xsmall&avatarId=10318&avatarType=issuetype",n"name":"Task",n"subtask":false,n"avatarId":10318},n"components":[],n"timespent":null,n"timeoriginalestimate":null,n"description":"This is an OperationResults from server\n[Created via e-mail received from: [email protected]]",n"project":{n"self":"http://192.168.100.100:8080/rest/api/2/project/10000",n"id":"10000",n"key":"KOT",n"name":"Kotel",n"avatarUrls":{n"48x48":"http://192.168.100.100:8080/secure/projectavatar?avatarId=10324",n"24x24":"http://192.168.100.100:8080/secure/projectavatar?size=small&avatarId=10324",n"16x16":"http://192.168.100.100:8080/secure/projectavatar?size=xsmall&avatarId=10324",n"32x32":"http://192.168.100.100:8080/secure/projectavatar?size=medium&avatarId=10324"}},n"fixVersions":[],n"aggregatetimespent":null,n"resolution":null,n"timetracking":{},n"customfield_10005":null,n"security":{n"self":"http://192.168.100.100:8080/rest/api/2/securitylevel/10000",n"id":"10000",n"description":"",n"name":"myISL_Standard"},n"attachment":[],n"aggregatetimeestimate":null,n"resolutiondate":null,n"workratio":-1,n"summary":"192.168.100.100",n"lastViewed":"2017-02-23T11:07:52.304+0300",n"watches":{"self":"http://192.168.100.100:8080/rest/api/2/issue/KOT-2/watchers",n"watchCount":1,n"isWatching":false},n"creator":{n"self":"http://192.168.100.100:8080/rest/api/2/user?username=Tanya",n"name":"Tanya",n"key":"tanya",n"emailAddress":"[email protected]",n"avatarUrls":{n"48x48":"http://www.gravatar.com/avatar/0d37e22d23874568b47d8d5760caa455?d=mm&s=48",n"24x24":"http://www.gravatar.com/avatar/0d37e22d23874568b47d8d5760caa455?d=mm&s=24",n"16x16":"http://www.gravatar.com/avatar/0d37e22d23874568b47d8d5760caa455?d=mm&s=16",n"32x32":"http://www.gravatar.com/avatar/0d37e22d23874568b47d8d5760caa455?d=mm&s=32"},n"displayName":"Tanya",n"active":true,n"timeZone":"Europe/Minsk"},n"subtasks":[],n"created":"2017-02-22T17:22:46.000+0300",n"reporter":{n"self":"http://192.168.100.100:8080/rest/api/2/user?username=Tanya",n"name":"Tanya",n"key":"tanya",n"emailAddress":"[email protected]",n"avatarUrls":{n"48x48":"http://www.gravatar.com/avatar/0d37e22d23874568b47d8d5760caa455?d=mm&s=48",n"24x24":"http://www.gravatar.com/avatar/0d37e22d23874568b47d8d5760caa455?d=mm&s=24",n"16x16":"http://www.gravatar.com/avatar/0d37e22d23874568b47d8d5760caa455?d=mm&s=16",n"32x32":"http://www.gravatar.com/avatar/0d37e22d23874568b47d8d5760caa455?d=mm&s=32"},n"displayName":"Tanya",n"active":true,n"timeZone":"Europe/Minsk"},n"customfield_10000":"0|i00007:",n"aggregateprogress":{"progress":0,"total":0},n"priority":{n"self":"http://192.168.100.100:8080/rest/api/2/priority/3",n"iconUrl":"http://192.168.100.100:8080/images/icons/priorities/medium.svg",n"name":"Medium",n"id":"3"},n"customfield_10001":null,n"labels":[],n"environment":null,n"timeestimate":null,n"aggregatetimeoriginalestimate":null,n"versions":[],n"duedate":null,n"progress":{"progress":0,"total":0},n"comment":{"comments":[],"maxResults":0,"total":0,"startAt":0},n"issuelinks":[],n"votes":{"self":"http://192.168.100.100:8080/rest/api/2/issue/KOT-2/votes","votes":0,"hasVoted":false},n"worklog":{"startAt":0,"maxResults":20,"total":0,"worklogs":[]},n"assignee":{n"self":"http://192.168.100.100:8080/rest/api/2/user?username=Viktor",n"name":"Viktor",n"key":"viktor",n"emailAddress":"[email protected]",n"avatarUrls":{n"48x48":"http://www.gravatar.com/avatar/d43295ac8667d114113a8d5b4f21a6bf?d=mm&s=48",n"24x24":"http://www.gravatar.com/avatar/d43295ac8667d114113a8d5b4f21a6bf?d=mm&s=24",n"16x16":"http://www.gravatar.com/avatar/d43295ac8667d114113a8d5b4f21a6bf?d=mm&s=16",n"32x32":"http://www.gravatar.com/avatar/d43295ac8667d114113a8d5b4f21a6bf?d=mm&s=32"},n"displayName":"Viktor","active":true,"timeZone":"Europe/Minsk"},n"updated":"2017-02-22T17:22:46.000+0300",n"status":{n"self":"http://192.168.100.100:8080/rest/api/2/status/10000",n"description":"",n"iconUrl":"http://192.168.100.100:8080/images/icons/status_generic.gif",n"name":"To Do",n"id":"10000",n"statusCategory":{n"self":"http://192.168.100.100:8080/rest/api/2/statuscategory/2",n"id":2,n"key":"new",n"colorName":"blue-gray",n"name":"To Do"}}}},n"timestamp":1487837272429}n
Огого, скажете Вы. Вот и я думаю, что с этим должен кто-то справиться. Но у меня нет стороннего ПО и каких-либо утилит готовых обработать полученную информацию, поэтому я решила написать небольшой php-скрипт. Суть его работы в том, что он вытаскивает нужную информацию из полученных данных, и передает ее на вход другого cmd-скрипта, запуск которого требуется в том или ином случае. В нашем примере, получив содержимое задачи, из него нужно выбрать всего несколько полей transition.transitionName, Issue.Summary и issue.IssueType.Name. Если issue.IssueType.Name = Operation AND transition.transitionName = StartProgress, то перейти по ссылке, которую сформировать для отключения уведомлений с использованием поля Issue.Summary. В Issue.Summary наш ps-скрипт, который собирал параметры здоровья сервера, вписал имя исследуемого хоста (в том виде, в котором хост заведен в систему мониторинга). В моей инфраструктуре используется Nagios. Зная имя хоста, к Nagios можно обратиться по http и отключить уведомления. Для этого используется следующий URL.n
http://my_nagios_server/nagios/cgi-bin//cmd.cgi?cmd_typ=11&host=my_hostname_from_task&cmd_mod=2btnSubmit=Commit
Для включения уведомлений используется cmd_typ=12. Для того, чтобы это заработало необходимо правильно настроить авторизацию в Nagios и разрешения доступа к cmd.cgi. Однако это остается за рамками данной статьи.nnИтак, задача php-скрипта, который «скрывается» за URL вызываемый Jira, распарсить передаваемый в него JSON и вызвать утилиту командной строки с нужными параметрами. Таким образом, решается не только задача отключения уведомлений системы мониторинга, но и другие автоматизации. Например, мне нужно автоматически создавать проекты в Jira c определенными параметрами. Есть cmd-скрипт который это делает. Добавляем эту возможность в php-скрипт. А дальше просто создаем задачи с правильными параметрами. Конечно, скрипт – это не панацея. Есть и другие продукты, с которыми подобным образом можно интегрировать Jira. Например, таким же образом работает один из плагинов, позволяющий отправлять СМС из Jira. Есть и другие решения. Однако, моей задачей было, наглядно показать, как это работает. Мне кажется получилось удачно.nnДальше сугубо исполнение.nnSystem- Advanced –WebHooks. Таким получился наш веб-хук.nnnnНастраиваем post-function внутри workflow. (На скриншоте выше видно, что они уже настроены. Это — чтобы не загромождать статью однотипными картинками.)n
Необходима настройка и интеграция JIRA, обращайтесь [email protected]