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
中执行管道代码,它知道如何评估 pipeline
、agent
、stages
等。但是,有一种方法可以在没有 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 管道的语法是否正确,有几个不同的选项:
- npm-groovy-lint (https://github.com/nvuillam/npm-groovy-lint) 可以在不连接到 Jenkins 服务器的情况下验证(甚至 auto-fix)你的 Jenkinsfile 的语法,
- Command-Line Pipeline Linter (https://www.jenkins.io/doc/book/pipeline/development/#linter) 可以将您的管道代码发送到 Jenkins 服务器并验证其语法。
这些工具可以帮助您在 运行 管道之前发现语法错误。但这只是您工具箱的一个不错的插件。一如既往,第一步是了解语法的含义,官方文档 (https://www.jenkins.io/doc/book/pipeline/syntax) 是最好的起点。
我正在努力思考这个声明性 Jenkinsfile 是如何 Groovy。如果可能的话,我想编写支持代码以在纯 Groovy 的 Jenkins 环境之外执行此操作。我一直在编写示例 groovy 代码,但仍然不确定“管道”、“代理”和“阶段”是什么。
如有任何有助于理解此结构的提示,我们将不胜感激
编辑:我用下面的简化代码编辑了这个问题。我只是想知道是否有一种方法可以在没有 Jenkins
使用的 preprocessor/groovyshell 环境的情况下将其转换为有效的 groovy 代码pipeline {
stages {
// extra code here
}
}
不,您不能 运行 Jenkinsfile 作为独立的 Groovy 脚本。简而言之,Jenkins 在 pre-configured GroovyShell
中执行管道代码,它知道如何评估 pipeline
、agent
、stages
等。但是,有一种方法可以在没有 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 管道的语法是否正确,有几个不同的选项:
- npm-groovy-lint (https://github.com/nvuillam/npm-groovy-lint) 可以在不连接到 Jenkins 服务器的情况下验证(甚至 auto-fix)你的 Jenkinsfile 的语法,
- Command-Line Pipeline Linter (https://www.jenkins.io/doc/book/pipeline/development/#linter) 可以将您的管道代码发送到 Jenkins 服务器并验证其语法。
这些工具可以帮助您在 运行 管道之前发现语法错误。但这只是您工具箱的一个不错的插件。一如既往,第一步是了解语法的含义,官方文档 (https://www.jenkins.io/doc/book/pipeline/syntax) 是最好的起点。