【发布时间】:2019-06-17 10:07:18
【问题描述】:
我正在尝试在声明性管道中调整一些旧的多作业。 我希望声明式管道中并行步骤的每个阶段都使用自己的执行程序。
我得到的行为是 Jenkins 使用同一个执行程序来运行所有阶段。
pipeline {
agent { label 'macmini'}
stages() {
stage('SCM') {
steps{
//clone repo
}
}
stage('Heavy build Stage'){
parallel {
stage ("First Job"){
steps {
//do some heavy work
sleep 100
}
}
stage ("Second Job"){
steps {
//do some heavy work
sleep 100
}
}
}
}
}
}
在上面的例子中,我希望那个阶段(“First Job”)和(“Second Job”)使用它自己的执行器。但是 Jenkins 只使用一个执行器来运行两个阶段……它们使用相同的工作区也很重要。
如果我在每个阶段之后设置一个代理/节点,它们将在自己的执行程序中运行,但它也会创建一个新的工作区 (my-job@2)。
编辑
为了让自己清楚,我习惯与 executor 一起工作,以平衡不同奴隶之间的工作工作。我(根据经验)知道每个从站可以并行运行 4 个阶段。这些作业由 webhook 触发。
所以如果工作开始我会得到
slave 1
1. idle
2. idle
3. (Heavy Build Stage) #1
4. idle
如果再触发三个作业,我将得到以下场景
slave 1
1. (Heavy Build Stage) #2
2. (Heavy Build Stage) #3
3. (Heavy Build Stage) #1
4. (Heavy Build Stage) #4
这意味着我正在运行 8 个阶段(2 个并行阶段 * 4 个构建)
我正在寻找的是一种分割每个阶段以使用它自己的执行器的方法,所以我可以得到以下场景
Build Queue
1. job #3
2. job #4
slave 1
1. (Heavy Build Stage / Second Jo) #2
2. (Heavy Build Stage / First job) #2
3. (Heavy Build Stage / Second Job) #1
4. (Heavy Build Stage / First job) #1
当我尝试在每个阶段之后设置代理/节点的解决方案时
stage("First Job"){
agent{ label SLAVE_NAME }
...
}
它可以工作,但每个阶段都在它自己的工作区中运行(使用@2 创建一个新文件夹),但我希望它们在同一个工作区中运行。
在为每个阶段使用 customWorkspace 选项时,我的行为相同
agent {
node {
label "macmini"
customWorkspace 'teste'
}
}
日志显示
Running in /Users/mobile/jenkins/teste
[Pipeline] {
[Pipeline] ws
Running in /Users/mobile/jenkins/teste@2
【问题讨论】:
-
代理的想法阻止你拥有相同的工作空间,如果他们在不同的机器上,这很明显,对吧?当它们在同一台机器上时还不明显,但它是不同的文件夹,所以实际上你必须确保使用安装在同一台机器上的代理以及使用
dir以确保它们会拾取/重用相同在里面工作的目录 -
我将添加更多信息以使自己清楚,但我相信我所期望的行为不受支持。
标签: jenkins jenkins-declarative-pipeline