无法在 Jenkins 管道作业中通过 DSL (groovy) 存储 sh 命令输出

2024-06-28

我想获得管道 Jenkins 作业中的最后构建输出并附加在电子邮件中(使用 emailext 插件)。 Curl 工作正常并提供正确的构建输出,但我无法存储在变量中以附加在电子邮件中。我正在使用最新的詹金斯版本。

我可以看到有几个关于简单 sh 命令的相关帖子,但这不适用于curl 响应存储。

尝试过的代码:

1.

def consoleOutput = sh(returnStdout: true, script: 'curl http://' + jenkinsUser + ':' + jenkinsUserToken + '@' + jenkinsServer + ':8080/job/' + 'myJob/lastBuild/consoleText').trim()
echo consoleOutput

2.

sh 'curl http://' + jenkinsUser + ':' + jenkinsUserToken + '@' + jenkinsServer + ':8080/job/' + "${env.JOB_NAME}" + '/lastBuild/consoleText; echo $? > status'
def consoleOutput = readFile('status').trim()

3.

def consoleOutput = sh(script: 'curl http://' + jenkinsUser + ':' + jenkinsUserToken + '@' + jenkinsServer + ':8080/job/' + '/myJob/lastBuild/consoleText', returnStatus: true).split("\r?\n")
echo consoleOutput

看起来您缺少内部数组和一些双引号以及用于运行脚本的转义双引号:

sh([ script: "curl \"http://${jenkinsUser}:${jenkinsUserToken}@${jenkinsServer}:8080/job/myJob/lastBuild/consoleText\"").trim()

此外,还有多种方法可以执行 shell 脚本,这取决于詹金斯管道的类型您正在使用。

In a 詹金斯声明式管道 https://jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline你需要包括一个script {...}所有脚本类型代码和设置变量的块,看起来像这样:

pipeline { 
    agent {
        ...
    } 
    parameters {
        ...
    }
    environment {
   ...
   }
   stages {
        stage('Run Required Scripts') {
            steps {
               ...
                script {
                    NOTIFIER_BULD_NAME = sh([script: "./getNotifier.sh", returnStdout: true]).trim()
                    EMAIL_TEXT = sh([script: "./printEmailText.sh ${CURRENT_BUILD}  ${PREVIOUS_BUILD}", returnStdout: true]).trim()
                    BODY= sh([ script: "curl \"http://${jenkinsUser}:${jenkinsUserToken}@${jenkinsServer}:8080/job/myJob/lastBuild/consoleText\"").trim()
                }
            }
        }
        stage('Send Email') {
            when {
                expression {
                    // Only send when there is text.
                    "${EMAIL_TEXT}" != "";
                }
            }
            steps{
                emailext (
                    to: '[email protected] /cdn-cgi/l/email-protection',
                    subject: "You have mail - ${EMAIL_TEXT}",
                    body: """${NOTIFIER_BULD_NAME} - ${EMAIL_TEXT}: 
... 
${BODY}
""",
                     attachLog: false
                 )
            }
        }
    }

In a Jenkins 脚本化管道 https://jenkins.io/doc/book/pipeline/syntax/#scripted-pipeline,你不需要script{}块,实际上你可以把它放在大多数地方。大多数情况下我把它放在舞台块中stage('some stage'){...}我是这样做的:

V5_DIR = WORKSPACE + '/' + sh([script: "basename ${V5_GIT_URL} .git", returnStdout: true]).trim()

虽然我也使用了curl命令(用于脚本化管道)并且不需要内部数组......

lastSuccessfulCommit = sh(
     script: "curl -sL --user ${JENKINS_API_USER}:${JENKINS_API_PSW} \"${lastSuccessfulCommitUrl}\" | sed -e 's/<[^>]*>//g'",
     returnStdout: true
)

作为参考,回显变量在两个中看起来都是这样的

 sh([script: "echo \"Value: ${someVariable}\""])

希望本文档 https://jenkins.io/doc/book/pipeline/jenkinsfile/#working-with-the-environment也有一点帮助,但我知道最近 Jenkins 文档可能非常参差不齐,所以我还发现关于如何不为 Jenkins 声明性管道做事的重要要点 https://gist.github.com/katcaola/2f18350ee66e0a3b2feb57a2992643c3。祝你好运!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法在 Jenkins 管道作业中通过 DSL (groovy) 存储 sh 命令输出 的相关文章

  • 当 github 提交触发构建时,Jenkins 自动构建进入循环

    我在 jenkins 中创建了一个 webhook 并将其连接到 github webhook 和服务 我遇到了以下问题当构建完成时 pom xml 会使用 version 和 tag 进行更新 这会再次触发构建作业并进入循环 直到我手动停
  • 使用环境变量将参数传递给命令

    我正在尝试编写一个 bash 脚本 该脚本采用环境变量并将其传递给命令 所以如果我有类似的东西 export OUT a arg1 b arg2 0 arg2 1 我想在我的 bash 脚本中执行以下操作
  • Bash - 在文件名中间添加 0

    我有一堆文件 其名称为 mem0 csv内存1 csv mem153 csv 它们都在同一个文件夹中 当我在文件夹中执行 ls 时 它们按以下顺序显示 mem0 csv内存1 csvmem10 csvmem100 csv 内存2 csvme
  • 在 Jenkins 中使用多分支管道“定期构建”

    我正在使用 Pipeline 插件运行 Jenkins 2 我已经设置了一个多分支管道项目 其中每个分支 主分支 开发分支等 的根目录中都有一个 Jenkinsfile 设置起来很简单 但是 即使代码没有更改 我也不知道如何让每个分支定期运
  • 在 RPM 规范文件中使用 Jenkins BUILD NUMBER

    Name My Software Version 1 0 5 Release 1 Summary This is my software 不确定是否有人以前尝试过这个或者它是否容易 但是 规范文件的版本有两个独特的指示符 版本 指定软件版本
  • 使用列命令时出现 Bash 错误:“列:行太长”

    当我使用输入文件键入此列命令时 出现以下错误 column t text txt gt output column line too long column line too long column line too long column
  • 从 Bash 中的字符串中删除固定前缀/后缀

    我想从字符串中删除前缀 后缀 例如 给定 string hello world prefix hell suffix ld 我如何得到以下结果 o wor prefix hell suffix ld string hello world f
  • 使用 Groovy 对 XML 文件进行排序

    有没有办法可以使用 Groovy 根据某些属性对 xml 文件进行排序 这是我的 xml
  • 在 Jenkins 中集成 SMS 服务

    有谁知道如何在 Jenkins 中实现 SMS 插件 我在Jenkins中搜索并找到了插件 短信通知 但是它涉及成本 我想集成短信而不承担费用 任何帮助表示赞赏 Thanks 这是一个合理的问题 确保您使用的是 Jenkins 2 x 从以
  • 命令行参数出现空格的问题

    我有一个 Java 程序 我正在 Linux 环境中通过 bash 脚本执行该程序 这是我的简单 bash 脚本 它接受一个字符串 bin bash java cp com QuoteTester 1 问题是命令行参数可以带空格或不带空格
  • 需要一种临时重定向 STDOUT 的方法

    我知道如何在 Linux 中重定向输出 问题是 我的 bash 脚本中有很多输出 我不想输入类似的内容 echo foo gt gt bar 一遍又一遍地 我更愿意做这样的事情 hey bash for the time being put
  • 从队列 ID 获取 Jenkins 作业构建 ID

    我成功地使用它来启动 Jenkins 作业 curl X POST http jenkins srv 8080 job MY JOB buildwithParameters this 1 that 2 user name pass 我还可以
  • 将带有任意特殊字符的多行字符串插入到 shell 脚本中的模板文件中

    就像是 cat template txt ruby e puts STDIN read sub placeholder IO read content txt gt output txt Or ed template txt lt
  • 詹金斯和 JUnit

    我已经阅读了 Jenkins 站点及其 JUnit 插件 由于某种原因 一些非常基本的东西对我来说并不明显 詹金斯有一个Email ext用于在运行构建时发送自定义 高级通知电子邮件的插件 在这些电子邮件中 您可以放置 内容标记 这些是运行
  • 为什么 bash 无法识别套接字文件的存在

    在 Linux 机器上 我想检查特定的套接字文件是否存在 我知道套接字文件存在 但我在 bash 中的检查没有向我显示这一点 ls l var run supervisor sock srwxrw rw 1 root root 0 Jun
  • printf '%s\n' "${array[@]}" 每个数组元素打印一行是否正常?

    在我的 bash 脚本中 我包含了程序所需的一系列其他文件 然后我在帮助说明中打印这些内容 当我使用 printf 进行输出时 我得到了意想不到的结果 我读到 形式 array 通常是首选的扩展默认形式 所以我从它开始 我的数组声明 scr
  • 使用Curl数据二进制选项,内存不足

    我正在尝试使用curl来上传数据 我需要上传二进制数据 不幸的是 我认为curl首先将文件二进制文件加载到内存中 因此对于大文件来说这是一个问题 我使用的系统的可用内存非常少 因此即使是 8mb 大的文件也很困难 我得到 curl opti
  • bash 脚本中自动 docker 登录

    我如何提交我的凭据docker login脚本中的命令 我使用的 bash 脚本基本上自动化了设置自定义虚拟机等的整个过程 但是当我需要在脚本中登录 docker 来提取映像时 我收到以下错误 用户名 FATA 0000 设备的 ioctl
  • 使用华为 E8372 hilink 通过 bash 脚本发送短信

    我正在尝试从华为 E8372 发送短信 与该产品的旧版本不同 它现在需要登录 用户名 密码 才能允许进行 API 调用 从https github com arska e3372 issues 1 https github com arsk
  • 设置环境变量(密码),其值不会保存到 bash 历史记录中

    当我以 root 身份登录 MySQL 时 我通常设置 MROOTPASS 环境变量 export MROOTPASS my secret password 然后做 mysql u root p MROOTPASS 这消除了每次我以root

随机推荐

  • 检查文本框值是数字还是字符串[重复]

    这个问题在这里已经有答案了 可能的重复 JavaScript 中是否有一种 内置 方法来检查字符串是否为有效数字 https stackoverflow com questions 175739 is there a built in wa
  • 在 Visual Studio 中哪里指定预处理器指令?

    尝试在 Visual studio 2012 中定义预处理器指令 define FLAG endif 但不确定在哪里包含这个FLAG在视觉工作室 C 我记得在 C 项目中指定过类似的内容 有什么想法吗 对于在何处定义它 您有两种选择 代码文
  • iOS 中键盘和 UIView 之间出现空白

    我有一个基于标签栏控制器的应用程序 我正在使用IQKeyboardManager处理类似表单的东西 第 1 步 带有底部 a 的选项卡栏控制器UITextView里面一个UIView 检查图像 1 第2步 当我点击UITextView 出现
  • HTTP-Get 和 HTTP-POST 之间有什么区别以及为什么 HTTP-POST 在安全性方面较弱

    谁能解释一下 HTTP GET 和 HTTP POST 之间的区别吗 为什么人们说 HTTP POST 的安全性较弱 在 HTTP GET 请求中 键 值对在 URL 中指定 在 HTTP POST 请求中 键 值对作为 HTTP 请求的一
  • Sonarqube 5 - 如何标记误报?

    我最近安装了 SonarQube 5 0 1 但我找不到在哪里将问题标记为误报 在该选项所在的下拉框中 唯一的选项是 链接到 JIRA 并且我以管理员身份登录 此功能现在是否作为可选插件的一部分提供 编辑 我添加了我在用户界面中看到的屏幕截
  • 等待设备时出错:AVD Pixel_3a_API_30 的模拟器进程已终止

    我正在尝试在 Android Studio 中运行我的应用程序 它显示此错误 等待设备时出错 AVD Pixel 3a API 30 的模拟器进程已终止 有人可以帮助我吗 Try wipe data on the emulator in A
  • 非数字列中的 SQL MAX 函数

    据我了解 MAX 函数 它应返回给定列的最大值 对于数值 例如工资列 对我来说很清楚 这是我在教程中找到的唯一应用程序 但是 我无法理解它在非数字列的情况下如何工作 我的问题源于这个练习 在 sql ex ru 上 找出只生产同类型型号的制
  • 从gapi.client.load 捕获错误

    我正在将 Google App Engine 与 Java 和 Google Cloud Endpoints 结合使用 在我的 JavaScript 前端中 我使用此代码来处理初始化 按照推荐 https developers google
  • 如何将“config.include FactoryBot::Syntax::Methods”添加到spec_helper.rb中的rspec配置块?

    如果我添加 config include FactoryBot Syntax Methods under RSpec configure do config 并运行 rspec 我看到此错误 Users perry mac rails pr
  • 当我从 Spring 1.5.21 升级到 2.1.5 时,pom.xml 中出现“未知”错误

    我正在使用 Eclipse STS 3 9 7 Spring 版本的切换创建了我能够解决的其他错误 但不是这个 pom xml 的第一行被标记为 未知 错误 Maven 构建 全新安装 运行良好 没有错误 没有警告 到目前为止我已经尝试过
  • ASP.NET 自定义控件:何时调用 LoadPostData()?

    我开发了一个扩展 ListBox 的自定义控件 这个想法是控件 记住 客户端发生的对其元素的修改 例如作为 AJAX 请求的结果 它的工作方式是控件还呈现隐藏输入 并且 AJAX 请求的结果存储在隐藏输入中 这将被回发 并且控件的 Load
  • 为什么在安装 gem 'pg' 时出现错误? [复制]

    这个问题在这里已经有答案了 可能的重复 无法在 ubuntu 上安装 pg gem 找不到 libpq fe h 标头 https stackoverflow com questions 6040583 unable to install
  • rake db:migrate 到底做了什么?

    rake db migrate 是否仅添加新的迁移 还是会删除所有迁移 更改并构建所有新内容 我认为 rake 抛出错误 因为它试图访问迁移 040 中的表属性 该属性已在迁移 042 中删除 不知何故 我的数据库和 rake 不同步 我想
  • VB。 NET:请求已中止:无法创建 SSL/TLS 安全通道

    我有一个用 VB net 编码的应用程序 它有这种访问 Web 服务的方法 我遇到了这个错误 在搜索修复后我仍然没有运气 错误 请求被中止 无法创建 SSL TLS 安全通道 ServicePointManager Expect100Con
  • git lineends redux - Mac OS git 与 Windows 用户的贡献

    我在 Mac OS X 上进行开发 我有一个用户正在贡献带有 CRLF 行结尾的代码 他目前不使用 git 我创建一个分支 然后将我的工作树切换到它 我将他的文件复制到工作树中 当我尝试暂存文件时 收到错误fatal CRLF would
  • Knex 与 PostgreSQL 选择查询在多个并行请求上性能极度下降

    In brief 我正在开发一个 梦想中的 游戏 我的后端堆栈是 Node js 和带有 Knex 的 PostgreSQL 9 6 我在这里保存所有玩家数据 我需要经常请求它 其中一个请求需要进行 10 个简单的选择来提取数据 这就是问题
  • XSL 如果需要帮助请

    我正在将 html 表单转换为 xml 序列 我使用递归函数来实现此目的 因此参数 list 的输入将采用以下形式 name value name value name value 下面的模板可以很好地完成此操作并返回一个 xml 序列 如
  • “conda install pandas-datareader”不起作用

    我尝试按照官方文档运行以下命令 在 Anaconda 提示符下安装 pandas datareader conda install c anaconda pandas datareader 我收到错误 解决环境 失败 如下所示 我已连接到互
  • DbContext 和连接池

    在我继承的应用程序中 基本控制器中有这个 应用程序中的所有其他控制器都继承自该控制器 public BaseController db new MyDbContext db Database Log s gt Debug Write s p
  • 无法在 Jenkins 管道作业中通过 DSL (groovy) 存储 sh 命令输出

    我想获得管道 Jenkins 作业中的最后构建输出并附加在电子邮件中 使用 emailext 插件 Curl 工作正常并提供正确的构建输出 但我无法存储在变量中以附加在电子邮件中 我正在使用最新的詹金斯版本 我可以看到有几个关于简单 sh