본문 바로가기
Web

atlassian / jira software webhook setting. (지라 웹훅)

by 모닝위즈 2023. 11. 9.
반응형

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 구성에 대해 알아보았다.

 

레프트 훅~ 라이트 훅~ 웹 훅~ 

댓글