如何通过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
相关产品推荐
相关产品推荐

