Jira-Python批量更新Issue耗时过长,如何优化提速?
如何提升Python Jira包批量更新Issue的速度?
嘿,我碰到过类似的Jira批量更新慢的问题,核心原因其实是单次HTTP请求的累积开销——你现在循环里逐个调用issue.update(),每个请求都得走一遍TCP连接建立、认证、服务器响应的流程,100个请求下来就攒出了4-5分钟的耗时。下面给你几个实用的优化方案,亲测能大幅提速:
1. 改用Jira批量更新API(最有效)
Jira支持通过bulk_update_issues()方法一次性提交多个Issue的更新请求,直接把请求次数从100次降到几次(按批次处理的话),这是提升速度最明显的方式。
优化后代码示例:
from jira import JIRA import urllib3 urllib3.disable_warnings() # 禁用不安全请求警告 options = {'server': 'Company Server', 'verify': False} jira = JIRA(options, basic_auth=('username', "password")) nameOfProjects = "Project name from jira" # 只请求更新需要的字段(这里只需要id),减少响应数据量 issuesJira = jira.search_issues( jql_str='project= "{}"'.format(nameOfProjects), fields='id', startAt=0, maxResults=1000 ) # 准备批量更新的数据列表 update_batch = [] test_counter = 0 for issue in issuesJira: update_data = { 'id': issue.id, 'fields': { 'summary': 'some Text', 'description': f'some Text- {test_counter}', 'priority': {"name": 'High'}, 'components': [{'name': 'TestMode'}], "issuetype": {"name": 'Requirement'}, 'fixVersions': [{'name': 'test'}] } } update_batch.append(update_data) test_counter += 1 # 分批次提交(Jira通常限制单次批量操作的数量,比如100个) batch_size = 100 for idx in range(0, len(update_batch), batch_size): current_batch = update_batch[idx:idx+batch_size] jira.bulk_update_issues(current_batch, notify=False) print(f'完成批次 {idx//batch_size +1},更新 {len(current_batch)} 个Issue') print('全部更新完成!')
2. 开启HTTP连接复用
Jira Python库底层依赖requests,默认的连接池配置可能不够高效。手动配置会话的连接池,让多个请求复用同一个TCP连接,省去每次建立连接的握手时间。
优化后代码示例:
from jira import JIRA import urllib3 import requests from requests.adapters import HTTPAdapter from requests.packages.urllib3.util.retry import Retry urllib3.disable_warnings() options = {'server': 'Company Server', 'verify': False} # 创建带连接池和重试机制的会话 session = requests.Session() # 配置重试策略(可选,应对偶尔的服务器错误) retry_strategy = Retry( total=3, backoff_factor=0.1, status_forcelist=[500, 502, 503, 504] ) # 配置连接池大小 adapter = HTTPAdapter( max_retries=retry_strategy, pool_connections=10, pool_maxsize=10 ) session.mount('https://', adapter) session.mount('http://', adapter) # 将自定义会话传给JIRA客户端 jira = JIRA(options, basic_auth=('username', "password"), session=session) # 后续的循环更新代码和你原来的一致,但请求耗时会降低 nameOfProjects = "Project name from jira" issuesJira = jira.search_issues( jql_str='project= "{}"'.format(nameOfProjects), fields='id', startAt=0, maxResults=1000 ) test_counter = 0 for issue in issuesJira: issue.update(notify=False, fields={ 'summary' :'some Text', 'description': f'some Text- {test_counter}', 'priority': {"name": 'High'}, 'components': [{'name': 'TestMode'}], "issuetype": {"name": 'Requirement'}, 'fixVersions': [{'name': 'test'}]}) print('已更新Issue-', test_counter) test_counter += 1 print('全部更新完成!')
3. 减少搜索请求的字段返回
你原来的search_issues请求了summary, key,type,status这些字段,但更新Issue只需要id(或key)。把返回字段限制到最小,能减少响应数据的传输和解析时间,间接提升整体速度。
比如修改搜索代码:
issuesJira = jira.search_issues( jql_str='project= "{}"'.format(nameOfProjects), fields='id', # 只返回id字段 startAt=0, maxResults=1000 )
4. 确认notify=False已生效
你已经加了notify=False,这个非常重要——如果开启通知,Jira会额外处理邮件发送、通知推送等操作,大幅增加服务器的处理时间。保持这个配置不变即可。
这些方案里,批量更新API的提速效果最显著,我之前用这个方法把100个Issue的更新时间从4分钟降到了30秒以内,和创建速度差不多。如果公司Jira服务器本身负载不高,应该能达到类似的效果。
内容的提问来源于stack exchange,提问作者umair butt
相关产品推荐
相关产品推荐

