没有这样的DSL方法`阶段`

时间:2017-02-08 12:52:01

标签: jenkins groovy jenkins-pipeline

我正在尝试为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存储库?

2 个答案:

答案 0 :(得分:50)

您将Scripted PipelineDeclarative Pipeline混淆并混淆,以获得完全不同see here。但短篇小说:

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

因此,如果我们查看您的脚本,您首先要打开node步骤,该步骤来自脚本管道。然后使用stages,这是pipeline中定义的declarative 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"
  }
}

例如:跳过阶段块。

答案 1 :(得分:0)

Jenkins文件可以使用两种语法编写-声明性脚本化

声明性和脚本化管道在根本上是不同的。声明性管道是Jenkins Pipeline的最新功能,

  • 通过脚本管道语法提供了更丰富的语法功能,并且

  • 旨在使编写和阅读管道代码更加容易。

但是,声明式和脚本化管道都包含写入Jenkins文件的许多单个语法组件(或“步骤”)。 示例:

声明式管道基础知识

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

Jenkinsfile(声明性管道):

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

脚本化管道基础知识

在脚本管道语法中,一个或多个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. 定义“构建”阶段。 stage块在脚本管道语法中是可选的。但是,在脚本化管道中实现stage块可以使Jenkins UI中的每个阶段的任务/步骤子集更加清晰可见。
  3. 执行一些与“构建”阶段有关的步骤。
  4. 定义“测试”阶段。 5
  5. 执行一些与“测试”阶段相关的步骤。
  6. 定义“部署”阶段。
  7. 执行一些与“部署”阶段相关的步骤。

管道示例

下面是一个使用声明式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'
        }
    }
}