执行 kubectl 从 pod 中查找 java 进程 id 时,groovy 中出现多个编译错误异常

问题描述 投票:0回答:1

这是我在 groovy 中的声明式管道中从 k8s pod 获取 java 进程 ID 的代码:

def jpsid = "${kubectl exec -i "${pod}"  -n *<some_namespace>* -- jps | awk '{ print "${1}"}'}"

我希望将 2 位数字值映射到 jpsid。

有人可以建议如何克服这个问题吗?

我得到的错误是:

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 33: expecting '}', found 'jps' @ line 33, column 95.
    -n *<some_namespace>* -- jps | awk 
                                 ^

1 error

  at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:309)
  at org.codehaus.groovy.control.ErrorCollector.addFatalError(ErrorCollector.java:149)
  at org.codehaus.groovy.control.ErrorCollector.addError(ErrorCollector.java:119)
  at org.codehaus.groovy.control.ErrorCollector.addError(ErrorCollector.java:131)
  at org.codehaus.groovy.control.SourceUnit.addError(SourceUnit.java:349)
  at org.codehaus.groovy.antlr.AntlrParserPlugin.transformCSTIntoAST(AntlrParserPlugin.java:225)
  at org.codehaus.groovy.antlr.AntlrParserPlugin.parseCST(AntlrParserPlugin.java:191)
  at org.codehaus.groovy.control.SourceUnit.parse(SourceUnit.java:233)
  at org.codehaus.groovy.control.CompilationUnit$1.call(CompilationUnit.java:189)
  at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:966)
  at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:626)
  at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:602)
  at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:579)
  at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:323)
  at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:293)
  at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovySandbox$Scope.parse(GroovySandbox.java:163)
  at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.doParse(CpsGroovyShell.java:190)
  at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:175)
  at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:568)
  at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:518)
  at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:336)
  at hudson.model.ResourceController.execute(ResourceController.java:101)
  at hudson.model.Executor.run(Executor.java:442)
[withMaven] downstreamPipelineTriggerRunListener - Failure to introspect build steps: java.io.IOException: k8s_ops #43 did not yet start
[withMaven] downstreamPipelineTriggerRunListener - Failure to introspect build steps: java.io.IOException: k8s_ops #43 did not yet start
Finished: FAILURE

尝试通过 jenkins 使用声明性管道从 k8s pod 中提取 java 进程 id。 预计没有分配给变量“jpsid”的 2 位数字

groovy kubectl jenkins-groovy jenkins-declarative-pipeline
1个回答
0
投票

给定的行不起作用,首先,它缺少大量转义,并且字符串不会自行执行。从编程角度来说,字符串的开始和结束位置是不清楚的。我本来期望更像下面的伪代码:

def jpsCommand = "kubectl exec -i \"${pod}\"  -n *<some_namespace>* -- jps | awk '{ print \"\${1}\"}'}"
def jpsId = sh(script: jpsCommand, returnStdout: true).trim()

PS:管道警告:Jenkins 有一种“奇怪”的方式来处理管道子外壳;请参阅类似 this stackoverflow 的帖子来了解其中的奇怪之处。使用以下结构的管道运行命令可能会更好:

sh(script: "/bin/bash -c '...'")
。这将需要一些额外的转义。伪代码示例:

def jpsCommand = "kubectl exec -i \"${pod}\"  -n *<some_namespace>* -- /bin/bash -c 'jps | awk \'{ print \$1}\''"
def jpsId = sh(script: jpsCommand, returnStdout: true).trim()
© www.soinside.com 2019 - 2024. All rights reserved.