위 처럼 찾아보는 과정에서 LuceneSearch 쪽 업데이트가 있어 함수 변경이 있었습니다. 그 업데이트가 Jira 8.0 버전으로 올라가면서 반영된 것 같습니다. ScriptRunner는 Jira 8.0을 지원한다고 했지만 문서는 아직 지원하지 않는 것 같네요. (…)
Automate issue escalation with escalation services. Use a JQL query to define processes for modifying issues based on elapsed time. Specify actions (such as transitions) to occur at defined intervals after a specified time has passed.
에스컬레이션 서비스를 통해 문제 에스컬레이션 자동화 JQL 쿼리를 사용하여 경과된 시간을 기준으로 문제를 수정하는 프로세스를 정의하십시오. 지정된 시간이 경과한 후 정의된 간격으로 발생할 작업(예: 전환)을 지정하십시오. - with Papago
JQL로 검색한 쿼리들을 일정 시간마다 특정 값을 설정하거나 transition(전환) 할 수 있는 기능입니다. 예를 들면, 2주 동안 변경이 없는 이슈들의 상태를 변경할 수 있겠죠. (혹은 특정 필드를 수정하거나)
입력해야하는 항목은 아래와 같이 많지 않습니다.
Description: 설정에 대한 설명을 적습니다.
JQL Query: 변경하고자하는 이슈를 가져오기 위해 JQL을 작성합니다.
AS User: 어떤 유저로 변경할 것인지 설정합니다.
Interval/CRON Expression: 얼마나 자주 실행할 것인지 설정합니다. 기본적으로 분 단위로 설정할 수 있습니다.
Action: Transition을 설정할 수 있습니다. 반드시 설정해야하는 항목은 아닙니다.
Additional issue actions: 댓글을 달거나 Resolution을 설정할 수 있습니다. groovy 코드로 작성해야합니다.
Show examples를 보고 작성해보는 것을 추천합니다.
Transition Options: Permissions, Validators, Conditions 확인하는 것을 건너뛸 것인지 설정합니다.
수시로 확인해서 상태를 업데이트하거나 이슈의 항목을 수정해야하는 일이 있다면 사용하기 좋을 것 같습니다. 다만 As User로 설정한 유저의 권한을 잘 확인하여 transition할 수 있는 권한이 있는지 확인해주세요. (방금 테스트해보았는데 권한없는 동작을 하려할 경우 아예 변경이 진행되지 않습니다.)
쭉 내려보면 많은 함수들을 볼 수 있습니다. 함수에 대한 더 자세한 내용을 보려면 위에 있는 jql-functions 링크를 참고하세요.
ScriptRunner 소개 마무리
4개의 포스트로 소개 문서를 마무리하고자 합니다. 많은 내용들을 찾아보고 테스트 삼아 만들어보느라 시간이 오래걸리기도 했네요. 설정하면서 많이 배웠고 실제 프로젝트에서도 적용해볼만한 내용들이 많았습니다. 다른 JIRA를 사용하는 분들께도 필요한 내용이 있으면 다른 포스트에서 짧게 사용할만한 것들 남겨두겠습니다. :)
코드의 설명 내용은 공식 문서에 나와있으나 짧게 설명해보겠습니다. (영어로 되어있어 한국어로 설명할 겸..!)
이 줄이 코드는 스크립트가 엔드포인트로 사용할 수 있도록 하는 코드입니다. 엔드포인트를 사용하고자 한다면 꼭 필요한 코드입니다.
REST 엔드포인트의 이름입니다. URL에서 사용할 이름으로 이 코드에서는 doSomething으로 사용될 것입니다.
엔드포인트의 설정으로 HTTP GET, 권한 그룹은 jira-administrators 그룹이 사용할 수 있는 엔드포인트가 됩니다.
메서드 바디에 제공될 파라미터 입니다.
작성된 값은 메서드 바디에 포함되어 javax.ws.rs.core.Response 객체를 반환할 것 입니다.
이렇게 추가하게되면 아래의 링크에 접근하여 데이터를 받을 수 있습니다. <jira_base_url>/rest/scriptrunner/latest/custom/doSomething curl로 테스트해보면 아래와 같이 결과 값이 나올 수 있겠습니다. (admin:admin는 username:password 값을 입력하면 됩니다.)
Use script fragments to customise the user interface and add new functionality to a Jira instance. Use customisable built-in script fragments to display web items, web panels and web sections or to include JavaScript and CSS resources using web resources. All script fragments can be customised, or use the raw XML module to create a fully custom web fragment.
간단히 설명하자면 필요한 Web items, panels, section을 만들 수 있다는 것입니다. XML 설정이나 다른 리소스가 필요할 수는 있으나 팝업, 패널 등을 사용자가 원하는대로 만들 수 있는 기능입니다.
설정을 할 수 있는 메뉴를 하나하나 알아보겠습니다.
Raw xml module
XmlModuleItem Docs xml 코드를 입력하여 원하는 위치에 메뉴를 보여주거나, 버튼들을 보여줄 수 있습니다. 아래 코드로 JIRA 상단 메뉴의 Projects > View all projects > My Projects를 볼 수 있습니다.
1 2 3 4 5 6 7 8
<web-itemkey='link-to-myprojects'name='ScriptRunner generated web item - link-to-myprojects'section='browse_link/project_view_all'weight='50'> <label>My Projects</label> <linklinkId='link-to-myprojects'></link> <tooltip>Show only my projects</tooltip> <iconheight="16"width="16"> <link>/images/icons/print.gif</link> </icon> </web-item>
XML 입력창에 입력만 하면 되긴 하지만 JIRA UI 아이템들이 어떻게 배치되어있는지 알고 작성해야하는 것이 어렵긴합니다.
section에 system.top.navigation.bar이 있는지, <web-item> 태그가 있는지 알기 쉽지 않지만 일단 예제로 따라해보고 다른 web-item, web-section 등의 태그를 알아가야할 것 같습니다.
커스텀한 리소스를 사용할 수 있다는 점에서는 좋은 것 같지만 잘못하면 많이 망가질 수 있다는 생각이 들긴하는 기능입니다.
Create a custom web section
Web Section Docs 웹 섹션(Web section)은 새로운 로케이션 또는 섹션, web-item을 추가할 때 사용할 수 있습니다.
web-item에서 web-section을 사용하고자 한다면, web-section 만들 때 사용했던 key 값을 사용해야합니다.
Constrained create issue dialog
Create Constrained Issue 문서 설명 그대로 가져오자면, Create Constrained Issue -> 제한된 문제 만들기! 제한된 설정 안에서 이슈를 만들 수 있도록 설정할 수 있습니다.
문서에 나온 설명에 따르면,
This can be useful to workflow designers. Imagine a workflow where at one transition the user is required to create a new linked issue. Typically this is done by having a self or any to any transition which will created the linked issue with a post-function. Then the user is required to edit the linked issue further.
Workflow를 디자인, 만들때 유용한 기능입니다. 예를 들면 특정 트랜지션에서 이슈를 링크해야한다던지, 특정 값을 입력해야하는 옵션을 추가할 수 있습니다.
문서에서는 Behaviours와 함께 사용해서 구성한 메뉴를 눌렀을 경우, 새로운 이슈를 만들때 특정 필드를 읽기전용으로 설정하고 필드 값도 미리 설정할 수 있는 것을 보여줍니다.
TODO
이 기능은 설정할 내용이 좀 있어서 나중에 포스트로 깊게 다루는게 좋을 것 같습니다.
Custom web item
Web Item A web-item is a button or link that will appear at your chosen location. 웹 아이템은 버튼 또는 링크로 설정한 위치에서 메뉴로 사용할 수 있습니다.
간단한 예시로 JIRA 상단에 네비게이션 바에 Search the Web 링크를 만들어봅니다.
issue에서 More Actions 메뉴에도 링크를 만들어봅니다.
결과화면은 아래와 같이 나옵니다.
Condition 조건에 따라 웹 아이템이 나오기에 Condition 설정도 필요합니다. 프로젝트로 한정하거나 이슈의 특정 값인지 조건을 사용할 수 있습니다.
차근차근 테스트 삼아 저도 웹 아이템 하나 만들어보겠습니다.
1. web-item을 하나 만들어봅니다.
Menu text는 버튼에 들어갈 텍스트니 적당히 적어줍니다.
Weight 값은 숫자가 작을수록 우선순위가 높습니다.
Condition 값은 어떤 조건에 버튼이 나올지 설정할 수 있습니다.
Do what에는 저는 dialog를 띄우는 테스트를 할 것이라 Run code and display dialog를 선택했습니다.
Link는 REST Endpoint 기능에서 만든 URL을 입력해줍니다. 다음 과정에서 만드는 방법을 보겠습니다.
JIRA 상단의 네비게이션 바 메뉴에서 issues를 눌렀을 때, MY TOP ISSUES 섹션에 스프린트에 있는 자신에게 할당된 이슈 상위 5개가 보입니다. 예시 링크에 있는대로 진행하시면 원하는 결과를 보실 수 있을 겁니다. (스프린트를 사용한다는 가정하에 말이죠)
Show a web panel
Web Panel 커스텀 웹 패널을 만들고 그 영역에 정보를 담을 수 있도록 설정할 수 있습니다.
Location : 설정 코멘트
Key: UI상 ID가 필요하여 사용하는 것으로 보입니다.
Menu text: 보이는 메뉴의 타이틀 문구로 사용됩니다.
Weight: UI 우선순의 값으로, 양수로 설정할 수 있으며 입력하지 않아도 됩니다.
Condition: 해당 패널이 보이는 조건을 설정할 수 있습니다.
Provider class/script: 패널에 들어갈 데이터를 넣어주는 코드를 작성할 수 있습니다.
1 2 3
writer.write("<div style='background-color: yellow; text-align: center'>" + "This project is going to be deprecrated. Please create" + " all issues in the WIDGET project</div>");
Move, Clone 기능을 특정 프로젝트에서 이슈 Operation 목록에서 보이지 않게 함
source control이 필요없는 프로젝트에서 Development panel을 보이지 않게 함
설정을 위해 입력해야하는 값은 많지 않습니다.
Note: script note, 이 설정의 설명을 적는 곳입니다.
Hide what: 어떤 요소를 숨길지 설정합니다. 설정할 수 있는 요소는 web items 들로 리스트는 굉장히 많습니다.
com.atlassian.jira.plugin.system.issueoperations:* - 이슈 관련 UI 요소
com.pyxis.greenhopper.jira:board-* - board 관련 UI 요소
Condition: 어떤 조건에서 UI를 숨길 것인지 조건을 설정합니다.
프로젝트, 이슈 등을 조건으로 설정할 수 있습니다.
이 설정을 사용하기전에 다른 프로젝트에 영향이 있을지 주의가 필요할 것 같습니다. 잘못하면 다른 구성원에게 필요한 기능이 보이지 않게될 수 있을테니까요.
Planning board context menu item
Board Context Menu Item Web Item 기능 중에 하나라고 볼 수 있습니다. 스크럼, 칸반 보드에서 오른쪽 버튼을 눌렀을 때 나오는 드롭다운에 메뉴를 추가할 수 있는 기능입니다.
`Ready for release` 메뉴를 추가한 모습
가이드 문서에는 메뉴를 누르면 간단한 동작을 하는 것을 보여줍니다.
스크럼 보드에서 액티브 스프린트에 있는 이슈를 Ready for release 메뉴를 누르면,
REST endpoint로 등록한 /rest/scriptrunner/latest/custom/ghAddLabel 로 이슈 정보를 보낸다.
REST endpoint 등록된 함수에서 이슈의 label 필드에 “red” 입력한다.
flag으로 오른쪽 위에 노티를 보여준다.
1 2 3 4 5 6 7 8
// ... def flag = [ type:'success', title:"Label Added", close:'auto', body :"This issue has been approved for release" ] Response.ok(JsonOutput.toJson(flag)).build()
Condition은 복수의 이슈를 받을 수 있기에 List 객체를 받을 수 있게 되어있습니다. 예시 코드는 아래와 같이 볼 수 있습니다.
1 2 3 4 5 6
// All selected issues are resolved issues.every { it.resolution } // Selected issues in same project issues*.projectObject.unique().size() == 1 // Only a single issue is selected issues.size() == 1
Do what에는 사용할 수 있는 동작이 많습니다. link로 데이터를 보내서 추가 동작을 설정하거나, 수정, 할당 등을 할 수 있습니다.
마무리
REST Endpoints, Script Fragment 내용이 많다보니 또 포스트 내용이 넘쳤네요. 다음 #4 소개 포스트에서 남은 Escalation Services, Script JQL Functions 에 대해 소개해보겠습니다.