我想从此处复制的Jenkins groovy管道寻求帮助:是否可以在循环中创建并行的Jenkins声明性管道阶段?
我想在地图下的一组中传递 几 组var,在并行运行下的 几 阶段中传递。但是,只有最后一组(地图底部的方括号)被注册为我的地图。
当并行阶段运行时,映射成功进行迭代,但仅使用最后一组(当前为install_Stage(it)
)进行迭代,而忽略其他组。这意味着我得到了一个"stage: install ${product}"
并行显示四个阶段的管道,仅此而已。我想按照以下代码获得四个阶段(网络设置,还原和安装)的三个并行部分:
#!groovy
@Library('ci_builds')
def products = ["A", "B", "C", "D"]
def parallelStagesMap = products.collectEntries {
switch (it) {
case "A":
static_ip_address = "10.100.100.6"; static_vm_name = "install-vm1"; version = "14.1.60"
break
case "B":
static_ip_address = "10.100.100.7"; static_vm_name = "install-vm2"; version = "15.1"
break
case "C":
static_ip_address = "10.100.100.8"; static_vm_name = "install-vm3"; version = "15.1"
break
case "D":
static_ip_address = "10.100.100.9"; static_vm_name = "install-vm4"; version = "15.2"
break
default:
static_ip_address = "The product name is not on the switch list - please enter an ip address"
version = "The product name is not on the switch list - please enter a version"
break
}
["${it}" : network_reg(it)]
["${it}" : revert_to_snapshot_Stage(it)]
["${it}" : install_Stage(it)]
}
def network_reg(product) {
return {
stage("stage: setup network for ${product}") {
echo "setting network on ${static_vm_name} with ${static_ip_address}."
sh script: "sleep 15"
}
}
}
def revert_to_snapshot_Stage(product) {
return {
stage("stage: revert ${product}") {
echo "reverting ${static_vm_name} for ${product} on ${static_ip_address}."
sh script: "sleep 15"
}
}
}
def install_Stage(product) {
return {
stage("stage: install ${product}") {
echo "installing ${product} on ${static_ip_address}."
sh script: "sleep 15"
}
}
}
pipeline {
agent any
stages {
stage('non-parallel env check') {
steps {
echo 'This stage will be executed first.'
}
}
stage('parallel stage') {
steps {
script {
parallel parallelStagesMap
}
}
}
}
}
network_reg和revert_to_snapshot_Stage将不会运行(除非我将它们放置为最后一组而不是[“ $
{it}”:install_Stage(it)],在这种情况下,同样,仅运行并行阶段之一)
我不介意使用其他方法来运行多个映射定义,但其他方法如:如何在Jenkinsfile中定义和迭代映射不允许使用完整的多变量映射(超过键+值对)
任何帮助将不胜感激,谢谢!
我假设您遇到类似的问题,就像我试图动态构建并行分支以并行执行一样。
有两点非常重要:
复制循环变量(在您的情况下为it
),并仅在并行分支内使用该副本;如果您不这样做,那么所有分支(闭包)都将引用相同的变量,而该变量当然具有相同的值。这对于闭包而言尤其如此。另请参阅:http : //groovy-lang.org/closures.html。
不要使用collectEntries{}
。坚持使用Java风格的循环,因为通常情况下,groovy循环无法正常工作。一些.each{}
构造可能已经起作用,但是如果有疑问,请切换到Java循环。
以下精简示例对我有用。我相信您将能够根据需要进行调整。
def products = ["A", "B", "C", "D"]
def parallelStagesMap = [:]
// use java-style loop
for (def product: products) {
// make a copy to ensure that each closure will get it's own variable
def copyOfProduct = product
parallelStagesMap[product] = {echo "install_Stage($copyOfProduct)"}
}
echo parallelStagesMap.toString()
pipeline {
agent any
stages {
stage('parallel stage') {
steps {
script {
parallel parallelStagesMap
}
}
}
}
}
Pipeline: Groovy
插件,因为它们通常可以解决很多问题,这些问题通常在常规中有效,但不会在管道中解决。您可能想检查以下相关问题,其中也包含一个最小的示例: 为并行执行使用groovy
CPS闭包
下面是我简单的jenkins pipeline groovy脚本,它将用这两个阶段和我们想要构建的作业创建一个管道,我希望在job configuration下的脚本中每次都更新用于构建和代码分析的作业名,方法是从用户界面中获取数据,用户将使用Eclipse提供构建作业名和代码分析作业名- jenkinsfile脚本:-
有没有可能让詹金斯使用真正的浏览器而不是无头浏览器?我正在运行一些用TestNG编写的测试(使用Selenium webdriver)。当我运行testng时。在Eclipse中,浏览器启动并运行测试。但当我使用Jenkins并用maven运行测试时,它不会启动任何浏览器。
问题内容: 我正在尝试在Jenkins服务器上运行量角器测试,该服务器恰好是没有浏览器的Linux机器(Red Hat Enterprise Linux Server 6.6版)。因此,我做了一些研究,意识到我将不得不使用saucelabs。我有saucelab帐户。因此,我对如何编辑conf.js文件以及如何与包装盒中的ucelabs通信感到困惑。 这是我当前的conf.js文件 我的理解是我必
问题内容: 如何轻松地将Jenkins与qUnit集成?我将使用真正的浏览器(如firefox和chrome)运行测试。我的服务器在RedHat 6.1 Linux上运行。我想我都需要插件/库,但我仍然不知道如何使其工作。我第一次与Jenkins合作(在服务器端)。 //编辑: 如果有人也可以共享想法如何构建覆盖率报告,那将是很棒的。 提前致谢 :)。 问题答案: 说詹金斯和QUnit只是难题的一
我想做一些非常简单的事情,在一个文件夹中,我有一个jar文件和一个包含脚本的名为脚本的文件夹。但我可以让詹金斯拉链来做这件事。 zip目录:“awsdeploy”,排除:“”,glob:“”,“scripts/”,zipFile:“SQSToElasticProcessor.zip” 必须显式命名“zip”的参数。@ 第 31 行,第 16 列。
我有一个jenkins管道,它加载如下groovy实用程序脚本: 当我在主节点上执行管道时,一切都很好。在这种情况下,我可以在管道中使用类Utils中的方法。 当我试图在一个从系统中执行管道时,我的问题出现了。在这种情况下,上述负载会导致错误 Java语言io。IOException:java。io。FileNotFoundException:/var/lib/jenkins/utils/util