我正在尝试为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存储库?
答案 0 :(得分:50)
您将Scripted Pipeline
与Declarative Pipeline
混淆并混淆,以获得完全不同see here。但短篇小说:
因此,如果我们查看您的脚本,您首先要打开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
}
}
}
}
在脚本管道语法中,一个或多个node
块在整个管道中完成核心工作。尽管这不是脚本化管道语法的强制性要求,但是将管道的工作限制在node
块中有两件事:
通过将项目添加到Jenkins队列中来计划要运行的块中包含的步骤。一旦节点上的执行者有空,这些步骤就会运行。
创建一个工作空间(特定于该特定管道的目录),在该工作空间中可以处理从源代码管理中检出的文件。
警告:根据您的Jenkins配置,一段时间不活动后,某些工作区可能不会自动清理。有关更多信息,请参见JENKINS-2111链接的票证和讨论。
Jenkinsfile(脚本管道):
node { 1
stage('Build') { 2
// 3
}
stage('Test') { 4
// 5
}
stage('Deploy') { 6
// 7
}
}
stage
块在脚本管道语法中是可选的。但是,在脚本化管道中实现stage
块可以使Jenkins UI中的每个阶段的任务/步骤子集更加清晰可见。 下面是一个使用声明式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'
}
}
}