Jenkinsfile 是有效的独立 groovy 吗?



我试图弄清楚这个声明式 Jenkinsfile 是如何 Groovy 的。 如果可能的话,我想编写支持代码在 Jenkins 环境之外的纯 Groovy 中执行它。 我一直在编写示例时髦代码,但仍然不确定"管道"、"代理"和"阶段"是什么。

任何了解此结构的提示都值得赞赏

编辑:我用下面的简化代码编辑了这个问题。我只是想知道是否有一种方法可以在没有 Jenkins 使用的预处理器/groovyshell 环境的情况下将其转换为有效的 groovy 代码

pipeline {
stages {
// extra code here
}
}

不,你不能将 Jenkinsfile 作为独立的 Groovy 脚本运行。简而言之,Jenkins 在一个预配置的GroovyShell中执行管道代码,该知道如何评估诸如pipelineagentstages等。但是,有一种方法可以在没有 Jenkins 服务器的情况下执行 Jenkinsfie - 您可以使用JenkinsPipelineUnit测试库编写 JUnit/Spock 单元测试,这些测试将评估您的 Jenkinsfile 并显示调用堆栈树。它使用模拟,因此您可以将其视为基于交互的测试,以查看管道的特定部分是否被执行。此外,在服务器上运行管道之前,可以捕获一些代码错误。

声明性管道的简单单元测试如下所示:

import com.lesfurets.jenkins.unit.declarative.*
class TestExampleDeclarativeJob extends DeclarativePipelineTest {
@Test
void should_execute_without_errors() throws Exception {
def script = runScript("Jenkinsfile")
assertJobStatusSuccess()
printCallStack()
}
}

您可以在官方 README.md 中找到更多示例 - https://github.com/jenkinsci/JenkinsPipelineUnit

或者,您可以尝试 Jenkinsfile Runner 命令行工具,该工具可以在 Jenkins 服务器之外执行您的 Jenkinsfile - https://github.com/jenkinsci/jenkinsfile-runner

更新

我在下面用简化的代码编辑了这个问题。我只是想知道是否有一种方法可以在没有 Jenkins 使用的预处理器/groovyshell 环境的情况下将其转换为有效的 groovy 代码。

你的管道代码示例看起来像一个有效的 Jenkinsfile,但你不能把它变成一个可以运行的 Groovy 代码,例如从命令行作为常规的 Groovy 脚本:

$ groovy Jenkinsfile

这是行不通的,因为Groovy不知道Jenkins Pipeline语法。该语法通过 Jenkins 插件作为 DSL 添加,它使用预先配置的专用 GroovyShell,以正确解释管道语法。

如果您有兴趣检查 Jenkins 管道的语法是否正确,有几种不同的选项:

  • npm-groovy-lint(https://github.com/nvuillam/npm-groovy-lint) 可以在不连接到 Jenkins 服务器的情况下验证(甚至自动修复)Jenkinsfile 的语法,
  • 命令行管道 Linter(https://www.jenkins.io/doc/book/pipeline/development/#linter) 可以将管道代码发送到 Jenkins 服务器并验证其语法。

这些工具可以帮助你在运行管道之前赶上语法错误。但这只是您工具箱的一个很好的插件。与往常一样,第一步是了解语法的含义,官方文档(https://www.jenkins.io/doc/book/pipeline/syntax)是最好的起点。

最新更新