atlassian의 소프트웨어인 jira에서 이벤트가 발생 시 실시간으로 해당 정보에 대한 내용을 공유받기 위한,
webhook을 설정하려고함.
* 참고로 jira 7.12.0 버전이라서 프로젝트안에서 automation으로 webhook을 구현하는 방식이 여기엔 없다.
일단 jira에 대한 관리 권한이 필요하다.
시스템 - 좌측 메뉴 제일 하단 고급탭 - 웹훅
웹훅 만들기를 진행하면 아래와 같은 화면을 얻을 수 있다.
웹훅의 이름, url, 설명 그리고 어떤 이벤트를 받을 것인가에 대한 상세 설정.
url에서는 추가로 매개변수를 GET 방식으로 받을 수 있다.
웹훅 리스너를 생성하였다. 이제 웹훅을 받을 url 측에서 필요한 작업이 필요하다.
작업에 앞서, 공식 가이드에 의하면 webhook payload의 예시는 아래와 같다.
(공식가이드 : https://developer.atlassian.com/cloud/jira/platform/webhooks/)
{
"issue": {
"id":"99291",
"self":"https://your-domain.atlassian.net/rest/api/2/issue/99291",
"key":"JRA-20002",
"fields":{
"summary":"I feel the need for speed",
"created":"2009-12-16T23:46:10.612-0600",
"description":"Make the issue nav load 10x faster",
"labels":["UI", "dialogue", "move"],
"priority": {
"self": "https://your-domain.atlassian.net/rest/api/2/priority/3",
"iconUrl": "https://your-domain.atlassian.net/images/icons/priorities/minor.svg",
"name": "Minor",
"id": "3"
},
}
},
"user": {
"self":"https://your-domain.atlassian.net/rest/api/2/user?accountId=99:27935d01-92a7-4687-8272-a9b8d3b2ae2e",
"accoundId": "99:27935d01-92a7-4687-8272-a9b8d3b2ae2e",
"accountType": "atlassian",
"avatarUrls":{
"16x16":"https://your-domain.atlassian.net/secure/useravatar?size=small&avatarId=10605",
"48x48":"https://your-domain.atlassian.net/secure/useravatar?avatarId=10605"
},
"displayName":"Bryan Rollins [Atlassian]",
"active" : "true",
"timeZone": "Europe/Warsaw",
},
"changelog": {
"items": [
{
"toString": "A new summary.",
"to": null,
"fromString": "What is going on here?????",
"from": null,
"fieldtype": "jira",
"field": "summary"
},
{
"toString": "New Feature",
"to": "2",
"fromString": "Improvement",
"from": "4",
"fieldtype": "jira",
"field": "issuetype"
}
],
"id": 10124
},
"timestamp": 1606480436302,
"webhookEvent": "jira:issue_updated",
"issue_event_type_name": "issue_generic"
}
일단은 예제인 만큼 간단한 정보만 가공하여 웹에 노출을 하자.
* java,python,php,node 중 현재 가장 짧고 빨리 소스코드로 구현하고 싶어서 php를 예제로 구성함.
<?php
date_default_timezone_set('Asia/Seoul');
$pid = $_GET['projectid'];
$webhookData = file_get_contents("php://input");
// JSON 유효 확인
if (isJson($webhookData)) {
$data = json_decode($webhookData, true);
// 기존 데이터를 읽고 JSON 배열로 시작하는지 확인
$fileName="jira_webhook_".$pid.".json";
$existingData = json_decode(file_get_contents($fileName), true);
if ($existingData === null) {
$existingData = array();
}
$existingData[] = $data;
$mergedJson = json_encode($existingData, JSON_PRETTY_PRINT);
// JSON 데이터를 파일에 적재
file_put_contents($fileName, $mergedJson);
} else {
// JSON 데이터가 유효하지 않음.. webhook이므로 반환값은 없다.
exit;
}
// JSON 데이터가 유효한지 확인하는 함수
function isJson($string) {
json_decode($string);
return json_last_error() === JSON_ERROR_NONE;
}
?>
일단의 흐름은 webhook payload의 정보를 모두 json 파일에 누적 저장한다.
가공은 보여줄 때 하자는 마인드...
그렇다면 보여지는 페이지를 구현하여 정말 간단하게 가공해보자...
<?php
date_default_timezone_set('Asia/Seoul');
$pid = $_GET['pid'];
if($pid!= '') {
$fileNm="webhook_".$pid.".log";
$jsonData = file_get_contents($fileNm);
$data = json_decode($jsonData, true);
echo "<html><body>";
foreach ($data as $event) {
$issueKey = $event['issue']['key'];
$issueSummary = $event['issue']['fields']['summary'];
$issueStatus = $event['issue']['fields']['status']['name'];
$projectName = $event['issue']['fields']['project']['name'];
$issueAssignee = $event['issue']['fields']['assignee']['displayName'];
$issueUpdateTimestamp = date('Y-m-d H:i:s', $event['timestamp'] / 1000);
if($issueKey != ''){
echo '
<h1>['.$projectName .'] ' . $issueKey . '</h1>
<p><strong>이슈명칭:</strong> ' . $issueSummary . '</p>
<p><strong>처리상태:</strong> ' . $issueStatus . '</p>
<p><strong>담 당 자:</strong> ' . $issueAssignee . '</p>
<p><strong>처리시간:</strong> ' . $issueUpdateTimestamp . '</p>
';
}
}
echo "</body></html>";
} else {
echo "Invalid uid param data received.";
}
// JSON 데이터가 유효한지 확인하는 함수
function isJson($string) {
json_decode($string);
return json_last_error() === JSON_ERROR_NONE;
}
?>
대충 프로젝트명, 이슈Key, 이슈명칭, 처리상태, 담당자, 처리시간 만 가져와 화면에 보여주자..
디자인? 없다.. 아무것도 없다.
기록된 데이터를 화면에 뿌려보자.
web hook을 이용하여 연계된 미들웨어를 구성하여 관리하거나, 메일/문자/알림톡 등등
이를 활용할 방안은 무궁무진하다.
지금까지 jira의 webhook 구성에 대해 알아보았다.
레프트 훅~ 라이트 훅~ 웹 훅~
댓글