如何将 Jenkins 配置中的 ${} 作为代码(casc)插件转义?
How to escape ${} in Jenkins configuration as code (casc) plugin?
我正在使用 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.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]}\")
以上的 None 有效。非常感谢有关如何避免评估的任何建议。
我遇到了同样的问题,到目前为止还没有找到“那个”解决方案,但是为了解决这个问题,我只是打破了字符串
例如而不是
def HOSTS_LOCATION = "../bootstrap/inventory/${ENVIRONMENT_MAP[params.region]}_aws_ec2.yaml"
我愿意
def HOSTS_LOCATION = "../bootstrap/inventory/" + ENVIRONMENT_MAP[params.region] + "_aws_ec2.yaml"
找到答案。添加 ^ 解决了我的问题。 :) (^${CAPP_ENTRY[0]})
来源:https://github.com/jenkinsci/configuration-as-code-plugin/issues/577
我正在使用 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.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]}\")
None 有效。非常感谢有关如何避免评估的任何建议。
我遇到了同样的问题,到目前为止还没有找到“那个”解决方案,但是为了解决这个问题,我只是打破了字符串
例如而不是
def HOSTS_LOCATION = "../bootstrap/inventory/${ENVIRONMENT_MAP[params.region]}_aws_ec2.yaml"
我愿意
def HOSTS_LOCATION = "../bootstrap/inventory/" + ENVIRONMENT_MAP[params.region] + "_aws_ec2.yaml"
找到答案。添加 ^ 解决了我的问题。 :) (^${CAPP_ENTRY[0]})
来源:https://github.com/jenkinsci/configuration-as-code-plugin/issues/577