【问题标题】:How to escape ${} in Jenkins configuration as code (casc) plugin?如何在 Jenkins 配置中将 ${} 转义为代码(casc)插件?
【发布时间】:2021-03-25 09:00:18
【问题描述】:

我正在使用 Jenkins 配置即代码 (CASC) 插件在 docker 内的服务器启动期间创建 Jenkins 作业。我编写了一个 shell 脚本作为作业配置中的一个步骤。

- script: >
      freeStyleJob('jenkins-job-sample') {
        description('Sample')
        triggers {
            githubPush()
        }
        scm {
              git {
                remote { 
                  url('${GIT_URL}') 
                  credentials('github-credentials')
                }
                branch '*/dev'
                extensions {localBranch('dev')}
              }
          }
        steps {
            shell("""

                  do
                      cat \$OUTPUT | while read line || [[ -n \$line ]];
                      do
                        CAPP_ENTRY=\$line
                        GROUP_ID_PATH=(\${CAPP_ENTRY[0]})
                        ARTIFACT_ID=(\${CAPP_ENTRY[1]})
                        VERSION=(\${CAPP_ENTRY[2]})
                        
                      done
                    done   

                """)   
        }
        publishers {
             
        }
      }

创建作业后,我希望最终的脚本步骤如下所示。

CAPP_ENTRY=\$line
GROUP_ID_PATH=(${CAPP_ENTRY[0]})
ARTIFACT_ID=(${CAPP_ENTRY[1]})
VERSION=(${CAPP_ENTRY[2]})

但是在服务器启动过程中会抛出以下错误。

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: script: 31: unexpected char: '\' @ line 31, column 34.
                     GROUP_ID_PATH=(\)
                                    ^

1 error

    at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)     at org.codehaus.groovy.control.ErrorCollector.addFatalError(ErrorCollector.java:150)    at org.codehaus.groovy.control.ErrorCollector.addError(ErrorCollector.java:120)     at org.codehaus.groovy.control.ErrorCollector.addError(ErrorCollector.java:132)     at org.codehaus.groovy.control.SourceUnit.addError(SourceUnit.java:350)     at org.codehaus.groovy.antlr.AntlrParserPlugin.transformCSTIntoAST(AntlrParserPlugin.java:139)  at org.codehaus.groovy.antlr.AntlrParserPlugin.parseCST(AntlrParserPlugin.java:110)     at org.codehaus.groovy.control.SourceUnit.parse(SourceUnit.java:234)    at org.codehaus.groovy.control.CompilationUnit$1.call(CompilationUnit.java:168)     at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:943)     at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:605)   at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:581)     at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:558)    at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)   at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)     at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)     at groovy.lang.GroovyShell.parse(GroovyShell.java:700)  at groovy.lang.GroovyShell$parse.call(Unknown Source)   at javaposse.jobdsl.dsl.AbstractDslScriptLoader.parseScript(AbstractDslScriptLoader.groovy:134)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)    at java.lang.reflect.Method.invoke(Method.java:498)     at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:210)     at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:59)  at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:174)     at 
javaposse.jobdsl.dsl.AbstractDslScriptLoader.runScriptEngine(AbstractDslScriptLoader.groovy:101)

似乎${CAPP_ENTRY[0]} 在创造就业机会之前得到评估,结果是(\)。我想避免 ${} 在创建工作之前获得评估。我尝试了以下方式。

  • GROUP_ID_PATH=(\${CAPP_ENTRY[0]})
  • GROUP_ID_PATH=(\$\{CAPP_ENTRY[0]})
  • GROUP_ID_PATH=(\"${CAPP_ENTRY[0]}\")

以上都不起作用。非常感谢任何关于我如何避免被评估的建议。

【问题讨论】:

  • 我不喜欢你通过 shell 进行解析,但是你在 shell 脚本中的语法似乎很好:shell(""" ... GROUP_ID_PATH=(\${CAPP_ENTRY[0]}) ...""")
  • 它没有用。当 DSL 插件解析脚本时,它会将 ${CAPP_ENTRY[0]} 评估为空并仅留下 (\),这被视为无效语法。
  • 请注意 daggett 答案中的反斜杠。 (\${CAPP_ENTRY[0]})
  • 你试过在shell脚本中使用单引号''' ... shell script ... '''吗?至少使用单引号将不会是字符串插值。
  • 我尝试在前面添加反斜杠。没有运气。

标签: shell jenkins groovy jenkins-job-dsl configuration-as-code


【解决方案1】:

我遇到了同样的问题,到目前为止还没有找到“解决方案”,但是对于解决方法,我只是破坏了字符串

例如而不是

def HOSTS_LOCATION = "../bootstrap/inventory/${ENVIRONMENT_MAP[params.region]}_aws_ec2.yaml"

我愿意

def HOSTS_LOCATION = "../bootstrap/inventory/" + ENVIRONMENT_MAP[params.region] + "_aws_ec2.yaml"

【讨论】:

    【解决方案2】:

    找到了答案。添加 ^ 解决了我的问题。 :) (^${CAPP_ENTRY[0]})

    来源:https://github.com/jenkinsci/configuration-as-code-plugin/issues/577

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-25
      • 2016-10-17
      • 2018-07-13
      • 1970-01-01
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多