Web/Flask-python

[flask] flask + jira API

2종류가 있다.

  1. JIRA python library : https://github.com/pycontribs/jira
  2. 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은 크게 세가지 방법을 나눠서 많이쓰는것 같다.

  1. 아이디-비밀번호를 이용한 인증 : auth
  2. 이메일-API 토큰을 이용한 인증 (JIRA 클라우드 사용시) : basic_auth
  3. 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')