Jenkins流水线:如何正确存储并读取Shell命令返回的变量
问题分析与解决
你的流水线存在两个关键问题,导致版本变量无法正确输出:
1. Shell命令未捕获输出
Jenkins Pipeline中,sh步骤默认不会返回命令的标准输出,必须添加returnStdout: true参数,才能把命令执行结果赋值给Groovy变量。你当前的写法仅执行了Shell命令,并没有把输出存到version变量中。
2. 单引号字符串不解析变量
Groovy里,单引号包裹的字符串是字面量字符串,不会解析其中的${version}变量,只会原样输出。必须用双引号包裹才能触发变量解析。
修改后的完整流水线代码
pipeline { agent any parameters { string(description: '输入要构建的Git分支', name: 'branch', defaultValue: 'master', trim: true) choice(choices: 'Build\nPromote', description: '选择构建类型', name: 'runtype') } stages { stage('Checkout') { steps { script { // 简化冗余的if-else逻辑 def targetBranch = params.branch ?: 'master' echo "构建分支/标签: ${targetBranch}" checkout([ $class: 'GitSCM', branch: targetBranch, extensions: [], userRemoteConfigs: [[credentialsId: 'Aiman_Sarosh_cred', url: 'https://mygit.server/myproject.git']] ]) echo "工作目录: ${WORKSPACE}" sh "ls -l ${WORKSPACE}" } } } stage('Zip') { steps { script { // 添加returnStdout: true捕获Shell输出,同时trim去掉换行符 def version = sh( script: 'grep -m 1 version_number ${WORKSPACE}/ComponentInfo.toml | tr -s \' \' | tr -d \'"\' | tr -d "\'" | cut -d\' \' -f3', returnStdout: true ).trim() // 用双引号解析变量 echo "Version: ${version}" } } } } }
额外优化说明
- 简化了Checkout阶段的冗余if-else逻辑,用
params.branch ?: 'master'处理空分支的情况,减少重复代码。 - 给
sh的返回结果添加了.trim(),避免输出末尾带换行符影响后续打包操作。
内容的提问来源于stack exchange,提问作者aiman
相关产品推荐
相关产品推荐

