当前位置: 首页 > 面试题库 >

我可以使用Closure在Jenkins声明性管道中定义阶段吗?

岑熙云
2023-03-14
问题内容

我正在尝试做这样的事情:

def makeStage = {
  stage('a') {
    steps {
      echo 'Hello World'
    }
  }
} 
pipeline {
  agent none
  stages {
    makeStage()
  }
}

但这给了我这个例外:

WorkflowScript: 11: Expected a stage @ line 11, column 5.
   makeStage()
   ^

是否可以将阶段定义为外部闭包?


问题答案:

您不能在声明式管道之外定义阶段。声明性管道的主要目的是提供经过简化且自以为是的语法,因此您可以专注于应该做什么(通过使用一些可用的步骤)而不是如何去做。

如果您对更灵活的管道实现方式感兴趣,可以选择“
脚本化管道”方法,该语法在语法方面并不严格-仅受Groovy和CPS执行模块的限制。

您的示例中的工作(脚本)管道如下所示:

#!groovy

def makeStage = {
  stage('a') {
    echo 'Hello World'
  }
}

node {
    makeStage()
}

注意 :脚本化管道中没有任何steps方法stage。如果你把它留在那里

java.lang.NoSuchMethodError: No such DSL method 'steps' found among
    steps [archive, bat, build, catchError, checkout, deleteDir, dir,
    dockerFingerprintFrom, ...

声明式管道中的脚本

声明性管道定义了一个script步骤,可让您放置一段脚本化管道。但是,它仍然不允许您动态定义阶段或/和将阶段定义提取到函数或闭包中。scriptstep在舞台内部执行,因此无论舞台是否执行,您都无法在此块内进行控制。但是,在某些情况下,如果您想做一些比仅调用声明性管道的预定义步骤更复杂的操作,则此步骤可能非常有用。



 类似资料:
  • 我正在使用詹金斯声明管道,不知道是否有任何方法可以定期触发特定阶段。 我的意思是,当我们签出SCM时,管道会触发,但阶段2对我们的一些项目来说太长了。因此,我不想等待这个阶段,我只想每天运行这个阶段,但仍然将这个阶段保存在Jenkins文件中。 有没有办法做到这一点?这样做的最佳方法是什么?

  • 问题内容: 我正在使用声明性Jenkins管道来运行我的一些构建管道,并且想知道是否可以定义多个代理标签。 我有许多构建代理与我的Jenkins挂钩,并且希望此特定管道能够由具有不同标签的各种代理(但不能由ALL代理)构建。 更具体地说,假设我有2个代理,标签为“小”,4个为标签“中”,有6个为标签“大”。现在,我有一个非常节省资源的管道,我希望仅在“小型”或“中型”代理上执行,而不在大型代理上执

  • 问题内容: 如何报告声明式管道失败的阶段?在fail块中,我想获取failureStage.name并将其报告(最终报告为松弛)。 问题答案: PipelineVisitor是一种很好的方法。但是,如果您只想查看错误,那么利用可能会更好。 以下内容提供了每个失败步骤的映射列表,并且还遍历了下游作业。我发现它非常有用。 您将要使用共享库来避免安全沙箱警告/批准

  • 问题内容: 我需要在声明式管道中启动一组动态测试。为了更好的可视化目的,我想为每个测试创建一个阶段。有办法吗? 创建一个我知道的阶段的唯一方法是: 我已经看到了这个示例,但是我没有使用声明性语法。 问题答案: 使用声明性语法比声明性语法更具灵活性的脚本化语法,即使声明性文档和建议性更多。 例如,可以循环创建阶段:

  • 问题内容: 我正在尝试创建一个声明性的Jenkins管道脚本,但是简单变量声明存在问题。 这是我的脚本: 但是,我收到此错误: 我正在使用Jenkins 2.7.4和Pipeline 2.4。 问题答案: Jenkins Pipelines的Declarative模型具有受限制的语法子集,该子句允许在块中使用- 有关更多信息,请参见语法指南。您可以通过将步骤包装在一个块中来绕过该限制,但是结果,您

  • 我试图创建一个声明性詹金斯管道脚本,但有简单的变量声明问题。 以下是我的剧本: 然而,我得到了这个错误: 我在詹金斯2.7.4和管道2.4上。