如何通过Jira API及Ruby脚本获取问题首次进入Done状态的时间?
解决Jira首次Done状态日期获取为空及字段更新问题
常见问题排查点
- 状态匹配错误:别硬写"Done",得看Jira实际状态名,比如你示例里的目标状态是"Resolved"(属于Done类别),脚本里写错状态名肯定查不到
- 遍历顺序搞反:要按时间正序遍历变更日志,取第一条符合条件的记录,倒序的话会拿到最后一次变更的时间,甚至找不到首次记录
- 字段读取错误:得取变更日志里的
created字段(状态变更发生的时间),不是问题的updated字段 - 权限不足:脚本用的Jira账号得有读取变更日志和修改自定义字段的权限
修正后的Ruby脚本
假设你用的是jira-ruby gem,直接替换原有代码即可:
require 'jira-ruby' require 'csv' # 填写自己的Jira配置信息 jira_config = { username: '你的Jira用户名', password: '你的Jira API令牌', site: 'https://你的Jira实例地址.atlassian.net/', context_path: '', auth_type: :basic } # 初始化Jira客户端 client = JIRA::Client.new(jira_config) # 替换为你的「首次完成日期」自定义字段ID FIRST_RESOLVED_FIELD_ID = 'customfield_xxxx' # 目标项目Key和状态名(按Jira实际情况调整) TARGET_PROJECT = 'TII' TARGET_STATUS = 'Resolved' # 若按状态类别匹配,可替换为下方注释的逻辑 # 拉取项目内已完成的问题 jql_query = "project = #{TARGET_PROJECT} AND statusCategory = Done" issues = client.Issue.jql(jql_query) # 准备CSV表格数据 csv_rows = [['issue_key', 'first_resolved_at']] issues.each do |issue| first_done_time = nil # 按时间正序遍历变更日志,查找首次进入目标状态的记录 issue.changelog.histories.sort_by { |history| history.created }.each do |history| history.items.each do |item| # 匹配状态变更且变更后为目标状态 if item.field == 'status' && item.to_string == TARGET_STATUS first_done_time = history.created break # 找到首次记录后停止遍历 end # 若需按状态类别匹配,替换上面的if为这段: # if item.field == 'status' # target_status_obj = client.Status.find(item.to) # if target_status_obj.status_category.name == 'Done' # first_done_time = history.created # break # end # end end break if first_done_time # 找到记录后跳出外层循环 end if first_done_time # 更新自定义字段 issue.save({ FIRST_RESOLVED_FIELD_ID => first_done_time }) puts "已更新问题 #{issue.key},首次完成时间:#{first_done_time}" csv_rows << [issue.key, first_done_time] else puts "问题 #{issue.key} 未找到有效的完成状态变更记录" end end # 生成CSV表格文件 CSV.open('jira_first_done_dates.csv', 'w') do |csv| csv_rows.each { |row| csv << row } end puts "CSV表格已生成:jira_first_done_dates.csv"
关键修正说明
- 精准状态匹配:明确判断状态变更字段,用Jira实际状态名(或状态类别)匹配,避免无效查找
- 正确遍历顺序:对变更日志按创建时间正序排序,确保拿到的是第一次进入完成状态的时间
- 字段更新逻辑:用自定义字段ID直接赋值,确保账号有权限修改该字段
- 可视化排查:添加控制台输出,方便快速定位无匹配记录的问题
针对TII-627的验证
按照你提供的变更日志示例,脚本会遍历到2023-02-07T10:30:02.897+0530的状态变更记录,匹配到"Resolved"状态后,会将该时间设为首次完成时间,同步更新自定义字段并写入CSV表格。
内容的提问来源于stack exchange,提问作者Ishan Purohit
相关产品推荐
相关产品推荐

