项目经理需要收集各种信息,通过因素分析、对比分析和趋势分析等方法,定期开展项目数据分析,及时发现存在的问题,及时查明原因并加以改进。
本周最大的亮点是对上周的批量操作数据的弥补,面对600多条的冗余数据,逐条删除操作会显得很笨拙,作为技术出身还是期望能够通过编程或接口调用处理繁琐价值不大的事情。
发现JIRA的插件Script Runner的无缝支持Groovy编程,便抱着试一试的态度,结合谷歌百度,折腾起用脚本进行批量删除的想法,经过多轮实验,最后成功完成预期中的删除功能。
一些小体会
—重复例行的工作一定要自动化省时间
—总觉得能写点代码才对得起自己的专业
—有些规则是为了获取上下文北京而设
—一定要小批量测试再到大规模推广
—不断尝试解决掉问题经历痛苦到快乐
—系统学习小步快跑多种思路解决问题
主要代码
import com.atlassian.jira.issue.customfields.manager.OptionsManager
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.issue.fields.CustomField
import com.atlassian.jira.issue.fields.config.FieldConfig
import com.atlassian.jira.issue.fields.config.FieldConfigScheme
import com.atlassian.jira.issue.customfields.option.Option
import com.atlassian.jira.issue.customfields.option.Options
import groovy.transform.Field
// 更新的JIRA Issue Key
final String issueKey="BUG—XXX"
def issue =
ComponentAccessor.getIssueManager().getIssueObject(issueKey)
def customField =
ComponentAccessor.getCustomFieldManager().getCustomFieldObjects(issue).findByName("bug_type")
def availableOptions =
ComponentAccessor.optionsManager.getOptions(customField.getRelevantConfig(issue))
removeOptionToCustomField(customField, 400)
// 删除选项
public boolean
removeOptionToCustomField(CustomField customField, int offset) {
Option existingOption = null;
if (customField != null) {
List<FieldConfigScheme> schemes = customField.getConfigurationSchemes()
if (schemes != null &&
!schemes.isEmpty()) {
FieldConfigScheme schema =
schemes.get(0)
Map configs =
schema.getConfigsByConfig()
if (configs != null && !configs.isEmpty()) {
FieldConfig config = (FieldConfig) configs.pkeySet().iterator().next()
OptionsManager optionsManager =
ComponentAccessor.getOptionsManager()
Options options =
optionsManager.getOptions(config)
def len =
options.getRootOptions().size() - 1
options[offset..len].eachWithIndex{
option,i -> log.debug
"${i+offset}:$option"
options.removeOption(option)
}
}
}
}
return true;
}
// 增加选项
public Option
addOptionToCustomField(CustomField customField, String value) {
Option newOption = null;
if (customField != null) {
List<FieldConfigScheme> schemes = customField.getConfigurationSchemes()
if (schemes != null &&
!schemes.isEmpty()) {
FieldConfigScheme schema =
schemes.get(0)
Map configs =
schema.getConfigsByConfig()
log.debug(configs)
if (configs != null && !configs.isEmpty()) {
FieldConfig config = (FieldConfig) configs.keySet().iterator().next()
OptionsManager optionsManager =
ComponentAccessor.getOptionsManager()
Options option =
optionsManager.getOptions(config)
int nextSequence = option.isEmpty() ? 1 : option.getRootOptions().size() + 1
newOption = optionsManager.createOption(config, null, (long) nextSequence, value);
}
}
}
return newOption;
}
参考链接
https://scriptrunner.adaptavist.com/latest/index.html
https://www.cnblogs.com/freeliver54/p/15855723.html
https://community.atlassian.com/t5/Jira-questions/Remove-option-from-Select-list-custom-field-using-behaviour/qaq-p/1412083
https://doc.devpod.cn/jira/jira-scriptrunner-3244042.html
https://docs.atlassian.com/software/jira/docs/api/
http://groovy-lang.org/closures.html