Как избежать ${} в конфигурации Jenkins как плагин кода (casc)?

Я использую плагин конфигурации Jenkins как код (CASC) для создания задания Jenkins во время запуска сервера внутри докера. Я написал сценарий оболочки как шаг внутри конфигурации задания.

- 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(""" ... GROUP_ID_PATH=(\${CAPP_ENTRY[0]}) ...""")

daggett 14.12.2020 22:26

Это не работает. Когда плагин DSL анализирует сценарий, он оценивает ${CAPP_ENTRY[0]} как пустой и оставляет только (\), что считается недопустимым синтаксисом.

Arunan Sugunakumar 15.12.2020 03:23

Обратите внимание на обратную косую черту в ответе Даггетта. (\${CAPP_ENTRY[0]})

smelm 15.12.2020 12:58

Вы пытались использовать одинарные кавычки ''' ... shell script ... ''' для сценария оболочки? По крайней мере, с одинарными кавычками не будет интерполяции строк.

Catalin 15.12.2020 13:30

Я попытался добавить обратную косую черту спереди. Не повезло.

Arunan Sugunakumar 16.12.2020 05:37
''' ... shell script ... ''' это тоже не сработало :-(
Arunan Sugunakumar 16.12.2020 05:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
747
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

У меня была такая же проблема, и до сих пор я не нашел «решение», однако для обходного пути я просто ломаю строку

например вместо

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

Другие вопросы по теме