我在Jenkinsfile (Groovy)上有类似的东西,我想在一个变量中记录标准输出和退出码,以便以后使用这些信息。
sh "ls -l"
我该如何做到这一点呢,特别是当您似乎无法在Jenkinsfile中真正运行任何类型的groovy代码时?
我在Jenkinsfile (Groovy)上有类似的东西,我想在一个变量中记录标准输出和退出码,以便以后使用这些信息。
sh "ls -l"
我该如何做到这一点呢,特别是当您似乎无法在Jenkinsfile中真正运行任何类型的groovy代码时?
当前回答
最新版本的管道sh步骤允许您执行以下操作;
// Git committer email
GIT_COMMIT_EMAIL = sh (
script: 'git --no-pager show -s --format=\'%ae\'',
returnStdout: true
).trim()
echo "Git committer email: ${GIT_COMMIT_EMAIL}"
另一个特性是returnStatus选项。
// Test commit message for flags
BUILD_FULL = sh (
script: "git log -1 --pretty=%B | grep '\\[jenkins-full]'",
returnStatus: true
) == 0
echo "Build full flag: ${BUILD_FULL}"
这些选项是根据此问题添加的。
sh命令请参见官方文档。
对于声明式管道(见注释),你需要将代码包装到脚本步骤:
script {
GIT_COMMIT_EMAIL = sh (
script: 'git --no-pager show -s --format=\'%ae\'',
returnStdout: true
).trim()
echo "Git committer email: ${GIT_COMMIT_EMAIL}"
}
其他回答
如何读取groovy中的shell变量/如何将shell返回值分配给groovy变量。
要求:打开一个文本文件,使用shell读取行,并将值存储在groovy中,并获取每行的参数。
这里,是分隔符
例:releaseModule.txt
./APP_TSBASE/app/team/i-home/deployments/ip-cc.war/cs_workflowReport.jar,configurable-wf-report,94,23crb1,artifact
./APP_TSBASE/app/team/i-home/deployments/ip.war/cs_workflowReport.jar,configurable-temppweb-report,394,rvu3crb1,artifact
========================
这里想要获得模块名称的第2个参数(configuration -wf-report),不构建第3个参数(94),提交id第4 (23crb1)
def module = sh(script: """awk -F',' '{ print \$2 "," \$3 "," \$4 }' releaseModules.txt | sort -u """, returnStdout: true).trim()
echo module
List lines = module.split( '\n' ).findAll { !it.startsWith( ',' ) }
def buildid
def Modname
lines.each {
List det1 = it.split(',')
buildid=det1[1].trim()
Modname = det1[0].trim()
tag= det1[2].trim()
echo Modname
echo buildid
echo tag
}
对于那些需要在后续shell命令中使用输出的人,而不是groovy,可以像这样做:
stage('Show Files') {
environment {
MY_FILES = sh(script: 'cd mydir && ls -l', returnStdout: true)
}
steps {
sh '''
echo "$MY_FILES"
'''
}
}
我发现code maven上的示例非常有用。
这是一个例子,我相信这是有意义的!
node('master'){
stage('stage1'){
def commit = sh (returnStdout: true, script: '''echo hi
echo bye | grep -o "e"
date
echo lol''').split()
echo "${commit[-1]} "
}
}
简单的回答是:
sh "ls -l > commandResult"
result = readFile('commandResult').trim()
我认为存在一个特性请求能够得到sh步骤的结果,但据我所知,目前没有其他选择。
编辑:詹金斯- 26133
EDIT2:不太确定从哪个版本开始,但是sh/bat步骤现在可以返回std输出,简单地说:
def output = sh returnStdout: true, script: 'ls -l'
以上方法都是可行的。但是要在你的代码中使用var作为env变量,你需要先导出var。
script{
sh " 'shell command here' > command"
command_var = readFile('command').trim()
sh "export command_var=$command_var"
}
用您选择的命令替换shell命令。现在,如果你正在使用python代码,你可以指定os.getenv("command_var"),它将返回之前执行的shell命令的输出。