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