0

我有一个CD管道,需要用户在某些阶段确认,所以我想在管道等待用户输入时释放服务器资源。Jenkins 2声明性管道 - 是否有可能运行节点(代理任何)中的所有阶段,但有一些没有它运行?

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

有人可以确认这做我想做的事(没有代理/节点正在等待用户输入)?我没有看到如何验证它,在执行日志中没有什么不同...

如果不是,我该怎么做?

+0

你有在这里的回应https://stackoverflow.com/questions/42159221/use-a-lightweight-executor-for-a-declarative-pipeline-stage-agent-none –

+0

它看起来不错,但仍然引发一些问题,使用相同的标签可以在不同的阶段获得不同的节点(工作区)?我们该如何处理? – codependent

回答

0

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

为了证明这一点,因为你拥有它,你可以运行此代码,虽然它是在input阶段等待,去你的主詹金斯网页,并期待在构建执行人状态。你会看到有一个执行者仍然在执行你的工作。

接下来,将您的管道切换为agent none,并将agent any添加到所有其他步骤(除了输入步骤之外)并执行相同的测试。您可以看到,在输入阶段等待时,没有任何执行者被占用。

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

“希望”你会留在同一个节点上是不安全的,尽管詹金斯会“试着”让你留在那里。但即使如此,也不能保证您将获得相同的工作区目录。

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

+0

感谢您的信息。只是有几个疑问:我必须在存储时使用唯一的名称吗?例如连接“stashedArtifact”+ buildNumber。是否有任何问题存储工件,如战争或jar文件高达80MB? – codependent

+0

你可以将它命名为你想要的,并使用它来去除。但我不知道使用同一个名字存储多次的影响。它会打破还是结合?不确定。 关于大小的问题在这里的文档中得到解答:https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#code-stash-code-stash-some-files-to-be-二手稍后在最构建 –

相关问题