没有这样的 DSL 方法`stages`

no such DSL method `stages`

我正在尝试为 Jenkins 创建我的第一个 Groovy 脚本:

看了这里 https://jenkins.io/doc/book/pipeline/,我创建了这个:

node {
  stages {

    stage('HelloWorld') {
      echo 'Hello World'
    }

    stage('git clone') {
      git clone "ssh://git@mywebsite.com/myrepo.git"
    }

  }
}

但是,我得到:

java.lang.NoSuchMethodError: No such DSL method "stages" found among steps

我错过了什么?

此外,如何将我的凭据传递到 Git 存储库而不以纯文本形式写入密码?

你混淆了 Scripted PipelineDeclarative Pipeline,完全不同 see here。但短篇小说:

  • declarative pipelines是管道DSL的新扩展(它基本上是一个只有一个步骤的管道脚本,一个带参数的管道步骤(称为指令),这些指令应该遵循特定的语法。这种新格式的要点是它更严格,因此对于管道新手来说应该更容易,允许图形编辑等等。
  • 脚本化管道 是高级要求的后备。

因此,如果我们查看您的脚本,您首先会打开一个 node 步骤,该步骤来自脚本管道。然后使用 stages,这是 declarative pipeline 中定义的 pipeline 步骤的指令之一。所以你可以写:

pipeline {
  ...
  stages {
    stage('HelloWorld') {
      steps {
        echo 'Hello World'
      }
    }
    stage('git clone') {
      steps {
        git clone "ssh://git@mywebsite.com/myrepo.git"
      }
    }
  }
}

因此,如果您想使用 declarative pipeline,那就是正确的选择。

如果你想scripted pipeline,那么你写:

node {
  stage('HelloWorld') {
    echo 'Hello World'
  }

  stage('git clone') {
    git clone "ssh://git@mywebsite.com/myrepo.git"
  }
}

例如:跳过阶段块。

可以使用两种类型的语法编写 Jenkinsfile - 声明式脚本式.

声明式和脚本式管道的构造根本不同。声明式流水线是 Jenkins 流水线的最新特性:

  • 提供了比脚本管道语法更丰富的语法特性,并且

  • 旨在使编写和阅读流水线代码更容易。

然而,写入 Jenkinsfile 的许多单独的语法组件(或 "steps")对于声明式和脚本式管道都是通用的。 示例:

声明式管道基础知识

在声明式管道语法中,pipeline 块定义了整个管道中完成的所有工作。

Jenkinsfile(声明式管道):

pipeline {
    agent any 1
    stages { 
        stage('Build') { 2
            steps { 
                // 3
            }
        }
        stage('Test') { 4
            steps { 
                // 5
            }
        }
        stage('Deploy') { 6
            steps {
                // 7
            }
        }
    }
}
  1. 在任何可用代理上执行此管道或其任何阶段。
  2. 定义 "Build" 阶段。
  3. 执行与 "Build" 阶段相关的一些步骤。
  4. 定义 "Test" 阶段。
  5. 执行与 "Test" 阶段相关的一些步骤。
  6. 定义 "Deploy" 阶段。
  7. 执行与 "Deploy" 阶段相关的一些步骤。

脚本化管道基础知识

在脚本化流水线语法中,一个或多个 node 块在整个流水线中完成核心工作。虽然这不是脚本化流水线语法的强制要求,但将流水线的工作限制在 node 块内有两件事:

  1. 通过将项目添加到 Jenkins 队列来将块中包含的步骤安排到 运行。一旦执行程序在节点上空闲,这些步骤将 运行.

  2. 创建一个工作区(特定于特定管道的目录),可以在其中对从源代码管理中检出的文件进行工作。
    警告:根据您的 Jenkins 配置,某些工作区在一段时间不活动后可能不会自动清理。有关详细信息,请参阅 JENKINS-2111 链接的票证和讨论。

Jenkinsfile(脚本化管道):

node { 1
    stage('Build') { 2
        // 3
    }
    stage('Test') { 4
        // 5
    }
    stage('Deploy') { 6
        // 7
    }
}
  1. 在任何可用代理上执行此管道或其任何阶段。
  2. 定义 "Build" 阶段。 stage 块在脚本化管道语法中是可选的。但是,在脚本化管道中实施 stage 块可以更清晰地显示 Jenkins UI 中 tasks/steps 的每个“阶段”子集。
  3. 执行与 "Build" 阶段相关的一些步骤。
  4. 定义 "Test" 阶段。 5
  5. 执行与 "Test" 阶段相关的一些步骤。
  6. 定义 "Deploy" 阶段。
  7. 执行与 "Deploy" 阶段相关的一些步骤。

管道示例

这是一个 Jenkinsfile 使用声明式及其等效的脚本管道语法的示例:

Jenkinsfile(声明式管道):

pipeline {
    agent any
    options {
        skipStagesAfterUnstable()
    }
    stages {
        stage('Build') {
            steps {
                sh 'make'
            }
        }
        stage('Test'){
            steps {
                sh 'make check'
                junit 'reports/**/*.xml'
            }
        }
        stage('Deploy') {
            steps {
                sh 'make publish'
            }
        }
    }
}

Jenkinsfile(脚本化管道):

node {
    stage('Build') {
        sh 'make'
    }
    stage('Test') {
        sh 'make check'
        junit 'reports/**/*.xml'
    }
    if (currentBuild.currentResult == 'SUCCESS') {
        stage('Deploy') {
            sh 'make publish'
        }
    }
}