目标
在同一节点上运行声明性Jenkins管道的多个阶段。
设置
这只是说明问题的一个最小示例。有两个Windows节点“Windows-slave1”和“Windows-slave2”都标有“Windows”标签。
注意:我的real Jenkins文件不能使用全局代理,因为需要在不同的节点(例如Windows和Linux)上运行多组阶段。
预期行为
Jenkins基于标签选择阶段1中的一个节点,并在阶段2中使用相同的节点,因为变量windowsNode已更新为阶段1中选择的节点。
实际行为
“阶段2”有时运行在与“阶段1”相同的节点上,有时运行在不同的节点上。请参见下面的输出。
詹金斯档案
#!groovy
windowsNode = 'windows'
pipeline {
agent none
stages {
stage('Stage 1') {
agent {
label windowsNode
}
steps {
script {
// all subsequent steps should be run on the same windows node
windowsNode = NODE_NAME
}
echo "windowsNode: $windowsNode, NODE_NAME: $NODE_NAME"
}
}
stage('Stage 2') {
agent {
label windowsNode
}
steps {
echo "windowsNode: $windowsNode, NODE_NAME: $NODE_NAME"
}
}
}
}
输出
[Pipeline] stage
[Pipeline] { (Stage 1)
[Pipeline] node
Running on windows-slave2 in C:\Jenkins\workspace\test-agent-allocation@2
[Pipeline] {
[Pipeline] script
[Pipeline] {
[Pipeline] }
[Pipeline] // script
[Pipeline] echo
windowsNode: windows-slave2, NODE_NAME: windows-slave2
[Pipeline] }
[Pipeline] // node
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Stage 2)
[Pipeline] node
Running on windows-slave1 in C:\Jenkins\workspace\test-agent-allocation
[Pipeline] {
[Pipeline] echo
windowsNode: windows-slave2, NODE_NAME: windows-slave1
[Pipeline] }
[Pipeline] // node
[Pipeline] }
[Pipeline] // stage
[Pipeline] End of Pipeline
Finished: SUCCESS
你知道设置有什么问题吗?我想这就是Jenkins文件的解析和执行方式。
其他建议?最初设置windowsNode时,可能有一个Jenkins API可以根据“windows”标签选择节点。
我发现这是你所期望的
#!groovy
windowsNode = 'windows'
pipeline {
agent none
stages {
stage('Stage 1') {
steps {
node(windowsNode) {
script {
// all subsequent steps should be run on the same windows node
windowsNode = NODE_NAME
}
echo "windowsNode: $windowsNode, NODE_NAME: $NODE_NAME"
}
}
}
stage('Stage 2') {
steps {
node(windowsNode) {
echo "windowsNode: $windowsNode, NODE_NAME: $NODE_NAME"
}
}
}
}
}
您可以在脚本块中定义阶段。这些阶段是在给定代理中运行的父阶段的子阶段。这是我在一个与你类似的用例中必须使用的方法。
#!groovy
windowsNode = 'windows'
pipeline {
agent none
stages {
stage('Stage A') {
agent {
label windowsNode
}
steps {
script {
stage('Stage 1') {
windowsNode = NODE_NAME
echo "windowsNode: $windowsNode, NODE_NAME: $NODE_NAME"
}
stage('Stage 2') {
echo "windowsNode: $windowsNode, NODE_NAME: $NODE_NAME"
}
}
}
}
}
}
自1.3版声明性管道插件以来,这一功能得到了官方支持。官方称之为“连续阶段”。
pipeline {
agent none
stages {
stage("check code style") {
agent {
docker "code-style-check-image"
}
steps {
sh "./check-code-style.sh"
}
}
stage("build and test the project") {
agent {
docker "build-tools-image"
}
stages {
stage("build") {
steps {
sh "./build.sh"
}
}
stage("test") {
steps {
sh "./test.sh"
}
}
}
}
}
}
官方公告如下:https://jenkins.io/blog/2018/07/02/whats-new-declarative-piepline-13x-sequential-stages/
问题内容: 目标 在同一节点上运行声明性Jenkins管道的多个阶段。 安装程序 这只是显示问题的一个最小示例。有2个Windows节点“ windows-slave1”和“ windows-slave2”,均标有“ windows”标签。 注意:我真正的Jenkinsfile无法使用全局代理,因为存在需要在不同节点上运行的阶段组(例如Windows与Linux)。 预期行为 Jenkins根据标
我试图在jenkins管道中的不同节点上运行不同的阶段,比如第一阶段是签出,第二阶段是构建,第三阶段是单元测试。例如: 如果我尝试这样做,我的问题是如果我在Linux1节点中签出代码,那么当签出的代码在node1中时,为什么其他阶段可以在不同的节点中运行。 代码将如何分布,如果我的理解不正确,我如何实现并行,并确保每个阶段都可以并行并减少时间。 如果可能,请推荐任何用于编写Jenkins管道的gr
我有一个多分支管道架构的以下Jenkinsfile 我试图在Ubuntu和Red Hat节点上并行运行“构建”阶段,而仅在Ubuntu节点上运行“测试”阶段。 任何人都可以帮助我指定如何选择在哪些节点上运行哪些阶段。我在网上找到的解决方案很少,但他们建议重写构建阶段两次:一次用于Red Hat节点,另一次用于Ubuntu节点。难道没有办法在没有代码重复的情况下做到这一点吗? 非常感谢
目前,Jenkins 上有多个管道(A、B、C)和节点(X、Y、Z)。我们启用了 Throttle Concurrent Builds 插件,以确保管道中只有一个构建在单个节点上运行。 问题是,使用这种方法,来自不同管道的构建可能会发生冲突(例如,管道A可能已经在节点X上执行,我们不希望任何其他管道在节点X上执行,直到管道A完成)。TCB插件确保来自单个管道的多个构建不会在一个节点上运行,但它不会
我的Jenkins流水线并行运行多个任务。似乎如果一个阶段失败,所有后续阶段将运行其<code>failure</code>post块(无论它们是否实际失败)。我不知道这是故意的还是我做错了什么。 注意:这个管道运行在一个Windows节点上,因此< code>bat('exit /b 1') 在上面的管道中,只有“失败阶段”失败,但在输出中我看到了这一点,这表明对这两个步骤都执行了< code>
我有几个不同repo的Jenkins声明性管道,它们触发数据库刷新,以及依赖于数据库的单元测试。这些Jenkins作业是从GitHub中的pull请求触发的。 为了避免资源冲突,我需要防止这些作业同时运行——无论是在每个项目内还是在各个项目之间。 “油门并发构建”插件似乎就是为此而构建的。 我已经安装了插件,并配置了如下类别: 我在Jenkins文件中添加了“throttle”选项,其中一个存储库