【问题标题】:Assign groovy variable to process ID inside shell command将 groovy 变量分配给 shell 命令中的进程 ID
【发布时间】:2021-02-13 23:23:50
【问题描述】:

从管道中,我很简单地尝试将我的模拟器进程 ID 设置为我在 shell 脚本中的变量 EMULATOR_PID,如下所示:

def EMULATOR_HOME = 'C:/Users/USER/AppData/Local/Android/Sdk/emulator'
def EMULATOR_PID

pipeline {
 agent any

 stages {
    stage('Start emulator') {
        steps {
        sh "$EMULATOR_HOME/emulator -avd Pixel_2_API_29 -port 5554 -wipe-data & $EMULATOR_PID=\$!"
      }
}

在下一阶段,我将尝试像这样终止该进程:

stage('Kill process') {
  steps {
    sh "kill $EMULATOR_PID"
}

当我开始构建时,我得到以下错误输出:

+ null=5749 <------ EMULATOR_PID
+ C:/Users/USER/AppData/Local/Android/Sdk/emulator/emulator -avd Pixel_2_API_29 -port 5554 -wipe- 
data
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Kill processes)
[Pipeline] sh
+ kill null <------- "null" IS MY EMULATOR_PID
C:/Users/USER/AppData/Local/Jenkins/.jenkins/workspace/Android Test Pipeline@tmp/durable- 
d7aac378/script.sh: line 1: kill: null: arguments must be process or job IDs

如何在此处正确地将 EMULATOR_PID 变量分配给我的模拟器进程 ID?

【问题讨论】:

    标签: shell jenkins groovy jenkins-pipeline sh


    【解决方案1】:

    您可以使用以下选项:

    sPID= sh (
          script: "$EMULATOR_HOME/emulator -avd Pixel_2_API_29 -port 5554 -wipe-data & echo \$!;",
          returnStdout: true
        ).trim()
    

    您可能需要在变量 sPID 上做一些工作才能得到一个干净的数字

    【讨论】:

    • 谢谢它的工作,但你能解释一下这里的作业是如何工作的吗?基本上,您可以像“echo \$!”这样回显进程ID并以某种方式将其分配给变量“sPID”。这是否意味着您必须在诸如此类的 shell 命令中回显您想要分配的所有内容?
    • 抱歉耽搁了。在这种情况下,您要实现的是读取 bash 中生成的值,但在管道中,您使用 sh 插件作为执行 bash 的网关。在这种情况下,您的管道仅与插件交互,而这个与 bash 脚本交互。这个插件只能返回两件事:返回状态(如果脚本运行正常或出错)并捕获 stdOut 签出以获取脚本在标准输出上写入的任何内容。检查它jenkins.io/doc/pipeline/steps/workflow-durable-task-step/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 2016-09-08
    • 2013-05-05
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    相关资源
    最近更新 更多