惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

阮一峰的网络日志
阮一峰的网络日志
Hugging Face - Blog
Hugging Face - Blog
Recent Announcements
Recent Announcements
MongoDB | Blog
MongoDB | Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
G
Google Developers Blog
L
LangChain Blog
The GitHub Blog
The GitHub Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
GbyAI
GbyAI
MyScale Blog
MyScale Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
U
Unit 42
Martin Fowler
Martin Fowler
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Apple Machine Learning Research
Apple Machine Learning Research
爱范儿
爱范儿
博客园 - 聂微东
大猫的无限游戏
大猫的无限游戏
M
MIT News - Artificial intelligence
A
About on SuperTechFans
Stack Overflow Blog
Stack Overflow Blog
V
V2EX

晚花行乐

马克卡尼在2026年达沃斯论坛上的讲话(阅读材料) | 晚花行乐 鸡娃如何用力才是恰到好处 | 晚花行乐 读万卷书,行万里路的辩证关系 | 晚花行乐 反对培训机构掐尖招生 | 晚花行乐 小泽和建国会谈最后10分钟全文(阅读材料) | 晚花行乐 来看看 DeepSeek 怎么鸡娃 | 晚花行乐 谈谈基本功 | 晚花行乐 惠普 ProDesk SFF PC 各系列参数对比 | 晚花行乐 解决瘦客户机上安装 Debian 12 启动失败问题 | 晚花行乐 意拾喻言:老外写的文言文 | 晚花行乐 笠翁对韵中的典故(十三元) | 晚花行乐 谈谈中考取消四小门 | 晚花行乐 亚马逊云科技产品免费试用攻略(3) - 对象存储服务 | 晚花行乐 在 Windows 10 LTSC 版本上安装 WSL2 | 晚花行乐 Debian 12 的常用配置项 | 晚花行乐 在 Debian 12 上安装 Nvidia 显卡驱动程序 | 晚花行乐 解决 Debian 12 关机失败问题 | 晚花行乐 解决 VS Code 自动更新版本后卡在连接界面 | 晚花行乐 观看巴黎奥运会有感 | 晚花行乐 在 Windows10 上安装惠普旧打印机驱动程序 | 晚花行乐 欢迎关注公众号:晚花行乐 | 晚花行乐 如何编写拼写检查器 | 晚花行乐 亚马逊云科技产品免费试用攻略(2) - 云服务器 | 晚花行乐 Pandas 中 axis 参数的理解(附实例) | 晚花行乐 我打算命个名,叫什么什么 Manager | 晚花行乐 上海武康路历史建筑一览 | 晚花行乐 Python 实现简单的数学表达式解析并处理 | 晚花行乐 观看马拉松的感悟 | 晚花行乐 Python 保存 Cookies 到文件并再次读取 | 晚花行乐 如何为 Hugo 静态网站添加评论功能 | 晚花行乐
Jenkins Pipeline 如何输出 StdErr | 晚花行乐
2019-05-24 · via 晚花行乐

Jenkins Pipeline 中当命令执行错误时,Jenkin 目前还不能直接支持返回标准错误信息。本文讨论一种返回标准错误的方法。

举例

以一个简单的命令: ls 为例,说明 sh 的用法。 假设使用如下的 pipeline 文件,其中仅包含 ls / 命令

pipeline{
  agent any
  stages{
    stage('sh输出'){
      steps{
        script{
          out = sh(
            label: 'listing directory',
            returnStdout: true,
            script: "ls /"
          )
        }
      }
    }
  }
}

正常情况

StdOut

上面这段 Pipeline 定义文件里,重点是中间5行:

out = sh(
  label: 'listing directory',
  returnStdout: true,
  script: "ls /"
)

这段话将运行 script 指定的命令,也就是 ls / 的标准输出 StdOut 赋值给 out 变量。正常情况下,得到的是类似下面的:

bin boot dev etc home initrd.img lib lib64 lost+found media mnt ....

异常情况

StdErr

如果命令执行过程出现错误,比如实际执行的命令是针对不存在的路径,比如

out = sh(
  label: 'listing directory',
  returnStdout: true,
  script: "ls /notExist"
)

这个命令将在标准错误 StdErr 输出下面的信息:

ls: cannot access /notExist: No such file or directory

然而标准输出 StdOut 则为空。那么上面这种 Pipeline 写法有两个问题:

  • 不能返回执行命令的标准错误信息,只能返回 StdOut 内容,异常情况下为空
  • 不能抛错,使当前和后续 stage 停止,也不能中断整个任务,更不能将整个任务的状态标记为 Failure

下面介绍解决方案,以解决上面两个问题。

解决方法

目前的 Jenkins 版本,不提供输出标准错误 StdErr 的方法,不过可以通过下面的做法绕过:

  • 标准错误合并输出到标准输出,再输出到文件
  • 判断运行状态 returnStatus

具体是下面的写法:

pipeline{
  agent any
  stages{
    stage('sh输出'){
      steps{
        script{
          status = sh(
            label: 'listing directory',
            // 返回运行状态
            returnStatus: true, 
            // 合并标准错误 StdErr 到文件和标准输出 StdOut
            script: "ls /ff \>test.log 2>&1" 
          )
          // 从文件读出标准错误 StdErr 信息
          out = readFile(file: "test.log") 
          if (status != 0) {
            // 使当前 stage 运行失败,同时输出错误信息。
            error('TEST FAILED.') 
          }
        }
      }
    }
  }
}

这里面关键的一步 error() 的用法,见Declarative Pipeline 语法简介。执行了上面的语句之后,整个任务以失败结束:

同时后续的 Stage 都不再执行,从控制台日志里能看到:

Stage skipped due to earlier failure(s)

注意:上面合并标准错误的命令里,两次重定向的顺序不能颠倒,必须先导出到文件 >test.log ,再处理标准错误 2>&1

(全文完)

各位读后有什么想法,请在下方留言吧!如果对本文有疑问或者寻求合作,欢迎 联系邮箱邮箱已到剪贴板

精彩评论