Jenkinsfile 是纯 Groovy 中的吗? Jenkinsfile 的“steps”中使用什么 Groovy 语言结构?

2024-01-11

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

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

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

什么是“步骤”?或者stage? 是调用函数吗?或定义?或者带有匿名(lambda)参数的函数调用?

这个问题本质上是另一个问题:

问题2:

Jenkinsfile 是 groovy 语言的代码片段吗?

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

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

以上两者哪一个成立?

Related:

  • https://www.jenkins.io/doc/book/pipeline/syntax/ https://www.jenkins.io/doc/book/pipeline/syntax/
  • https://www.jenkins.io/doc/book/pipeline/getting-started/#directive-generator https://www.jenkins.io/doc/book/pipeline/getting-started/#directive-generator
  • Groovy 中的 Jenkins 阶段是什么? https://stackoverflow.com/questions/56279390/what-is-a-jenkins-stage-in-terms-of-groovy(尽管标题相似,但要求不同。相关评论尚无定论)。

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

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

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

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

它在内部大致翻译为:

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jenkinsfile 是纯 Groovy 中的吗? Jenkinsfile 的“steps”中使用什么 Groovy 语言结构? 的相关文章

随机推荐