Jira - Github PR Review 연동하기
개요
Jira에서 이슈를 생성하고, Automation으로 깃허브에서 특정 트리거가 되었을 때 이슈의 상태가 변경되게 구현할 수 있다. 하지만 Jira에서 제공하는 것은 PR 생성, 머지, 커밋 생성 등 한계가 분명하다.
이에 본인은 이슈와 연결된 PR에서 리뷰가 등록되었을 때 Automation에서 인식이 가능하도록 구현하고 싶었고, 해당 글은 그 방법을 소개하는 글이다.
워크플로를 소개합니다
위와 같은 형식의 워크플로를 구성했다. PULL REQUEST 상태일 때 CODE REVIEW의 상태로 이동할 수 있다.
Jira Automation
위와 같이 Automation을 작성해준다. 여기서 첫 번째 컴포넌트에서 나오는 Webhook URL을 기억해두자.
깃허브 설정
리뷰 작성시 트리거 기능은 Jira에서 제공해주지 않는 기능이기에 Github Webhook을 활용해야 한다.
본인은 재직중인 회사에서 사용중인 Organization의 설정에서 웹훅을 하나 만들고, 아래와 같은 설정을 적용해줬다.
여기서 Pull request reviews만 선택해줬다.
또한 웹훅 Payload URL을 설정해줘야 하는데, 여기에는 아까 Jira Automation에서 알려주는 URL이 아닌 AWS Lambda URL을 넣어줄 것이다. 그 이유는 아래와 같다.
AWS Lambda
Lambda를 사용한 이유는, Github Webook으로 전달되는 정보에는 Jira의 Issue Number가 정확하게 특정되지 않기 때문에 그 Issue Number를 추출해서 Jira의 Automation으로 넘겨주기 위함이다.
import json
import os
import re
import urllib3
http = urllib3.PoolManager()
jira_webhook_url = os.environ["JIRA_WEBHOOK_URL"]
valid_states = ["APPROVED", "CHANGES_REQUESTED", "COMMENTED"]
# 원하는 리뷰 상태를 넣어주면 특정 상태에만 트리거가 작동함.
def parse_jira_ticket_ids(text: str):
return re.findall(r'`([^`]*)`', text)
# ``안의 코드를 추출하기 위함. ex) "`ISSUE-1` 프로젝트 세팅"에서 ISSUE-1을 추출함.
def missing_attribute(attr: str):
return {
"statusCode": 400,
"body": f"Missing attribute: {attr}"
}
def lambda_handler(event, context):
body = event["body"] if "body" in event else event
if isinstance(body, str):
body = json.loads(event['body'])
title = body.get("pull_request", {}).get("title", "")
if title == "":
return missing_attribute("pull_request.title")
state = body.get("review", {}).get("state", "")
if state == "":
return missing_attribute("review.state")
state = state.upper()
issues = parse_jira_ticket_ids(title)
if len(issues) and state in valid_states:
data = {"issues": issues, "data": {"state": state}}
encoded_data = json.dumps(data).encode('utf-8')
http.request("POST", jira_webhook_url, body=encoded_data, headers={"Content-Type": "application/json"})
return {"statusCode": 200}
위와 같은 코드를 베이스로 Lambda 함수를 작성하고, 함수 URL을 만들어서 위의 Github Webhook Payload URL에 넣어주었다.
마무리
이후 특정 Issue와 연결된 PR에서 리뷰를 작성하면 그 특정 Issue의 상태가 CODE REVIEW로 변하는 것을 확인할 수 있을 것이다.