如何在多个代理上使用Jenkins管道的后续步骤?

Dan*_*ann 19 jenkins jenkins-pipeline

当使用詹金斯管道,其中每个阶段都会对不同的代理运行时,它是很好的做法,以使用agent none开头:

pipeline {
  agent none
  stages {
    stage('Checkout') {
      agent { label 'master' }
      steps { script { currentBuild.result = 'SUCCESS' } }
    }
    stage('Build') {
      agent { label 'someagent' }
      steps { bat "exit 1" }
    }
  }
  post {
    always {
      step([$class: 'Mailer', notifyEveryUnstableBuild: true, recipients: "test@test.com", sendToIndividuals: true])
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但这样做会导致Required context class hudson.FilePath is missing电子邮件出现时出现错误消息:

[Pipeline] { (Declarative: Post Actions)
[Pipeline] step
Required context class hudson.FilePath is missing
Perhaps you forgot to surround the code with a step that provides this, such as: node
[Pipeline] error
[Pipeline] }
Run Code Online (Sandbox Code Playgroud)

当我改为agent noneagent any,它工作正常.

如何在post不使用的情况下使用该步骤agent any

bur*_*ttk 27

step邮件包装成node一步:

post {
  always {
    node('awesome_node_label') {
      step([$class: 'Mailer', notifyEveryUnstableBuild: true, recipients: "test@test.com", sendToIndividuals: true])
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 有人可以解释一下吗?node是一个脚本化的管道吗?为什么必须编写此操作的脚本以及Jenkins在幕后做什么? (7认同)
  • @ red888当代理设置为none时,不分配任何节点。在OP的配置中,顶层代理没有设置,因此必须在每个阶段都设置代理。不幸的是,您不能在post块中设置代理,这就是为什么需要`node()`的原因。这是有关如何配置代理的文档。https://jenkins.io/doc/book/pipeline/syntax/#agent (3认同)
  • 我使用了`node('master')`,现在它可以工作了。谢谢。如果省略标签,则会出现错误`WorkflowScript:15:缺少必需的参数:“ label”`。你可以调整答案吗? (2认同)
  • 请注意,这将在构建结束时分配一个额外的执行器,这可能会导致死锁。假设您有 2 个执行程序和一个多分支管道。第一个执行器被分配,并开始在分支 A 上构建。在此构建期间,分配第二个执行器并在分支 B 上开始构建。分支 A 进入后期阶段,并尝试分配另一个执行器,但由于分支 B 正在构建,因此无法分配另一个执行器在上面。所以它开始等待。分支 B 进入构建后阶段并尝试分配另一个执行器,但由于分支 A 正在等待空闲执行器,因此无法分配另一个执行器。你完蛋了。 (2认同)

小智 7

我知道这是旧的,但我偶然发现了这个寻找相关的东西。如果你想在任何节点上运行 post 步骤,你可以使用

    post {
      always {
        node(null) {
          step([$class: 'Mailer', notifyEveryUnstableBuild: true, recipients: "test@test.com", sendToIndividuals: true])
        }
      }
    }
Run Code Online (Sandbox Code Playgroud)

https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#node-allocate-node说标签可以留空。很多时候在声明性管道中,如果某些内容留空,这会导致错误。要解决此问题,将其设置为 null 通常会起作用。