没有这样的DSL方法阶段

xzabzqsa  于 2022-11-01  发布在  其他
关注(0)|答案(2)|浏览(167)

我正在尝试为Jenkins创建我的第一个Groovy脚本:
在看了这里的https://jenkins.io/doc/book/pipeline/之后,我创建了这个:

node {
  stages {

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

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

  }
}

然而,我得到:
java.lang.NoSuchMethodError: No such DSL method "stages" found among steps
我错过了什么?
另外,我如何将我的凭据传递到Git存储库而不以纯文本形式写入密码?

5kgi1eie

5kgi1eie1#

你是混淆和混合Scripted PipelineDeclarative Pipeline,为完全区别see here .但简短的故事:

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

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

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

因此,如果您想使用declarative pipeline,这是正确的方法。
如果你想scripted pipeline,那么你写:

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

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

例如:跳过阶段块。

bybem2ql

bybem2ql2#

Jenkinsfile可以使用两种语法编写-声明性脚本化
宣告式管缐和指令码管缐的建构方式完全不同。宣告式管缐是Jenkins Pipeline的最新功能,它:

  • 提供了比Scripted Pipeline语法更丰富的语法功能,并且
  • 是为了让撰写和阅读管缐程式码更容易而设计。

然而,许多写入Jenkinsfile的语法组件(或“步骤”)对于声明性管道和脚本化管道是通用的。例如:

声明性管道基础知识

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

Jenkinsfile(宣告式管缐):

pipeline {
    agent any 1
    stages { 
        stage('Build') { 2
            steps { 
                // 3
            }
        }
        stage('Test') { 4
            steps { 
                // 5
            }
        }
        stage('Deploy') { 6
            steps {
                // 7
            }
        }
    }
}

1.在任何可用代理上执行此管道或其任何阶段。
1.定义“构建”阶段。
1.执行与“构建”阶段相关的一些步骤。
1.定义“测试”阶段。
1.执行与“测试”阶段相关的一些步骤。
1.定义“部署”阶段。
1.执行与“部署”阶段相关的一些步骤。

脚本化管道基础知识

在脚本管道语法中,一个或多个node块在整个管道中执行核心工作。虽然这不是脚本管道语法的强制要求,但将管道的工作限制在node块内会产生两个效果:
1.通过向Jenkins队列中添加一个项来调度要运行的块中包含的步骤。只要节点上的执行器空闲,这些步骤就会运行。
1.创建一个工作区(特定于该特定管道的目录),在该工作区中可以对从源代码管理 checkout 的文件进行处理。

**警告:**根据您的Jenkins配置,某些工作区在一段时间不活动后可能不会自动清理。有关详细信息,请参阅JENKINS-2111中链接的票证和讨论。
Jenkinsfile(脚本管道):

node { 1
    stage('Build') { 2
        // 3
    }
    stage('Test') { 4
        // 5
    }
    stage('Deploy') { 6
        // 7
    }
}

1.在任何可用代理上执行此管道或其任何阶段。
1.定义“Build”阶段。stage块在Scripted Pipeline语法中是可选的。但是,在Scripted Pipeline中实现stage块可以在Jenkins UI中提供每个阶段的任务/步骤子集的更清晰的可视化。
1.执行与“构建”阶段相关的一些步骤。
1.定义“测试”阶段。5
1.执行与“测试”阶段相关的一些步骤。
1.定义“部署”阶段。
1.执行与“部署”阶段相关的一些步骤。

管道示例

下面是一个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'
        }
    }
}

相关问题