You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Jira JSON API响应转为HTML表格并生成发布说明文档?

从Jira拉取工单生成HTML发布说明并上传知识库的Python实现

1. 安装必要依赖

先安装所需库:

pip install jira beautifulsoup4 requests python-dotenv

2. 拉取Jira工单

可以用官方jira库简化操作,或者直接用requests调用API:

方式一:使用Jira库

from jira import JIRA
from dotenv import load_dotenv
import os

load_dotenv()  # 加载.env文件中的环境变量

# 初始化Jira客户端
jira = JIRA(
    server=os.getenv('JIRA_SERVER'),
    basic_auth=(os.getenv('JIRA_USER'), os.getenv('JIRA_TOKEN'))
)

# 替换为你的JQL查询
jql = "project = YOUR_PROJ AND status = 'Done' AND updated >= '2024-05-01'"
# 指定需要拉取的字段,根据你的需求调整
issues = jira.search_issues(jql, fields='key,summary,description,assignee,created')

方式二:直接调用Jira API

如果不想用Jira库,用requests实现:

import requests
import base64
from dotenv import load_dotenv
import os

load_dotenv()

jira_server = os.getenv('JIRA_SERVER')
auth_str = f"{os.getenv('JIRA_USER')}:{os.getenv('JIRA_TOKEN')}"
auth_bytes = auth_str.encode('ascii')
auth_b64 = base64.b64encode(auth_bytes).decode('ascii')

headers = {
    "Authorization": f"Basic {auth_b64}",
    "Accept": "application/json"
}

params = {
    "jql": "project = YOUR_PROJ AND status = 'Done' AND updated >= '2024-05-01'",
    "fields": "key,summary,description,assignee,created"
}

response = requests.get(f"{jira_server}/rest/api/3/search", headers=headers, params=params)
response.raise_for_status()  # 处理请求错误
issues = response.json()['issues']

3. 生成符合要求的HTML发布说明

用BeautifulSoup构建HTML,完全可控格式,不用手动拼字符串:

from bs4 import BeautifulSoup

# 初始化HTML结构
soup = BeautifulSoup("<html><head><meta charset='UTF-8'><title>版本X.X发布说明</title></head><body></body></html>", 'html.parser')

# 添加主标题
main_title = soup.new_tag('h1')
main_title.string = "版本X.X发布说明"
main_title['style'] = "color: #2c3e50; text-align: center;"
soup.body.append(main_title)

# 添加工单表格
table = soup.new_tag('table')
# 自定义表格样式,匹配你的目标格式
table['style'] = "width: 90%; margin: 20px auto; border-collapse: collapse; border: 1px solid #ddd;"

# 构建表头
thead = soup.new_tag('thead')
thead['style'] = "background-color: #f8f9fa;"
header_row = soup.new_tag('tr')
headers = ["工单ID", "标题", "负责人", "创建时间", "描述"]
for header_text in headers:
    th = soup.new_tag('th')
    th.string = header_text
    th['style'] = "padding: 12px; text-align: left; border-bottom: 2px solid #ddd;"
    header_row.append(th)
thead.append(header_row)
table.append(thead)

# 填充表格内容
tbody = soup.new_tag('tbody')
for issue in issues:
    row = soup.new_tag('tr')
    row['style'] = "border-bottom: 1px solid #ddd;"
    row['onmouseover'] = "this.style.backgroundColor='#f5f5f5'"
    row['onmouseout'] = "this.style.backgroundColor='transparent'"

    # 工单ID
    td_key = soup.new_tag('td')
    td_key.string = issue['key']
    td_key['style'] = "padding: 12px;"
    row.append(td_key)

    # 标题
    td_summary = soup.new_tag('td')
    td_summary.string = issue['fields']['summary']
    td_summary['style'] = "padding: 12px;"
    row.append(td_summary)

    # 负责人
    td_assignee = soup.new_tag('td')
    assignee_name = issue['fields']['assignee']['displayName'] if issue['fields']['assignee'] else "未分配"
    td_assignee.string = assignee_name
    td_assignee['style'] = "padding: 12px;"
    row.append(td_assignee)

    # 创建时间
    td_created = soup.new_tag('td')
    # 格式化时间,保留日期部分
    created_date = issue['fields']['created'].split('T')[0]
    td_created.string = created_date
    td_created['style'] = "padding: 12px;"
    row.append(td_created)

    # 描述(处理换行和简单格式)
    td_desc = soup.new_tag('td')
    desc = issue['fields']['description'] or "无描述"
    # 替换换行为<br>标签
    formatted_desc = desc.replace('\n', '<br>')
    td_desc.append(BeautifulSoup(formatted_desc, 'html.parser'))
    td_desc['style'] = "padding: 12px; line-height: 1.5;"
    row.append(td_desc)

    tbody.append(row)
table.append(tbody)
soup.body.append(table)

# 转换为最终HTML字符串
final_html = str(soup)

4. 上传到知识库API

用requests发送POST请求,将HTML内容提交到知识库:

import requests
from dotenv import load_dotenv
import os

load_dotenv()

kb_api_url = os.getenv('KB_API_URL')
kb_token = os.getenv('KB_API_TOKEN')

headers = {
    "Authorization": f"Bearer {kb_token}",
    "Content-Type": "application/json"
}

payload = {
    "title": "版本X.X发布说明",
    "content": final_html,
    "category": "发布文档",
    # 根据知识库API要求添加其他字段
}

response = requests.post(kb_api_url, headers=headers, json=payload)
response.raise_for_status()

print("发布说明已成功上传到知识库")

关键提示

  • 所有敏感配置(Jira地址、账号、token,知识库API地址、token)都放在.env文件中,避免硬编码泄露信息。
  • 如果你需要匹配特定的HTML格式,直接调整BeautifulSoup创建标签时的style属性或者添加对应标签即可,比用pandas的to_html灵活得多。
  • 如果Jira工单描述是富文本(比如Jira wiki格式),可以用jira2html库转换为标准HTML:pip install jira2html,用法示例:from jira2html import convert; html_desc = convert(issue['fields']['description'])

内容的提问来源于stack exchange,提问作者Kirsten Cox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 00:45:37