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

如何通过ScriptRunner获取BitBucket Data Center的PR审批及指定格式提交时间?

问题解决:BitBucket Data Center PR合并监听器的时间获取与格式化

1. 获取Pull Request的审批时间

BitBucket的PullRequestParticipant(即日志中的InternalPullRequestParticipant)提供了getLastReviewedDate()方法,直接调用即可拿到审批时间,该方法返回Date类型,可直接使用或后续格式化。

修改后的循环代码片段:

for (def participant : pullRequest.getReviewers()) {
    // 获取审批时间
    Date approvalDate = participant.getLastReviewedDate()
    log.warn("审批时间=${approvalDate}")
    
    // 原有逻辑保留
    def user = participant.getUser()
    log.warn("getUser=${user}")
    def lastReviewedCommit = participant.getLastReviewedCommit()
    log.warn("commitDate=${lastReviewedCommit}")
}

注:将原for循环改为增强for循环,避免重复调用pullRequest.getReviewers(),提升代码效率。

2. 获取lastReviewedCommit对应的提交创建时间并格式化

要获取提交的创建时间,需通过BitBucket的CommitService根据commit hash查询提交详情,再提取时间并格式化为yyyy-MM-dd'T'HH:mm:ss'Z'格式。

完整代码示例:

import com.atlassian.bitbucket.commit.Commit
import com.atlassian.bitbucket.commit.CommitService
import com.atlassian.bitbucket.repository.Repository
import java.text.SimpleDateFormat
import java.util.TimeZone

PullRequestMergedEvent pullRequestMergedEvent = event
def pullRequest = pullRequestMergedEvent.getPullRequest()
Repository repo = pullRequest.getToRef().getRepository()
// 获取CommitService实例
CommitService commitService = componentLocator.getComponent(CommitService)
// 定义格式化模板并设置UTC时区
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"))

for (def participant : pullRequest.getReviewers()) {
    def lastReviewedCommitHash = participant.getLastReviewedCommit()
    if (lastReviewedCommitHash) {
        // 根据hash查询提交详情
        Commit commit = commitService.getCommit(repo, lastReviewedCommitHash)
        if (commit) {
            Date commitCreateTime = commit.getAuthorTimestamp()
            // 格式化提交时间
            String formattedCommitTime = dateFormat.format(commitCreateTime)
            log.warn("提交创建时间(格式化后)=${formattedCommitTime}")
        }
    }
    
    // 格式化审批时间
    Date approvalDate = participant.getLastReviewedDate()
    if (approvalDate) {
        String formattedApprovalTime = dateFormat.format(approvalDate)
        log.warn("审批时间(格式化后)=${formattedApprovalTime}")
    }
    
    def user = participant.getUser()
    log.warn("getUser=${user}")
}

关键说明:

  • 需通过componentLocator.getComponent(CommitService)获取BitBucket的提交服务实例,用于查询完整提交信息。
  • 格式化时间时必须设置UTC时区,匹配目标格式中Z(代表UTC时间)的要求,避免时区偏差。
  • 增加空值判断逻辑,防止lastReviewedCommit或时间字段为空时触发空指针异常。

内容的提问来源于stack exchange,提问作者Kim Chen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 18:06:02