Jira脚本中newIssueproject.getVersions().contains(v)始终返回false的修复求助
问题
需求是仅当指定项目包含当前问题的相同版本时,才创建带-Inbox后缀的新版本,核心代码如下:
for( Version v: issue.getFixVersions()){ if(newIssueproject.getVersions().contains(v)){ Version mynewVersion= ComponentAccessor.versionManager.createVersion(v.getName()+"-Inbox", startDate, releaseDate, description, newIssueproject.id, scheduleAfterVersion, released) mynewVersions.add(mynewVersion) } }
但if(newIssueproject.getVersions().contains(v))始终返回false,导致mynewVersions列表为空,无法生成预期的新版本。
问题原因
Jira中的Version对象是按实例判断相等性的:当前问题的v是原项目的Version实例,而newIssueproject.getVersions()返回的是目标项目的Version实例——哪怕两个版本名称完全一致,它们也是不同的对象,因此contains方法会判定为不相等,返回false。
修复方案
不要直接比较Version对象,而是通过版本名称来判断目标项目是否存在同名版本,具体步骤:
- 先提取目标项目所有版本的名称,存入一个Set(查询效率更高)
- 循环当前问题的FixVersions时,检查版本名称是否在目标项目的版本名称集合中
修改后的核心代码如下:
// 先提取目标项目的所有版本名称到Set def targetVersionNames = newIssueproject.getVersions().collect { it.name } as Set def mynewVersions = new ArrayList<Version>() for(Version v : issue.getFixVersions()){ // 用版本名称判断,而非对象实例 if(targetVersionNames.contains(v.getName())){ Version mynewVersion = ComponentAccessor.versionManager.createVersion( v.getName()+"-Inbox", startDate, releaseDate, description, newIssueproject.id, scheduleAfterVersion, released ) mynewVersions.add(mynewVersion) } } newissue.setFixVersions(mynewVersions)
额外优化建议
- 如果需要更严谨的判断(比如避免名称相同但其他属性不同的情况),可以结合版本的其他属性(如发布状态)一起判断,但通常名称匹配已经能满足需求
- 可以添加日志打印,输出目标项目的版本名称集合和当前问题的版本名称,方便调试排查
内容的提问来源于stack exchange,提问作者منى
相关产品推荐
相关产品推荐

