无法使用Jenkins在远程主机上在后台并行运行多个命令
我有一个jenkins作业DSL,它在远程节点(Linux操作系统)上运行,使用“限制此项目可以运行的位置”标签 它有“构建”步骤->执行shell 在我提到的executeshell中无法使用Jenkins在远程主机上在后台并行运行多个命令,jenkins,parallel-processing,background,ansible,jenkins-job-dsl,Jenkins,Parallel Processing,Background,Ansible,Jenkins Job Dsl,我有一个jenkins作业DSL,它在远程节点(Linux操作系统)上运行,使用“限制此项目可以运行的位置”标签 它有“构建”步骤->执行shell 在我提到的executeshell中 sh /app/runalljobs.sh & 在远程节点主机runalljobs.sh上,如下所示: cat runalljobs.sh ansible-playbook /app/test.yml -e argu=arg1 ansible-playbook /app/test.yml -e ar
sh /app/runalljobs.sh &
在远程节点主机runalljobs.sh上,如下所示:
cat runalljobs.sh
ansible-playbook /app/test.yml -e argu=arg1
ansible-playbook /app/test.yml -e argu=arg2
.....
.....
ansible-playbook /app/test.yml -e argu=arg16
假设runalljob.sh在执行runalljob.sh时在后台启动16个ansible进程
当从远程节点putty shell手动执行脚本时,这种方法可以很好地工作
但是,当使用jenkins作业调用ansible进程时,我希望脚本启动ansible进程,使其在远程节点的后台运行,但这并没有发生
我还试着评论sh/app/runalljobs.sh&
并在“执行shell”中添加单个ansible命令,如下所示:
ansible-playbook /app/test.yml -e argu=arg1 &
ansible-playbook /app/test.yml -e argu=arg2 &
.....
.....
ansible-playbook /app/test.yml -e argu=arg16 &
但这也不会触发目标节点上的ansible进程
如果我删除“&”,然后所有ansible命令在remote上一个接一个地连续运行,它就会起作用
但是,我希望所有ansible命令都在后台并行触发,Jenkins执行器应该继续执行其他execute shell任务
你能建议我如何满足要求吗?詹金斯允许你并行执行任务,但有一个陷阱。这需要您切换到,然后使用。然后,您的构建脚本将如下所示:
pipeline {
agent 'my-remote-machine'
stages {
...
stage('Ansible stuff') {
parallel {
stage('arg1') {
steps {
sh 'ansible-playbook /app/test.yml -e argu=arg1'
}
}
stage('arg2') {
steps {
sh 'ansible-playbook /app/test.yml -e argu=arg2'
}
}
...
}
}
}
}
如果您的命令行非常类似(如示例中所示),则可以使用第节来简化代码:
matrix {
axes {
axis {
name 'ARG'
values 'arg1', 'arg2', 'arg3'
}
}
stages {
stage('test') {
sh 'ansible-playbook /app/test.yml -e argu=${ARG}'
}
}
}
我知道这个解决方案是一个根本性的改变——詹金斯管道是一个全新的CI世界。但这可能是值得努力的,因为Jenkins的作者们非常推崇管道,而且许多插件都被重写以与之配合使用。尽管@Tupteq your solution起作用,但我想要的是一个作业解决方案,而不是管道解决方案。如果我们有20到30个命令,那么我们就有相等数量的阶段,这会影响Jenkins管道阶段视图,浏览器挂起会消耗大量内存。是的,Jenkins很重。您可以通过在一个阶段或类似的阶段中将多个命令分组来“优化”(注意引号)。詹金斯经常需要妥协,但肯定能够处理你的任务。