arrays - 基于文本文件内容jenkins管道迭代并行循环动态阶段
问题描述
我是 jenkins dsl groovy 脚本的新手。我有一个参数化的詹金斯作业,它需要两个输入 $param1 $param2 我有两个阶段。第一阶段生成 output.txt 文件,该文件在工作区中具有如下内容。output.txt 文件根据 stage1 中的 shell 脚本执行更改内容。所以,这些值是动态的 output.txt
svn-test
svn_prod
svn_dev
第二阶段必须从文件 output.txt 中获取输入并在并行循环中迭代动态创建阶段。我有以下代码,但它不接受 output.txt 文件的输入。我无法在舞台上覆盖数组并并行迭代
def jobs = []
def parallelStagesMap = jobs.collectEntries {
["${it}" : generateStage(it)]
}
def generateStage(job) {
return {
stage("stage: ${job}") {
script{
git credentialsId: 'github', url: 'ssh://github.com/promp/${job}.git', branch: master
echo "This is ${job}."
sh ''' make ${parameter1}@"${paramete2}" '''
}
}
}
}
pipeline {
agent any
parameters {
parameters {
string(name: 'parameter1', defaultValue: 'UIAutomation', description: 'Please enter the value')
string(name: 'parameter2', defaultValue: 'UISite', description: 'Please enter the value')
}
stages {
stage('non-parallel stage') {
steps {
script {
echo 'This stage will be executed first.'
sh '''./rotate_script.sh output.txt'''
}
}
}
stage('parallel stage') {
failFast false
steps {
script {
def filePath = readFile('output.txt').trim()
def lines = filePath.readLines()
line.each {
// I have tried to read lines and pass it value. It didn't workout``
}
parallel parallelStagesMap
}
}
}
}
}
理想情况下,这就是我的第二阶段之一的样子,并根据 output.txt 文件创建多个并行阶段
stage('svn-test'){
steps{
sh 'mkdir -p svn-test'
dir("svn-test"){
script{
git credentialsId: 'github', url: 'ssh://github.com/promp/svn-test.git', branch: master
sh ''' make ${parameter1}@"${parameter2}"
'''
}
}
}
}
解决方案
我终于得到了这样的工作。我不得不将我的 Groovy List 和 the 移动parallelStageMap
到我的管道中。当StageMap
您的列表为空时,将在脚本开头设置,因此您永远不会得到任何结果。如果在填充列表后移动它,它将起作用。
def generateStage(job) {
return {
stage("stage: ${job}") {
script{
git credentialsId: 'github', url: 'ssh://github.com/promp/${job}.git', branch: master
echo "This is ${job}."
sh ''' make ${parameter1}@"${paramete2}" '''
}
}
}
}
pipeline {
agent any
parameters {
string(name: 'parameter1', defaultValue: 'UIAutomation', description: 'Please enter the value')
string(name: 'parameter2', defaultValue: 'UISite', description: 'Please enter the value')
}
stages {
stage('non-parallel stage') {
steps {
script {
echo 'This stage will be executed first.'
sh '''./rotate_script.sh output.txt'''
}
}
}
stage('parallel stage') {
failFast false
steps {
script {
def jobs=[]
def filePath = readFile('output.txt').trim()
def lines = filePath.readLines()
lines.each { job ->
jobs.add("${job}")
}
def parallelStagesMap = jobs.collectEntries {
["${it}" : generateStage(it)]
}
parallel parallelStagesMap
}
}
}
}
}
推荐阅读
- javascript - 无法读取未定义的 React.js 的属性“绑定”
- selenium - 在 Safari 上使用 Selenium 时无法选择要 Airplay 的设备
- sql-server - 处理 sql 时态表和用户定义的数据类型
- python - Tensorflow 在 python shell 中工作,但不在 python 文件中
- queue - Websphere MQ:队列管理器无法连接
- monitoring - 从 influxdb 内部数据库获取指标
- javascript - 使用 window.open 通过“Post”参数打开新窗口
- delphi - 在 Delphi 中取消引用和分配指针的语法
- python - 根据条件重复数据框行
- c - 过滤 Arp 回复