이 문서는 Jira Scriptrunner 활용하여 Bitbucket Branch 생성 시 해당 이슈에 댓글 남기기 가이드를 공유하기 위해 작성되었다.
도구명 | Jira, Scriptrunner, Bitbucket |
---|---|
비고 |
Jira Scriptrunner 활용하여 Bitbucket Branch 생성 시 해당 이슈에 댓글 남기기
Scriptrunner REST endpoint 만들기
- Scriptrunner → REST Endpoints → Create REST Endpoint 선택
- Custom endpoint 선택
- 스크립트 내용
33번 줄 'repositoryPush': Scriptrunner rest Endpoint의 주소, {jira_url}/rest/scriptrunner/latest/custom/repositoryPush
64번 줄: Jira Issue에 댓글 남길 Id 입력
import com.onresolve.scriptrunner.runner.rest.common.CustomEndpointDelegate import groovy.json.JsonBuilder import groovy.json.JsonSlurper import groovy.transform.BaseScript import javax.ws.rs.core.MultivaluedMap import javax.ws.rs.core.Response import com.atlassian.jira.issue.Issue import com.atlassian.jira.issue.IssueManager import com.atlassian.jira.issue.MutableIssue import com.atlassian.jira.component.ComponentAccessor import org.apache.log4j.Level import org.apache.log4j.Logger import com.atlassian.applinks.api.ApplicationLinkResponseHandler import com.atlassian.applinks.api.ApplicationLinkService import com.atlassian.applinks.api.application.bitbucket.BitbucketApplicationType import com.atlassian.sal.api.component.ComponentLocator import com.atlassian.sal.api.net.Request import com.atlassian.sal.api.net.Response import com.atlassian.sal.api.net.ResponseException import com.atlassian.sal.api.net.ResponseHandler import java.util.Date import java.text.SimpleDateFormat def log = Logger.getLogger("com.curvc") log.setLevel(Level.DEBUG) @BaseScript CustomEndpointDelegate delegate repositoryPush(httpMethod: "POST") { MultivaluedMap queryParams, String body -> JsonSlurper slurper = new JsonSlurper() Map map = slurper.parseText(body) // 브랜치 생성이 아닌 경우 return if(map.changes.type.toString().equals("[ADD]")&&map.changes.ref.type.toString().equals("[BRANCH]")){ log.info("Branch Created") } else { return } def issueManager = ComponentAccessor.getIssueManager() def userManager = ComponentAccessor.getUserManager() def commentManager = ComponentAccessor.getCommentManager() // 기본 정보들 String projectKey = map.repository.project.key.toString() String repostiroySlug = map.repository.slug.toString() String repostiroyName = map.repository.name.toString() String tempBranchName = map.changes.ref.displayId.toString() String branchName = tempBranchName.substring(1, tempBranchName.size() - 1) String branchCreator = map.actor.displayName //날짜포맷 String tempDate = map.date.toString().split('\\+')[0] Date date = Date.parse("yyyy-MM-dd'T'HH:MM:ss", tempDate) SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy년 MM월 dd일 HH시 MM분") String strDate = simpleDateFormat.format(date) log.info("저장소: " + projectKey + "/" + repostiroySlug + " 저장소명: " + repostiroyName + " Create Branch: " + branchName + " 만든이: " + branchCreator) // Jira issue에 댓글 남길 유저명 String userName = "jk.park" def user = userManager.getUserByName(userName) //댓글 내용 def message = """ 저장소명: ${repostiroyName} 브랜치명: ${branchName} 만든이: ${branchCreator} 생성날짜: ${strDate} """ //연동된 bitbucket과 통신하여 해당되는 Jira Issue 가져오기 def applicationLinkService = ComponentLocator.getComponent(ApplicationLinkService) final def bitbucketLink = applicationLinkService.getPrimaryApplicationLink(BitbucketApplicationType) ComponentAccessor.getJiraAuthenticationContext().setLoggedInUser(user) def authenticatedRequestFactory = bitbucketLink.createImpersonatingAuthenticatedRequestFactory()?: bitbucketLink.createAuthenticatedRequestFactory() authenticatedRequestFactory .createRequest(Request.MethodType.GET, "/rest/api/1.0/projects/MAV/repos/testtest/branches?filterText=" + branchName + "&details=true") .addHeader("Content-Type","application/json") .execute(new ResponseHandler<Response>(){ @Override void handle(Response response) throws ResponseException{ if(response.statusCode != HttpURLConnection.HTTP_OK){ throw new Exception(response.responseBodyAsString) } else{ responseBody = new JsonSlurper().parseText(response.responseBodyAsString) } } }) log.info(responseBody) if(responseBody.size == 0){ log.info("브랜치 조회에 실패했습니다.") return } if(responseBody.values.metadata["com.atlassian.bitbucket.server.bitbucket-jira:branch-list-jira-issues"][0].key.size == 0){ log.info("연동된 Jira Issue가 없습니다.") return } else if(responseBody.values.metadata["com.atlassian.bitbucket.server.bitbucket-jira:branch-list-jira-issues"][0].key.size > 1){ log.info("연동된 Jira Issue가 2개 이상입니다.") return } String issueKey = responseBody.values.metadata["com.atlassian.bitbucket.server.bitbucket-jira:branch-list-jira-issues"][0].key[0] log.info("issue: " + issueKey) def issue = issueManager.getIssueByCurrentKey(issueKey) commentManager.create(issue, user, message, false) log.info("comment Add") return javax.ws.rs.core.Response.ok(new JsonBuilder([success:"comment Add"]).toString()).build(); }
Bitbucket 저장소에서 Webhook 만들기
Webhook은 저장소 단위로만 줄 수 있다. 프로젝트에서는 줄 수 없다.
- Bitbucket 해당 저장소 → Repostiroy Setttings → Webhooks → Create webhooks
- Url: Jira Scriptrunner Endpoint Url
Events: Push 선택
확인
- Webhook을 설정한 저장소에서 신규로 Branch 생성 시 연동된 Issue에 댓글을 남긴다