Groovy实现命令输出转CSV并循环传入变量合并结果
解决方案
核心思路
- 解析项目列表输出,提取所有唯一的Project名称(跳过表头与空行)
- 针对每个Project,执行带过滤条件的流查询命令,仅获取该项目关联的流数据
- 合并所有流查询结果(仅保留一次表头),最终写入单个CSV文件
修改后的完整Jenkins Pipeline代码
import java.text.SimpleDateFormat import java.util.* import java.text.DateFormat ANALYSIS_HOME="/jenkins/analysis" pipeline { agent { label 'analysis && linux' } stages { stage('Fetch and Merge Data') { steps { script { withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'ANLYSIS', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) { // 1. 获取项目列表并保存为CSV def projectsList = sh( script: "${ANALYSIS_HOME}/bin/cov-manage-im --url https://example.com/ --on-new-cert trust --user ${USERNAME} --password ${PASSWORD} --mode projects --show --fields project,creation-date,last-modified-date", returnStdout: true ) def projectsCSV = "${ANALYSIS_HOME}/projects_output.csv" writeFile(file: projectsCSV, text: projectsList) println "Projects CSV saved to: ${projectsCSV}" // 2. 提取所有唯一的Project名称 def projectNames = projectsList.split('\n') .findAll { it.trim() != '' } // 过滤空行 .drop(1) // 跳过表头行 .collect { it.split(',')[0].trim() } // 提取第一列的Project值 .unique() // 去重,避免重复执行命令 // 3. 初始化合并后的流CSV内容(先写入表头) def mergedStreamsHeader = "Stream,Expiration,Primary Project\n" def mergedStreamsContent = mergedStreamsHeader // 4. 循环每个Project,查询对应流数据并合并 projectNames.each { project -> println "Fetching streams for project: ${project}" def streamOutput = sh( script: "${ANALYSIS_HOME}/bin/cov-manage-im --url https://example.com/ --on-new-cert trust --user ${USERNAME} --password ${PASSWORD} --mode streams --show --fields stream,expiration,primary-project --filter \"primary-project=${project}\"", returnStdout: true ) // 处理单项目流输出:跳过表头和空行 def streamLines = streamOutput.split('\n') .findAll { it.trim() != '' } .drop(1) // 将当前项目的流数据追加到合并内容 mergedStreamsContent += streamLines.join('\n') + '\n' } // 5. 保存合并后的流CSV文件 def mergedStreamsCSV = "${ANALYSIS_HOME}/merged_streams_output.csv" writeFile(file: mergedStreamsCSV, text: mergedStreamsContent) println "Merged streams CSV saved to: ${mergedStreamsCSV}" } } } } } }
关键细节说明
- Project提取逻辑:通过
split('\n')拆分输出为行,过滤空行后跳过表头,提取每行第一个逗号分隔的值,并用unique()去重,避免重复执行相同查询。 - 流查询过滤:在
cov-manage-im命令中添加--filter "primary-project=${project}"参数,确保仅返回当前项目关联的流数据。 - 合并输出处理:提前写入一次流数据的表头,后续循环仅追加每个项目的流数据行,避免重复表头。
- 空行处理:全程用
findAll { it.trim() != '' }过滤空行,避免生成的CSV出现无效空行。
内容的提问来源于stack exchange,提问作者Arpit Gupta
相关产品推荐
相关产品推荐

