Jenkinsfile 是否有效独立 groovy?

Is a Jenkinsfile valid standalone groovy?

我正在努力思考这个声明性 Jenkinsfile 是如何 Groovy。如果可能的话,我想编写支持代码以在纯 Groovy 的 Jenkins 环境之外执行此操作。我一直在编写示例 groovy 代码,但仍然不确定“管道”、“代理”和“阶段”是什么。

如有任何有助于理解此结构的提示,我们将不胜感激

编辑:我用下面的简化代码编辑了这个问题。我只是想知道是否有一种方法可以在没有 Jenkins

使用的 preprocessor/groovyshell 环境的情况下将其转换为有效的 groovy 代码
pipeline {
    stages {
    // extra code here
    }
}

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

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

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 command-line 工具,它可以在 Jenkins 服务器之外执行您的 Jenkinsfile - https://github.com/jenkinsci/jenkinsfile-runner

更新

I edited this question with simplified code below. I'm just wondering if there is a way that this can be turned into valid groovy code without the preprocessor/groovyshell environment that is utilized by Jenkins.

您的管道代码示例看起来像一个有效的 Jenkinsfile,但您不能将它变成一个 Groovy 代码,可以是 运行 例如来自 command-line 作为常规 Groovy 脚本:

$ groovy Jenkinsfile

这行不通,因为 Groovy 不知道 Jenkins 管道语法。通过 Jenkins 插件将语法添加为 DSL,它使用专用的 GroovyShell 即 pre-configured 来正确解释管道语法。

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

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