2종류가 있다.
- JIRA python library : https://github.com/pycontribs/jira
- atlassian-python-api : https://github.com/atlassian-api/atlassian-python-api
1번은 JIRA 만을 사용하기 위해 만들어진 라이브러리고,
2번은 atlassian 자체를 사용하면서 그 중에 JIRA API를 쓸 수 있다.
두 라이브러리 간 사용법 자체는 크게 차이가 없어보임. jira만 쓸꺼니까 일단 1번으로 해본다.
JIRA 서버 연결
JIRA 서버를 새로 만들어서 연결하는게 아닌, 기존 서버에 연결해서 사용하는게 목적이다.
from jira import JIRA
jac = JIRA('<https://jira.atlassian.com>',auth=('username','password'))
여기서 계정 로그인을 위한 인증auth은 크게 세가지 방법을 나눠서 많이쓰는것 같다.
- 아이디-비밀번호를 이용한 인증 : auth
- 이메일-API 토큰을 이용한 인증 (JIRA 클라우드 사용시) : basic_auth
- Oauth_dict 를 사용한 인증(Oauth 방식 인증 사용시) : oauth
지금 써볼 방식은 2번의 이메일-API 토큰을 이용한 인증방식.
계정 프로필- 계정 설정 - 보안 탭에서 API토큰 관련 메뉴를 찾을 수 있다.
여기서 API 토큰을 생성하고 복사해 사용하면 된다. 생성할 때 만들어진 토큰은 자동으로 복사가 되는데, 이때 복사를 미리 해두지 않으면 다시 복사할 수 없으니 주의.
from jira import JIRA
API_TOKEN = TOKEN_KEY
auth_JIRA = (email,API_TOKEN)
jira = JIRA(URL,basic_auth=auth_JIRA)
이렇게만 해줘도 서버에 연결하고 인증이 끝난다.
Project 참조
전체 프로젝트 목록을 불러오기 위해선 jira.projects() 함수를 사용하는데,
특정 프로젝트의 정보만 참조하고 싶을때는 project 함수를 사용한다.
pjs = jira.projects()
pj = jira.project(issuename)
for pname in dir(pj) :
print(pname+':'+str(getattr(pj,pname)))
jira.projects() 함수는 전체 프로젝트 리스트를 반환하고, jira.project 함수는 선택한 프로젝트의 오브젝트 정보를 반환한다.
이런식으로 프로젝트 오브젝트 내 전체 속성 정보를 받아와 필요한 데이터만 사용하면 될듯.
.raw로 dict 형식 데이터 받아올 수 있음.
특정 이슈만 참조
특정 이슈를 참조하기 위해서는 jira.issue() 함수를 사용
from jira import JIRA
API_TOKEN = TOKEN_KEY
auth_JIRA = (email,API_TOKEN)
jira = JIRA(URL,basic_auth=auth_JIRA)
issue = jira.issue('issuname-number')
print(issue.raw['fields']['issuetype'])
print(issue.fields.status)
클래스형으로 사용하고 싶다면 필드명 으로 바로 접근이 가능하고, .raw로 접근하면 dict 형식 데이터 받아올 수 있음. 주요 데이터는 fields에 저장된다.
statuscategorychangedate
issuetype
timespent
project
customfield_10032
fixVersions
customfield_10033
aggregatetimespent
customfield_10034
customfield_10035
resolution
customfield_10036
customfield_10029
resolutiondate
workratio
watches
lastViewed
issuerestriction
created
customfield_10020
customfield_10021
customfield_10022
customfield_10023
priority
customfield_10024
customfield_10025
labels
customfield_10016
customfield_10017
customfield_10018
customfield_10019
timeestimate
aggregatetimeoriginalestimate
versions
issuelinks
assignee
updated
status
components
timeoriginalestimate
description
customfield_10010
customfield_10014
customfield_10015
timetracking
customfield_10005
customfield_10006
customfield_10007
security
customfield_10008
customfield_10009
aggregatetimeestimate
attachment
summary
creator
subtasks
reporter
customfield_10000
aggregateprogress
customfield_10001
customfield_10002
customfield_10003
customfield_10004
environment
duedate
progress
votes
comment
worklog
fields 내 속성 목록. dict 형태니까 저 이름들을 가지고 접근하면 됨.
아래 코드를 사용하면 해당 이슈의 모든 필드 목록과 그 값을 가져올 수 있으니, 이를 통해 어떻게 접근할지 참고해볼 수 있다.
iss = jira.issue(이슈번호)
for i in dir(iss.fields):
print(i+":"+str(getattr(iss.fields,i)))
이슈 필드 데이터 접근
이하 데이터들은 dict 형태로 구성됨
속성명 설명 자료형
statuscategorychangedate | 작업 상태가 변경된 시각 | str |
issuetype | 현재 이슈타입과 이슈타입별 속성에 대한 정보 | dict |
timespent | ||
project | 현재 이슈가 속해있는 프로젝트와 프로젝트 속성에 대한 정보 | dict |
fixVersions | ||
issuerestriction | ||
watches | 지켜보기 옵션 관련 속성 | dict |
lastViewed | 최종 조회된 시각 | str |
created | 생성 시각 | str |
priority | 현재 이슈의 우선순위와 해당 우선순위 속성 정보 | dict |
labels | 현재 이슈에 부여된 레이블 | list |
timeestimate | 이슈 '시간 추적' 속성 | int |
aggregatetimeoriginalestimate | 이슈 '최초 추정치' 속성 | int |
updated | 이슈 수정된 시각 | str |
status | 현재 이슈 상태와 상태 속성에 대한 정보 | dict |
timeoriginalestimate | 이슈 '최초 추정치' 속성 (?) - 공유하는걸로 보임 | int |
description | 이슈에 작성된 내용 | str |
timetracking | 현재 이슈의 시간 관련된 내용들 담긴 dict | dict |
aggregatetimeestimate | 이슈 '시간 추적' 속성 공유 | int |
summary | 이슈 요약 - 보드에서 보이는 제목 | str |
creator | 이슈 생성자 정보와 생성자 속성에 대한 정보 | dict |
reporter | 이슈 보고자 정보와 보고자 속성에 대한 정보 | dict |
assignee | 이슈 배정자 정보와 배정자 속성에 대한 정보 | dict |
duedate | 완료 예정 날짜 | str |
votes | 따봉 관련 속성 | dict |
comment | 이슈에 작성된 댓글 정보 | dict |
worklog | 이슈 작업로그 정보 | dict |
이슈 정보 접근 & 변경
jira.transitions() 함수 이용해 현재 이슈 상태와 현재 상태에서 전환 가능한 이슈 리스트를 받아올 수 있고, jira.transition_issue() 함수로 선택한 이슈의 상태를 전환한다.
issue = jira.issue('ISS-1')
print(jira.transitions(issue))
print(jira.transitions('ISS-2'))
jira.transition_issue(issue,'41')
이슈 객체를 담고있는 변수 혹은 이슈 코드로 사용이 가능하다.
상태 변환시엔 해당 상태의 id값을 인자로 넘겨줘야한다.
이슈 객체에 대해 update() 함수를 실행하여 이슈의 여러 필드를 변경할 수 있다.
issue = jira.issue('ISS-2')
accid = '11001100110011'
issue.update( assignee={'accountId':accid} )
Jira Query
jira.search_issues() 함수 실행하여 SQL DB에서 쿼리 사용하듯이 데이터 조회가 가능하다.
q = 'project = "SOT" ORDER BY created DESC'
print(jira.search_issues(q))
~~~
[<JIRA Issue: key='SOT-5', id='10209'>, <JIRA Issue: key='SOT-4', id='10205'>, <JIRA Issue: key='SOT-3', id='10199'>]
리스트 형태로 issue 오브젝트 객체가 반환된다.
- 쿼리로 issue 오브젝트를 받아온 경우 comment와 worklog 필드가 증발한다.
- 따라서, 받아온 issue 오브젝트의 key 기반으로 객체를 다시 찾아오는 작업을 거쳐야한다.
for i in jira.search_issues(q) :
o = jira.issue(i.key)
comment 작성
jira.add_comment(issue,'comment test')