【问题标题】:Unable to run multiple command parellely in background on remote host using Jenkins无法使用 Jenkins 在远程主机的后台并行运行多个命令
【发布时间】:2020-02-26 22:59:07
【问题描述】:

我有一个 jenkins 作业 DSL,它使用“限制此项目可以在哪里运行”标签在远程节点(Linux 操作系统)上运行。

它有“构建”步骤->“执行外壳”

在我提到的执行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 &

并在“执行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 parallel-processing background ansible jenkins-job-dsl


    【解决方案1】:

    Jenkins 允许您并行执行任务,但有一个问题。这需要您切换到Jenkins Pipeline,然后使用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 的作者对 Pipelines 进行了大力推广,并且许多插件都被重写以与它们一起使用。

    【讨论】:

    • 虽然@Tupteq 您的解决方案有效,但我想要一个工作解决方案而不是管道。如果我们有 20 到 30 个命令,那么我们有相同数量的阶段,这会对 Jenkins 管道阶段视图产生影响,并且浏览器挂起会消耗大量内存。
    • 是的,詹金斯很重。您可以通过在一个阶段或类似的某个阶段将多个命令分组来“优化”(注意引号)。 Jenkins 经常需要妥协,但绝对应该能够处理您的任务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多