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

Unable to run multiple command parellely in background on remote host using Jenkins

我有一个 jenkins 作业 DSL 运行 在远程节点 (Linux OS) 上使用 "Restrict where this project can be run" 标签。

它有 "Build" 个步骤 -> "Execute shell"

在执行shell中我提到了

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

runalljobs.sh 假设在执行 runalljob.sh 时在后台启动 16 个 ansible 进程。

当从远程节点 putty shell 手动执行脚本时,这工作正常。

但是,我希望脚本在使用 jenkins 作业调用时在远程节点的后台启动 ansible 进程 运行,但这并没有发生。

我也试过评论sh /app/runalljobs.sh &

并在 "Execute 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 命令 运行,它就会工作。

但是,我希望在后台并行触发所有 ansible 命令,并且 Jenkins 执行程序应该继续执行其他执行 shell 任务。

你能建议我怎样才能达到要求吗?

Jenkins 允许您并行执行任务,但有一个问题。这需要您切换到 Jenkins Pipeline and then use of parallel。然后,您的构建脚本将如下所示:

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 部分来简化代码:

matrix {
    axes {
        axis {
            name 'ARG'
            values 'arg1', 'arg2', 'arg3'
        }
    }
    stages {
        stage('test') {
            sh 'ansible-playbook /app/test.yml -e argu=${ARG}'
        }
    }
}

我知道这个解决方案是一个彻底的改变——Jenkins Pipelines 是 CI 的全新世界。但这可能是值得的,因为流水线被 Jenkins 作者大力推广,许多插件被重写以与它们一起工作。