jira新字段替换成老字段

介绍下jira替换老字段的一些情况

jira新字段替换成老字段

背景

最近jira频繁出现cpu100%问题,最终catalina.out发现存在报错

1
10-Sep-2024 09:49:31.536 WARNING [Catalina-utility-1] org.apache.catalina.valves.StuckThreadDetectionValve.notifyStuckThreadDetected Thread [http-nio-8080-exec-11] (id=[38]) has been active for [128,020] milliseconds (since [9/10/24 9:47 AM]) to serve the same request for [http://jira.xxx.com/rest/api/1.0/labels/suggest?customFieldId=14600&query=&_=1725932789508] and may be stuck (configured threshold for this StuckThreadDetectionValve is [120] seconds). There is/are [24] thread(s) in total that are monitored by this Valve and may be stuck

发现是14600 field问题,14600是哪个字段,懒得去找api了,直接从数据库 show tables like '%field%';找到对应表然后查到对应的字段了。发现它是属 于标签的,咨询了pm同事反馈这个字段会从历史单子里面去遍历,但是我没有看 实际代码也难确定,不过目前大家直接的想法都是改成多选下拉列表,这样不存 在遍历或者需要缓存问题。

尝试1 修改字段搜索模板

首先是尝试把字段的搜索模板从 标签搜索器 调整成了 ,并且重新索引下试 试,如果不行就执行原计划的方案。结果到第二天索引完了,还是报错,就暂时 不考虑了。

尝试2 新增同名字段

接着就是新增同名的字段,但是类型选择的是 选择列表(多选) 因为业务要求 能多选,这个时候你需要大概理解jira关于工单或者issue的逻辑才会知道下一 步干嘛。

首先jira的issue是由各个字段组成的,各个字段你可以定义,自定义字段位于 http://jira.xxx.com/secure/admin/ViewCustomFields.jspa

新增同名自定义字段

当你定义完字段的时候,jira会提示关联页面,这个页面其实可以理解成模板了。

关联完页面,在页面/界面 http://jira.xxx.com/secure/admin/ViewFieldScreens.jspa

你就可以找到你的issue的页面了,这个相当于模板,点击右边的 配置 就可以看 到刚刚新加的字段了。

新建页面测试或者修改老的页面的字段配置,默认你如果关联此步骤可以省略

如果没有也没关系,你可以搜索添加到里面就可以了。当然你也可以新建一个页 面,然后去进入项目去项目设置里面进行调整即可。

../images/jira/project-edit-page.png◎ ../images/jira/project-edit-page.png

在这个里面选择你的页面就好了

../images/jira/project-change-page.png◎ ../images/jira/project-change-page.png

这个时候注意新添你的字段,新添以后,在新建工单的页面,你就可以在创建 issue的时候找到这个,不过是隐藏的,因为你还没设置一些东西

../images/jira/project-new-issue.png◎ ../images/jira/project-new-issue.png

字段配置必选

这个时候就需要做一件事情,把这个字段设置成必选,把老的字段设置成 可选

这个是在字段配置里面进行的 ../images/jira/field-setting.png◎ ../images/jira/field-setting.png

找到你的字段以后,设置成必选,老的设置成可选 ../images/jira/project-field-must.png◎ ../images/jira/project-field-must.png

这样你就在新建工单里面看到自己的选择框了,老的也看不到了

所有工单老字段的值同步到新字段

这里需要写个脚本,参考gpt写了一个 大家参考下 一定要先用一个很小的jql测 试下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
    #!/usr/bin/env python3
  # -*- coding: utf-8 -*-
  # Date: Thu Sep 12 11:34:38 2024
  # Author: liuliancao <liuliancao@gmail.com>
  """Description: jira related."""
  import requests
  from requests.auth import HTTPBasicAuth
  import json

  # JIRA API URL和认证信息
  JIRA_URL = "http://jira.xxx.com"


  start_at = 0
  max_results = 50

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

  # 因为我是多选所以是这样,你可以通过for循环查询看下添加完对应的字段是啥情况
  fields = [
      {'self': 'http://jira.xxx.com/rest/api/2/customFieldOption/31918', 'value': '测试用', 'id': '31918', 'disabled': False},
      {'self': 'http://jira.xxx.com/rest/api/2/customFieldOption/31919', 'value': '测试用2', 'id': '31919', 'disabled': False}
  ]

  field_maps = {item['value']: item for item in fields}

  before_issue = None
  while True:
      # JQL查询
      jql_query = "project = WEB AND resolution != Unresolved"

      # 获取问题
      response = requests.get(
	  f"{JIRA_URL}/rest/api/2/search?jql={jql_query}&startAt={start_at}&maxResults={max_results}",
	  headers=headers
      )
      issues = response.json().get('issues', [])

      if issues[0] == before_issue:
	  # 如果数据一样了
	  break

      before_issue = issues[0]
      for issue in issues:
	  print("issue key "+issue['key'])
	  if not issue['fields']['customfield_15703']:
	      projects = issue['fields']['customfield_14600']
	      if not projects:
		  continue
	      issue_key = issue['key']
	      new_projects = []
	      for project in projects:
		  if project in field_maps.keys():
		      new_projects.append(field_maps[project])
	      print(new_projects)
	      print(issue['fields']['customfield_15703'])
	      issue['fields']['customfield_15703'] = new_projects
	      # # 更新问题
	      payload = {
		  "fields": {
		      "customfield_15703": new_projects
		  }
	      }

	      update_response = requests.put(
		  f"{JIRA_URL}/rest/api/2/issue/{issue_key}",
		  data=json.dumps(payload),
		  headers=headers
	      )

	      if update_response.status_code == 204:
		  print(f"Issue {issue_key} updated successfully.")
	      else:
		  print(
		      f"Failed to update issue {issue_key}: {update_response.content}")

	  start_at += max_results

最终就完成了对老字段tag变成多选list的操作

总结

需要对jira的界面逻辑配置了解,通过新增同名字段,并且对老的数值进行迁移 复制可以解决这种情况。