Jenkins 2 声明性管道 - 是否可以 运行 节点内的所有阶段(任何代理)但其中一些 运行 没有它?

Jenkins 2 Declarative pipelines - Is it possible to run all stages within a node (agent any) but having some of them running without it?

我有一个 CD 管道,在某些阶段需要用户确认,所以我想在管道等待用户输入时释放服务器资源。

pipeline {
  agent any
  stages {
    stage ('Build Stage') {
      steps {
        ...
      }
    }
    stage ('User validation stage') {
      agent none
      steps {
         input message: 'Are you sure you want to deploy?'
      }
    }
    stage ('Deploy Stage') {
      steps {
        ...
      }
    }
  }
}

你可以在上面看到我有一个全局 agent any 但在用户验证阶段我添加了 agent none

有人可以确认这是我想要的吗(没有 agent/node 正在等待用户输入)?我不知道如何验证它,执行日志中没有什么不同...

如果没有,我该怎么做?

这不会像您预期的那样工作。您不能在整个管道上指定 agent any,然后期望 agent none 不占用执行程序。

为了证明这一点,您可以 运行 这段代码,当它在 input 阶段等待时,转到您的主要 jenkins 页面并查看 构建执行器状态。您会看到还有一个遗嘱执行人仍在 运行 处理您的工作。

接下来,将您的管道切换到 agent none 并将 agent any 添加到所有其他步骤(除了您的输入步骤)并进行相同的测试。可以看到在输入阶段等待的时候,none个executor都被占用了。

关于您关于不同节点上的不同工作区的问题...假设您使用的是来自 SCM 的代码,它将在每个新节点上检出,所以这不是问题。您唯一需要担心的是您在每个阶段创建的工件。

"hope" 将您留在同一个节点上是不安全的,尽管 Jenkins 会 "try" 将您留在同一节点上。但即便如此,也不能保证您将获得相同的工作区目录。

处理此问题的正确方法是 stash 您可能已创建或修改的所有文件,这些文件在以后阶段将需要。然后在接下来的阶段,unstash 需要的文件。永远不要假设文件会在具有自己的节点声明的阶段之间进行。