詹金斯文件是纯 Groovy 中的吗?在 Jenkinsfile 的"步骤"中使用了什么 Groov



在 Jenkinsfile 的以下代码片段中使用了什么 Groovy 语言结构、语法或控制结构?

stage('Stage 1') {
steps {
// One or more steps
}
}

即 Jenkinsfile 中的块是什么,就纯 Groovy 语言而言?

什么是"步骤"?还是stage? 它是在调用函数吗?还是定义?还是带有匿名 (lambda( 参数的函数调用?

这个问题固有的是另一个问题:

问题2:

Jenkinsfile,是时髦语言的代码片段吗?

换句话说,1.Jenkinsfile 是否遵循纯 Groovy 的所有语法和控制结构?(也许是通过隐式库导入或在开始时静默地 #include d(,

与DSL相反:2.Jenkinsfile几乎是一个时髦的源文件,增加了新的Jenkins特定的结构,而不是最初在Groovy中,例如使用预处理的Jenkins。

以上两者中哪一个成立?

相关:

  • https://www.jenkins.io/doc/book/pipeline/syntax/
  • https://www.jenkins.io/doc/book/pipeline/getting-started/#directive-generator
  • 就 Groovy 而言,什么是 Jenkins Stage?(尽管标题相似,但询问是不同的。相关评论尚无定论(。

在 Jenkins(或 Gradle(中,使用了 2 个主要功能:

  1. 时髦(java(惯用结构,如循环,开关,命令链等
  2. 基于Closure的DSLBuilder工具,允许嵌套和调用特定于域的方法,因为它们是Groovy本身的一部分。

所以,如果你写类似的东西

stage('Stage 1') {
steps {
// One or more steps
}
}

它内部大致翻译为:

jenkinsContext.stage('Stage 1') {
jenkinsContext.steps {
// One or more steps
}
}

因此,书写和阅读更加清晰。这里的闭包 -{...}块 - 表示代码的嵌套或分组。

在这个块中,您还可以看到Groovy调用方法的方式,其中最后一个参数是Closure。上面的代码可以重写为:

jenkinsContext.stage 'Stage 1', { // here no brackets around args
jenkinsContext.steps( { // here with normal java-style brackets
// One or more steps
} )
}

在 Jenkins 中,您可以将 DSL 调用与 Groovy 结构混合和匹配:

[ 'Stage 1', 'Stage 2' ].each{
stage( it ) {}
}

甚至动态生成您的 DSL 名称:

[ 'Stage 1':'stage', 'step 2':'steps' ].each{ value, name ->
"$name"( value ) {}
}

将创建DSL(仅作为示例!

stage( 'Stage 1') {}
steps( 'Step 2' ) {}

所以,Jenkins 管道语法是 Groovy + Jenkins DSL

看起来它主要是Groovy,所以如果你正在寻找简单的语法高亮,添加类似以下内容的东西就可以完成了这项工作。

<!-- language: lang-groovy -->

然而,在线文档中记录了一些警告,所以也许这意味着它不是用纯粹的时髦形式编写的,而是用某种专业/受约束的形式编写的?

声明式管道中有效的基本语句和表达式遵循与 Groovy 语法相同的规则,但以下情况除外:

管道
  • 的顶层必须是一个块,具体来说:管道 { }。

  • 没有分号作为语句分隔符。每个语句都必须在自己的行上。

  • 块只能由部分、指令、步骤或赋值语句组成。

  • 属性引用语句被视为无参数方法调用。因此,例如,输入被视为input((。

https://www.jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline

最新更新