You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Groovy实现命令输出转CSV并循环传入变量合并结果

解决方案

核心思路

  1. 解析项目列表输出,提取所有唯一的Project名称(跳过表头与空行)
  2. 针对每个Project,执行带过滤条件的流查询命令,仅获取该项目关联的流数据
  3. 合并所有流查询结果(仅保留一次表头),最终写入单个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 02:25:56