Youtrack JS工作流:PR合并时自动设置问题为Done状态的实现及PR变更检测异常求助
Youtrack JS工作流:PR合并时自动设置问题为Done状态的实现及PR变更检测异常求助
问题背景
我现在想实现一个Youtrack的JavaScript工作流:当关联的Pull Request(PR)合并时,自动把对应的Issue切换到Done状态。目前我是通过监听Issue的变更事件来开发这个工作流的。
预期与实际情况
我本来期望能做到这几点:
- 知道新增了哪一个PR
- 获取PR当前的状态(OPEN、MERGED、DECLINED)
- 查看PR在本次变更前的状态
但实际操作下来却遇到了异常:不管我怎么操作,ctx.issue.pullRequests里的每一项的isNew属性始终是false,这和文档描述的情况不符。
我尝试过的排查方法
为了解决这个问题,我试了几种方式,但都没效果:
- 调用
ctx.issue.oldValue('pullRequests'),但返回的结果和ctx.issue.pullRequests完全一致,根本看不到变更前的PR列表状态; - 给每个PR项以及
pullRequest.state字段调用isChanged()方法,结果永远返回false,完全检测不到任何变化。
临时解决方案
没办法,我只能用一个临时方案来实现需求:在Issue的PR列表更新时,获取最后被抓取到的PR,判断它的状态是否为MERGED。下面是我目前在用的代码:
const entities = require('@jetbrains/youtrack-scripting-api/entities'); exports.rule = entities.Issue.onChange({ title: 'Move task to "Done" when PR merged', guard: (ctx) => { if (ctx.issue.isChanged('pullRequests')) { const pullRequests = []; ctx.issue.pullRequests.forEach((pullRequest) => pullRequests.push(pullRequest)); pullRequests.sort((a, b) => b.fetched - a.fetched); return pullRequests[pullRequests.length - 1].state.name == 'MERGED'; } else { return false; } }, action: (ctx) => { if (ctx.issue.fields.State && !ctx.issue.fields.State.is(ctx.State.Done)) { ctx.issue.fields.State = ctx.State.Done; } }, requirements: { State: { type: entities.State.fieldType, name: 'State', Done: {} } } });
另外还有个小疑问:我至今没搞懂ctx.issue.pullRequests到底是什么类型的对象,看起来只能调用.forEach()方法,没法使用普通数组的其他操作方法。
备注:内容来源于stack exchange,提问作者Sergei Lobanov
相关产品推荐
相关产品推荐

