Jenkins Pipeline插件(又称Workflow)可以使用其他Multibranch
插件进行扩展,以自动构建分支和拉取请求。
运行多个配置的首选方法是什么?例如,使用Java 7和Java 8构建。这通常称为矩阵配置(因为有多种组合,例如语言版本,框架版本......)或构建变体。
我试过了:
stage
步骤连续执行它们。很好,但需要的时间比必要的多。parallel
步骤内执行它们,在其中分配或不分配node
。但是我无法使用stage
并行内部步骤来了解可视化的已知限制。有推荐的方法吗?
答案 0 :(得分:15)
Jenkins.io:在管道编码上下文中,“节点”是执行两件事的步骤,通常是通过从代理上的可用执行程序获取帮助来实现:
通过将其中的步骤添加到Jenkins构建队列来安排其中包含的步骤(这样,只要节点上的执行程序槽空闲,就会运行相应的步骤)
- 醇>
最佳做法是在节点内完成所有重要工作,例如构建或运行shell脚本,因为阶段中的节点块告诉Jenkins其中的步骤资源密集程度足以安排,从代理池请求帮助,并且只在他们需要时锁定工作区。
Vanilla Jenkins舞台中的节点块看起来像:
stage 'build' {
node('java7-build'){ ... }
node('java8-build'){ ... }
}
进一步扩展这一概念,Cloudbees撰写了关于parallelism and distributed builds with Jenkins的文章。您的Cloudbees工作流程可能如下所示:
stage 'build' {
parallel 'java7-build':{
node('mvn-java7'){ ... }
}, 'java8-build':{
node('mvn-java8'){ ... }
}
}
您可以通过任一工作流程满足您对可视化管道中不同构建的要求,但我相信Jenkins文档可以获得最佳实践。
要解决可视化@Stephen想要看到的问题,他是对的 - 它不起作用! Jenkins和is documented here提出了这个问题,涉及使用“标记块”的决议是still in progress :-(
问:是否有文档让管道用户不要将各个阶段放入并行步骤中?
A:不,如果完成,则认为这是不正确的用法;阶段仅作为管道中的顶级构造有效,这就是为什么标记块作为单独构造的概念已经成为......而且,我的意思是从管道中的并行步骤中删除阶段。
如果您尝试在并行作业中使用舞台,那么您将度过一段美好时光。
ERROR: The ‘stage’ step must not be used inside a ‘parallel’ block.
答案 1 :(得分:4)
我建议使用Declarative Matrix作为在Jenkins中运行多个配置的首选方法。它允许您为每个配置执行定义的阶段,而无需重复代码。
示例:
pipeline {
agent none
stages {
stage('Test') {
matrix {
agent {
label "${NODENAME}"
}
axes {
axis {
name 'NODENAME'
values 'java7node', 'java8node'
}
}
stages {
stage('Test') {
steps {
echo "Do Test for ${NODENAME}"
}
}
}
}
}
}
}
请注意,声明性Matrix是本机声明性管道功能,因此不需要额外的插件安装。
Jenkins blog post关于矩阵指令。
答案 2 :(得分:2)
如@StephenKing所述,Blue Ocean将显示比当前阶段视图更好的并行分支。计划即将推出的舞台视图版本将能够显示所有分支,但它不会在视觉上指示任何嵌套结构(看起来与串行运行配置相同)。
无论如何,更深层次的问题是,在解决JENKINS-27395和相关请求之前,您基本上只会获得整体构建的通过/未通过状态。
答案 3 :(得分:2)
为了测试几个平台上的每个提交,我使用了这个基础Jenkinsfile骨架:
def test_platform(label, with_stages = false)
{
node(label)
{
// Checkout
if (with_stages) stage label + ' Checkout'
...
// Build
if (with_stages) stage label + ' Build'
...
// Tests
if (with_stages) stage label + ' Tests'
...
}
}
/*
parallel ( failFast: false,
Windows: { test_platform("Windows") },
Linux: { test_platform("Linux") },
Mac: { test_platform("Mac") },
)
*/
test_platform("Windows", true)
test_platform("Mac", true)
test_platform("Linux", true)
有了这个,从顺序执行切换到并行执行相对容易,每个执行都有其优点和缺点:
我暂时使用顺序执行,直到找到更好的解决方案。
答案 4 :(得分:1)
至少BlueOcean UI似乎有一种解脱。这是我得到的(tk-*
节点是并行步骤):