我将其放在Jenkins UI作业配置的脚本部分-
pipeline {
agent any
stages{
stage('Project') {
...
但是有效-
pipeline {
agent any
stages{
stage('Project ' + 'Josh') {
...
抛出并显示不正确的错误消息,因为解析器由于舞台内部构造的字符串而感到困惑。
此外,
String description = 'Project' + ' Josh'
pipeline {
agent any
stages{
stage(description) {
...
不会失败,但是会显示“ description
”作为阶段的描述。
现在,如果您尝试加载包含此文件的Groovy PaC文件:
node {
stage('Project' + 'Josh') {
...
它工作顺利。
是否有可能使用两个不同的Groovy解析器,一个用于UI,另一个用于加载的PaC?这意味着用户界面中确实存在一个非常可怕的错误...
想法? .a。
答案 0 :(得分:2)
您的示例与Jenkins UI无关。您已经展示了两种不同的管道类型-一种声明性和脚本化。
声明性管道
pipeline {
agent any
stages {
stage('Build') {
steps {
// do something here
}
}
}
}
引入了更加简化,有限和自以为是的语法。这种类型的管道为Groovy代码的执行设置了边界-仅在专用的script
块中可用,例如
pipeline {
agent any
stages {
stage('Build') {
steps {
script {
def name = 'Joe'
echo "My name is ${name}"
}
}
}
}
}
这就是stage
块期望文字而不是变量或表达式的原因。
您显示的第二个示例是脚本化管道。与声明式管道相比,这种管道更强大-整个管道脚本或多或少是Groovy脚本,因此您几乎可以将任何代码放在任何地方。脚本化管道以node
块开头,它允许您将任何Groovy代码放入该块中。考虑以下示例:
node {
stage("Test") {
echo "1,2,3"
}
for (int i = 0; i < 5; i++) {
stage("Stage ${i}") {
echo "This is ${i}"
}
}
}
此管道脚本生成6个阶段:
正如您所看到的,在node
块中放入什么样的东西实际上没有限制。声明性管道不允许您这样做-它的语法很严格,您必须直接遵循它。
作为最后的说明,我将引用詹金斯的官方文档:
但是,它们的区别在于语法和灵活性。声明性限制使用更严格和预定义的结构为用户提供的功能,使其成为更简单的连续交付管道的理想选择。脚本化脚本提供的限制很少,以至于对结构和语法的唯一限制往往是由Groovy本身定义的,而不是由任何特定于管道的系统定义的,因此,它成为高级用户和要求更复杂的用户的理想选择。顾名思义,声明性流水线鼓励使用声明性编程模型。而脚本化管道遵循一种更必要的编程模型。
答案 1 :(得分:1)
您通过UI配置的脚本使用声明性pipeline
语法,而其他脚本使用脚本化的node
语法。我想这可能是另一个解析器出现的地方,并且会同意pipeline
的解析器存在错误。