用于 scriptrunner 的 Groovy 脚本

问题描述 投票:0回答:1

我目前正在开发一个 Scriptrunner 脚本,其目标是如果用户推送不冻结依赖项,则拒绝推送。脚本本身并不难,但我不知道如何使用 Scriptrunner 使其正常工作,有什么建议吗?

我尝试了几种方法来使我的脚本正常工作,这是现在的脚本:

def regex = ".*requires\\(\"[^\\d|_|\\-](\\S)+/\\[(\\d)(\\.\\d)*\\]/stable\""
def fileName = "conanfile.py"

def file = new File(fileName)

if (file.exists()) {
  file.readLines().each { line ->
    if (line.startsWith("self.requires")) {
      if (!(line =~ regex)) {
        log.error("Error: Freeze your dependancies")
        return false
      }
    }
  }
 // log.info("All 'self.requires' lines match the regex.")
  return true
} else {
  //log.error("Error: $fileName does not exist.")
  return true
}

如您所见,这非常简单,我们检查是否有一个名为“conanfile.py”的文件,然后读取它以找到以“self.requires”开头的行,并将该行与我们的正则表达式进行比较(双\是因为时髦)。我完全不知道如何让它在 Scriptrunner 上运行。

regex groovy bitbucket scriptrunner-for-jira
1个回答
0
投票

要拒绝推送,您需要使用 ScriptRunner 中的 Pre-Hook Script。在您的脚本中,您将注入一些内容,其中包括存储库和引用的更改。

要获取文件,我们首先需要获取引用更改的最新提交:

def commits = refChanges.getCommits(repository) as List<Commit>
def latestCommit = commits.first()

这样我们就可以在该提交时获取文件的内容:

def fileStream = new ByteArrayOutputStream()
contentService.streamFile(repository, latestCommit.id, fileName) {
    fileStream
}
def content = fileStream.toString()

然后您可以像使用 readLines 一样使用该内容并返回 RepositoryHookResult。将所有内容放在一起:

import com.atlassian.bitbucket.commit.Commit
import com.atlassian.bitbucket.content.ContentService
import com.atlassian.bitbucket.hook.repository.RepositoryHookResult
import com.atlassian.sal.api.component.ComponentLocator

def regex = '.*requires\("[^\d|_|\-](\S)+/\[(\d)(\.\d)*\]@(eca|exail)/stable"'
def fileName = "conanfile.py"

def contentService = ComponentLocator.getComponent(ContentService)

def commits = refChanges.getCommits(repository) as List<Commit>
def latestCommit = commits.first()

def fileStream = new ByteArrayOutputStream()
contentService.streamFile(repository, latestCommit.id, fileName) {
    fileStream
}
def content = fileStream.toString()

content.eachLine { line ->
    if (line.startsWith("self.requires")) {
      if (!(line =~ regex)) {
        return RepositoryHookResult.rejected('Push blocked', 'Error: Freeze your dependencies')
      }
    }
  }
  // log.info("All 'self.requires' lines match the regex.")
}

return RepositoryHookResult.accepted()

请注意,这是未经测试就写下来的。因此,可能需要进行一些调整。

我将此示例脚本作为来自 Adaptavist 的示例:https://library.adaptavist.com/entity/block-commits-for-files-containing-content-that-doesnt-match-regex

© www.soinside.com 2019 - 2024. All rights reserved.