1

在此处输入图像描述

我想要一个看起来像这样的 Jenkins 构建流程。

  • 触发构建后,所有从站并行运行相同的作业(设置作业)。
  • 如果有任何奴隶未能完成这项工作,他们不应该继续。
  • 对于所有通过该工作的奴隶,他们应该从需要完成的工作池中获取一份工作。一旦奴隶完成了一项工作,他们应该回去完成池中的另一项工作。

几周前我才开始与 Jenkins 合作,他们现在设置它的方式是因为每个作业都由一个奴隶接手,他们必须先运行设置作业。这确实会减慢构建时间,因为我有大约 30 个作业,并且设置需要大约 2 分钟。

我使用 Jenkins 作为自动化测试平台,作业池中的所有作业都可以彼此独立运行。我目前有 5 个奴隶和约 30 个工作。

4

2 回答 2

0

似乎您想要在同一个工作中使用不同的阶段。这在 jenkins 2 的管道中变得更加容易。这里有一些图片: https ://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Stage+View+Plugin

[groovy] 代码最终看起来像这样:

node {
  stage 'Checkout'
  svn 'https://svn.mycorp/trunk/'
  stage 'Build'
  sh 'make all'
  stage 'Test'
  sh 'make test'
}
于 2017-03-31T18:37:19.167 回答
0

以下应该可以解决问题:

def jobPool = new ArrayDeque()
jobPool.add({
    echo "Doing stuff on ${env.NODE_NAME}"
});
jobPool.add({
    echo "Doing other stuff on ${env.NODE_NAME}, a little slower"
    sleep 4
});
jobPool.add({
    echo "Doing more stuff on ${env.NODE_NAME}, even slower"
    sleep 10
});
jobPool.add({
    echo "Doing stuff quick on ${env.NODE_NAME}"
});
jobPool.add({
    echo "Doing stuff quicker on ${env.NODE_NAME}"
});


def par = [:]

for (x in ["master", "urban"]) {
    def nodeName = x; // needed due to variable scoping
    par[nodeName] = {
        node (nodeName) {
            try {
               echo "Doing setup on ${env.NODE_NAME}!"
               // Do you're setup
               echo "Done with setup"
            } catch (Exception e) {
               echo "Will not use this node as it failed setup!"
               return;
            }
            while (true) {
               // echo "${jobPool.size()}"
                def subTask = jobPool.poll()
                //echo "${jobPool.size()} ${subTask}"
                if (subTask == null) {
                    break;
                }
                // Might wan't try catch around the next line if you wan't to continue if a job fails
                subTask()
            }
        }
    }
}
parallel par
if (!jobPool.isEmpty()) {
  error "Not all tasks was done!"
}

只需将您的“作业池作业”添加到jobPool变量并修改设置部分。

于 2017-03-31T18:06:51.837 回答