我目前正在开发一个 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 上运行。
要拒绝推送,您需要使用 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