Files
gloria/jira_client.py

110 lines
3.3 KiB
Python
Raw Normal View History

"""
Jira API 客户端
用于查询 Jira issue 数量
"""
import requests
import json
from typing import Optional, Dict, List, Any
import os
class JiraClient:
"""Jira API 客户端"""
def __init__(self, base_url: str, username: str, token: str):
"""
初始化 Jira 客户端
Args:
base_url: Jira 基础 URL ( https://jira.example.com)
username: Jira 用户名
token: Jira API Token
"""
self.base_url = base_url.rstrip("/")
self.username = username
self.token = token
# 尝试 Bearer token 认证方式
self.headers = {
"Content-Type": "application/json",
"Accept": "application/json",
"Authorization": f"Bearer {token}",
}
# 同时保留基本认证作为备选
self.auth = (username, token)
def search_issues(self, jql: str, max_results: int = 100) -> List[Dict[str, Any]]:
"""
搜索 Jira issues
Args:
jql: JQL 查询语句
max_results: 最大返回数量
Returns:
Issue 列表
"""
url = f"{self.base_url}/rest/api/2/search"
headers = self.headers.copy()
params = {"jql": jql, "maxResults": max_results, "fields": "key"}
try:
# 先尝试 Bearer token 认证
response = requests.get(url, headers=headers, params=params, timeout=30)
# 如果失败,尝试基本认证
if response.status_code == 401:
headers.pop("Authorization", None)
response = requests.get(
url, headers=headers, auth=self.auth, params=params, timeout=30
)
response.raise_for_status()
data = response.json()
return data.get("issues", [])
except requests.exceptions.RequestException as e:
print(f"Jira 查询失败: {e}")
return []
def count_issues(self, jql: str) -> int:
"""
统计满足条件的 issue 数量
Args:
jql: JQL 查询语句
Returns:
Issue 数量
"""
url = f"{self.base_url}/rest/api/2/search"
headers = self.headers.copy()
params = {"jql": jql, "maxResults": 0}
try:
# 先尝试 Bearer token 认证
response = requests.get(url, headers=headers, params=params, timeout=30)
# 如果失败,尝试基本认证
if response.status_code == 401:
headers.pop("Authorization", None)
response = requests.get(
url, headers=headers, auth=self.auth, params=params, timeout=30
)
response.raise_for_status()
data = response.json()
return data.get("total", 0)
except requests.exceptions.RequestException as e:
print(f"Jira 查询失败: {e}")
return 0
def get_issue_keys(self, jql: str) -> List[str]:
"""
获取满足条件的 issue keys
Args:
jql: JQL 查询语句
Returns:
Issue key 列表 ( ["FZ-2042", "FZ-2043"])
"""
issues = self.search_issues(jql)
return [str(issue.get("key")) for issue in issues if issue.get("key")]