无法使用Jenkins在远程主机上在后台并行运行多个命令

无法使用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

我有一个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 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很重。您可以通过在一个阶段或类似的阶段中将多个命令分组来“优化”(注意引号)。詹金斯经常需要妥协,但肯定能够处理你的任务。