Page tree

JQL 이란?

JIRA Issue 를 검색하기 위한 구조적 언어로 SQL 과 비슷한 문법을 가지고 있으므로 SQL 을 아는 사용자라면 쉽게 배울 수 있습니다.


JQL 에 익숙하고 JIRA 에 충분한 데이타가 쌓여 있다면 여러 가지 다양한 조건으로 이슈를 검색하고 분석할 수 있으며 결과는 MS Excel 이나 다른 포맷으로 export 하여 실제 데이타 기반의 양질의 보고서를 작성할 수 있습니다. 


JQL 을 사용하려면 아래의 절차를 따르면 됩니다.

  1. IssuesSearch for issues 클릭

  2. Advanced 를 클릭해서 JQL 입력 화면으로 전환

사용 예제

TL;DR

JQL 을 사용하여 이슈를 검색하는 예제입니다. JQL 문법은 하단 내용을 참고하세요.


현재 login 사용자에게 할당된 이슈 검색
project = myproj AND assignee = currentUser() 


내가 담당자인 이슈에서 처리되지 않은 이슈
assignee = currentUser() and status not in (resolved, closed, Done)
특정 이슈의 하위 이슈(Subtask) 검색
project = myproj AND parent = TEST-1234
담당자가 lesstif 인 이슈중에 올해에 해결한 이슈를 변경 날자를 기준으로 내림차순으로 정렬
assignee in (lesstif) and status was in ("Resolved", Done, Closed) by lesstif during (startOfYear(), endOfYear()) order by updatedDate 


지난 주에 상태를 변경한 이슈 (주간 업무용)
project not in('TEST') and status changed during (startOfWeek(-1), endOfWeek(-1)) order by updatedDate


지난 달에 상태를 변경한 이슈 (월간 업무용)
현재 사용자가 지난 달에 변경한 이슈
project not in('TEST') and status changed during (startOfMonth(-1), endOfMonth(-1)) by currentUser() order by updatedDate


투표가 되었고 해결되지 않은 이슈 목록을 투표수와 생성일로 정렬
status not in (Resolved, Closed, done) and votes  > 0 order by votes, createdDate 


키워드와 필드

JSQL의 문법은 field 와 operator, function 으로 이루어져 있음. 필드는 SQL SELECT 구문뒤에 따라오는 컬럼명이라고 생각하면 되며 JIRA 이슈의 개별 필드와 매칭됨.

필드 뒤에는 연산자가 오며 연산자 뒤에 검색할 항목을 기술하며 다음 예제는 TEST 라는 프로젝트내의 모든 이슈를 검색

'TEST' 프로젝트내 모든 이슈 검색
Project = 'TEST' 


keyword

두 개 이상의 검색 조건이 있을 경우 keyword 를 사용하여 검색 조건을 연결하며 사용 가능한 키워드는 AND, OR, NOT, EMPTY, NULL, ORDER BY 가 있음.

'TEST' 프로젝트내 담당자가 Jack, John이 아닌 모든 이슈를 createDate로 정렬
Project = 'TEST'  and assignee != John order by createDate


Operator

SQL 처럼 =, !=, >, <, in, not in, was 등의 여러 연산자를 지원


Equal(=), Not Equal(!=), Less than(<), ... 


CONTAINS(~)

Text 필드(summary, Description, comments) 에서 특정 문자열 검색


제목에 "Out of memory" 가 있는 이슈 검색
summary  ~ "out of memory"
설명에서 문구 검색
description ~ "out of memory"
모든 텍스트 필드에서 문구 검색
text ~ "out of memory"

DOES NOT CONTAIN(!~)

Contains 와 반대

IS

Empty 또는 null 키워드와 같이 사용

fixVersion is empty


IS Not

IS 의 반대

fixVersion is not null



IN

webapp1, MyPrj 에서 담당자가 Jack, John 이 아닌 이슈
Project in ('webapp1', 'MyPrj') AND Assigned not in (Jack,John)


Not IN

test, sample 이 아닌 프로젝트중 변경일이 특정일 사이인 이슈
Project NOT in ('test', 'sample') AND updatedDate  > '2017-05-16' and updatedDate <= '2017-06-16'


Changed

필드의 변경 여부를 확인할 수 있는 연산자로 아래의 키워드가 있음(https://confluence.atlassian.com/jiracorecloud/advanced-searching-operators-reference-765593718.html#Advancedsearching-operatorsreference-CHANGEDCHANGED)

  • AFTER "date"
  • BEFORE "date"
  • BY "username"
  • DURING ("date1","date2")
  • ON "date"
  • FROM "oldvalue"
  • TO "newvalue"


사용 예

담당자 변경
assignee CHANGED
"In Review" 로 상태가 바뀐 이슈
status CHANGED FROM "Open" To "In Review"
지난 달에 처리한 이슈
 status CHANGED FROM "In Progress" To "Done" by lesstif After startOfMonth(-1)


was

과거에 특정 상태였거나 현재 특정 상태인 이슈로 4가지 옵션 제공

  • BY "username"
  • BEFORE "date"
  • AFTER "date"
  • ON "date"
  • DURING ("date1","date2") - date1, date2 기간내에 상태 변경을 검색
과거에 "진행중"이었거나 현재 진행중 상태인 이슈
Project NOT in ('test', 'sample') AND status was "In Progress"
Project NOT in ('test', 'sample') AND status was "In Progress" by lesstif
Project NOT in ('test', 'sample') AND status was "In Progress" by lesstif

Was in

Project NOT in ('test', 'sample') AND status was in("resolved", "done") by lesstif
2주간 처리된 이슈 목록
Project in ('test', 'sample') AND status was in("resolved", "done") by lesstif during (startofweek(-1), endofweek())

field 

자세한 설명은 위 링크를 참고하며 주요 필드는 아래와 같음

CREATED, 

이슈 생성일로 createdDate 라는 alias 로도 접근 가능하며  다음 포맷 지원

"yyyy/MM/dd HH:mm"
"yyyy-MM-dd HH:mm"
"yyyy/MM/dd"
"yyyy-MM-dd"


Due

dueDate 라는 alias 로 접근 가능

"yyyy/MM/dd"
"yyyy-MM-dd"


Priority

우선 순위, name 또는 ID 로 검색할수 있으며 JIRA 관리자가 priority name 을 변경할 수 있으므로 주의해서 검색

Project = 'TEST' and Priority in (Blocker, Critical)


Status

현재 이슈의 상태

status not in (Open, ReOpen, Progress)


변경된 이슈를 확인하려면 Keyword 에 changed 연산자 사용

status changed AFTER startOfMonth() 



Type

issueType alias로도 접근 가능, 

Project = 'TEST' and issueType in (Bug,Improvement)

Resolution

이슈의 처리 결과.

resolution in ("Cannot Reproduce", "Won't Fix")


펑션과 히스토리

function


currentUser()

 

Perform searches based on the currently logged-in user. 

Note that this function can only be used by logged-in users. So if you are creating a saved filter that you expect to be used by anonymous users, do not use this function.


Date/Time

+, - 연산자와 함께 d, w, m 키워드 사용 가능. 다음 쿼리는 2주전과 3일전 사이에 변경된 이슈를 검색

updated > -2w and updated < -3d


startOfXXX, endOfXXX

시작 날자를 가져오는 startOfDay, startOfWeek, startOfMonth, startOfYear과 마지막 날자를 가져오기 위한 endOfDay, endOfWeek, endOfMonth, endOfYear 함수가 있음. 다음 쿼리는 종료일이 이번 달인 이슈를 출력

due > startOfMonth() and due < endOfMonth() order by due


now

현재 시간을 리턴. 다음 쿼리는 기한이 지났지만 미처리 상태인 이슈를 출력

duedate < now() and status not in (closed, resolved)


history

JIRA 이슈 필드중 History 필드를 조회하여 언제 누가 어떤 workflow 를 수행했는지 확인하는 기능


이슈 상태가 Open 에서 진행중으로 변경된 이슈

project = test AND  status CHANGED FROM "Open"  TO "In Progress" BY lesstif



during

status was ("In Progress") DURING (startofweek(), endofweek())

Ref