首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Jenkins管道脚本returnStatus值与shell中检查的状态不匹配?

为什么Jenkins管道脚本returnStatus值与shell中检查的状态不匹配?
EN

DevOps用户
提问于 2021-05-14 05:06:34
回答 1查看 7.3K关注 0票数 2

这是我的小新手Groovy脚本,试图拼凑出对Jenkins管道的一个非常初级的理解:

代码语言:javascript
复制
node {
 stage("hello") {
  def var = "val"
  echo "${var}"
  def stdout = sh( script: 'pwd', returnStdout: true ).trim()
  echo "${stdout}"
  def ret_status = sh( script: 'cd subdir', returnStatus: true )
  echo "${ret_status}"
 }
}

产出如下:

代码语言:javascript
复制
Started by user unknown or anonymous
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /home/user/workspace/newbie_dont_know_what_hes_doin
[Pipeline] {
[Pipeline] stage
[Pipeline] { (hello)
[Pipeline] echo
val
[Pipeline] sh
+ pwd
[Pipeline] echo
/home/user/workspace/newbie_dont_know_what_hes_doin
[Pipeline] sh
+ cd subdir
/home/user/workspace/newbie_dont_know_what_hes_doin@tmp/durable-2fa119e0/script.sh: 1: cd: can't cd to subdir
[Pipeline] echo
2
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

cd subdir的失败是有意的--演示捕获外壳规范和状态的机制。

**cd subdir returns状态中的不存在目录时, 2 <#>的 report D3reportreport<#>D4<>当 <#>cd**ing时,sh运行一个Bourne脚本。

代码语言:javascript
复制
$ echo $SHELL
/bin/bash
$ cd subdir
-bash: cd: subdir: No such file or directory
$ echo $?
1
$
EN

回答 1

DevOps用户

回答已采纳

发布于 2021-05-14 06:25:36

有几件事要注意。首先,在提供sh时,实际使用的解释器实际上是"sh",而不是"bash“。

查看一下BourneShellScript任务的Jenkins源代码,会发生的情况是,Jenkins实际上并不从子subshell返回退出代码--它监视一个名为"jenkins-result.txt“的文件以获取更改(使用FileMonitoringTask),当该文件被更新时,它只是将其内容指定为退出状态。

据我所见,当您调用"sh“时,它不仅运行您的脚本代码,而且实际上将它封装在一个相当大的样板代码块中(参见上面链接的BourneShellScript的第272行)。实际上,更接近于此的是:

代码语言:javascript
复制
sh -c ({ while [ -d '/home/user/workspace/newbie_dont_know_what_hes_doin@tmp/durable-2fa119e0' -a \\! -f '/home/user/workspace/newbie_dont_know_what_hes_doin@tmp/durable-2fa119e0/jenkins-result.txt' ]; do touch '/home/user/workspace/newbie_dont_know_what_hes_doin@tmp/durable-2fa119e0/jenkins-log.txt'; sleep 3; done } & jsc=durable-2fa119e0; JENKINS_SERVER_COOKIE=$jsc sh -xe '/home/user/workspace/newbie_dont_know_what_hes_doin@tmp/durable-2fa119e0/script.sh' > '/home/user/workspace/newbie_dont_know_what_hes_doin@tmp/durable-2fa119e0/jenkins-output.txt' 2> 'jenkins-log.txt'; echo $? > '/home/user/workspace/newbie_dont_know_what_hes_doin@tmp/durable-2fa119e0/jenkins-result.txt.tmp'; mv '/home/user/workspace/newbie_dont_know_what_hes_doin@tmp/durable-2fa119e0/jenkins-result.txt.tmp' '/home/user/workspace/newbie_dont_know_what_hes_doin\@tmp/durable-2fa119e0/jenkins-result.txt'; wait) >&- 2>&- &

这可能是支持执行脚本的节点不是执行管道的节点的场景,但是它在返回结果时确实留下了很大的错误空间,这取决于任何解释器"sh“的特性(不一定是bash)和运行它的操作系统。

票数 4
EN
页面原文内容由DevOps提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://devops.stackexchange.com/questions/13905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档