当前位置: 首页 > 知识库问答 >
问题:

从jenkinsfile执行shell命令

终洛华
2023-03-14

我正在尝试从jenkinsfile执行一组命令。问题是,当我尝试将stdout的值分配给变量时,它不起作用。我尝试了双引号和单引号的不同组合,但到目前为止没有运气。

在这里,我使用最新版本的jenkinsfile以及旧版本执行脚本。将shell命令放入 """ """ 不允许创建新变量,并给出client_name命令不存在的错误。

String nodeLabel = env.PrimaryNode ? env.PrimaryNode : "slave1"
echo "Running on node [${nodeLabel}]"

node("${nodeLabel}"){

    sh "p4 print -q -o config.yml //c/test/gradle/hk/config.yml"
    def config = readYaml file: 'devops-config.yml'
    def out = sh (script:"client_name=${config.BasicVars.p4_client}; " +
    'echo "client name: $client_name"' +
    " cmd_output = p4 clients -e $client_name" +
    ' echo "out variable: $cmd_output"',returnStdout: true)
}

我想将命令p4客户端-e$client_name的标准输出分配给变量cmd_output。

但当我执行代码时,抛出的错误是:

NoSuchPropertyException:在cmd\u output=p4 clients-e$client\u name行中未定义client\u name

我错过了什么?

共有1个答案

宋俊民
2023-03-14

这里的问题是当字符串是双引号时,所有的$都由jenkins解释。所以前两次没有问题,因为第一个变量来自jenkins,第二次是单引号字符串。第三个变量在双引号字符串中,因此jenkins试图用它的值替换变量,但它找不到它,因为它只有在执行外壳脚本时才生成。

解决方案是转义$in$client\u名称(或在环境块中定义client\u名称)。

我重写了块:

String nodeLabel = env.PrimaryNode ? env.PrimaryNode : "slave1"
echo "Running on node [${nodeLabel}]"

node("${nodeLabel}"){
    sh "p4 print -q -o config.yml //c/test/gradle/hk/config.yml"
    def config = readYaml file: 'devops-config.yml'
    def out = sh (script: """
        client_name=${config.BasicVars.p4_client}
        echo "client name: \$client_name"
        cmd_output = p4 clients -e \$client_name
        echo "out variable: \$cmd_output"
    """, returnStdout: true)
}
 类似资料:
  • 我有一个案例,我想问我可以解决与Spring壳。我有一个Main.jar应用程序,它有几个部署在Wildly服务器上的Spring任务。在我的例子中,我不能停止或重新部署main.jar,因为必须不停地提供服务。

  • 问题内容: 我正在尝试从GNU / Linux平台上的Java应用程序执行shell命令。问题是,尽管它可以从bash成功运行,但调用另一个Java应用程序的脚本永远不会结束。我试图调试它: 我尝试使用:ProcessBuilder(); 和Runtime.getRuntime()。exec(cmd); 看起来它正在等待完成。有任何想法吗? 谢谢,Laurențiu 问题答案: 您是否正在处理标准

  • 问题内容: 我正在尝试在我编写并按下的应用程序中从应用程序仿真器终端(您可以在Google Play中找到它)执行此命令enter,因此请编写: 然后再次按,并使用的新功能开始录制屏幕。 因此,我尝试使用以下命令从Java执行相同的代码: 但是不起作用,因为未创建文件。显然,我在装有android kitkat的有根设备上运行。问题出在哪里?我该如何解决?因为从终端仿真器工作并且在Java中不行?

  • 我正试图从应用程序仿真器终端(您可以在google play中找到它)执行这个命令,在这个应用程序中我编写并按Enter,所以写:

  • 我试图在我的网页中使用PHP从远程机器中的shell获得结果。我用了这些台词: 我试图得到结果在我的网页在windows机器和libssh2已经包含在easyphp. 有什么想法吗?

  • 问题内容: 我仍在尝试掌握如何运行linux或Windows shell命令并在node.js中捕获输出的细节。最终,我想做这样的事情… 重要的一点是必须对全局范围的变量(或对象)可用。我尝试了以下功能,但是由于某种原因,我被打印到控制台了。 我很难理解代码在哪里突破了…该模型的非常简单的原型可以工作… 有人可以帮助我了解为什么有效,但是无效吗?FWIW,我需要使用,因为缓冲区限制为200KB。