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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 11:09:32