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

如何通过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"

关键修正说明

  1. 精准状态匹配:明确判断状态变更字段,用Jira实际状态名(或状态类别)匹配,避免无效查找
  2. 正确遍历顺序:对变更日志按创建时间正序排序,确保拿到的是第一次进入完成状态的时间
  3. 字段更新逻辑:用自定义字段ID直接赋值,确保账号有权限修改该字段
  4. 可视化排查:添加控制台输出,方便快速定位无匹配记录的问题

针对TII-627的验证

按照你提供的变更日志示例,脚本会遍历到2023-02-07T10:30:02.897+0530的状态变更记录,匹配到"Resolved"状态后,会将该时间设为首次完成时间,同步更新自定义字段并写入CSV表格。

内容的提问来源于stack exchange,提问作者Ishan Purohit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:00:26