如何将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
相关产品推荐
相关产品推荐

