Soh*_* Si 5 groovy jenkins-job-dsl jenkins-pipeline
Jenkinsfile 中的以下代码片段使用了什么 Groovy 语言构造、语法或控制结构?
stage('Stage 1') {
steps {
// One or more steps
}
}
Run Code Online (Sandbox Code Playgroud)
即,就纯 Groovy 语言而言,Jenkinsfile 中的块是什么?
什么是“步骤”?或者stage?是调用函数吗?或定义?或者带有匿名(lambda)参数的函数调用?
这个问题本质上是另一个问题:
问题2:
Jenkinsfile 是 groovy 语言的代码片段吗?
换句话说, 1. Jenkinsfile 是否遵循纯 Groovy 的所有语法和控制结构?(也许通过隐式库 import-ed 或 #include d 在开始时默默地),
与 DSL 相反: 2. Jenkinsfile 几乎是一个 Groovy 源文件,增加了新的 Jenkins 特定结构,而这些结构最初并非在 Groovy 中,例如使用预处理的 Jenkins。
以上两者哪一个成立?
有关的:
在 Jenkins(或 Gradle)中,使用了 2 个主要功能:
Closures 的 DSLBuilder 工具允许嵌套和调用特定于域的方法,因为它们是 Groovy 本身的一部分。所以,如果你写类似的东西
stage('Stage 1') {
steps {
// One or more steps
}
}
Run Code Online (Sandbox Code Playgroud)
它在内部大致翻译为:
jenkinsContext.stage('Stage 1') {
jenkinsContext.steps {
// One or more steps
}
}
Run Code Online (Sandbox Code Playgroud)
所以书写和阅读都更加清晰。这里的闭包({...}块)代表代码的嵌套或分组。
在此块中,您还可以看到 Groovy 调用方法的方式,其中最后一个参数是闭包。上面的代码可以重写为:
jenkinsContext.stage 'Stage 1', { // here no brackets around args
jenkinsContext.steps( { // here with normal java-style brackets
// One or more steps
} )
}
Run Code Online (Sandbox Code Playgroud)
在 jenkins 中,您可以将 DSL 调用与 Groovy 结构混合搭配:
[ 'Stage 1', 'Stage 2' ].each{
stage( it ) {}
}
Run Code Online (Sandbox Code Playgroud)
甚至动态生成 DSL 名称:
[ 'Stage 1':'stage', 'step 2':'steps' ].each{ value, name ->
"$name"( value ) {}
}
Run Code Online (Sandbox Code Playgroud)
将创建 DSL(仅作为示例!):
stage( 'Stage 1') {}
steps( 'Step 2' ) {}
Run Code Online (Sandbox Code Playgroud)
所以,Jenkins 管道语法是 Groovy + Jenkins DSL