Jenkinsfile: недопустимый символ тела строки после знака доллара; решение: либо экранировать буквенный знак доллара » $ 5″, либо заключить выражение значения в скобки

#jenkins #groovy #jenkins-pipeline

#дженкинс #заводной #дженкинс-конвейер

Вопрос:

Мой конвейер завершается с ошибкой в элементе sh «»» файла Jenkins. Есть идеи, где что-то пошло не так?

     stage('Install dependencies') {
                when { expression { return params.dependencies } } }
        steps {
            sh """
              apt-get update
                            apt-get install -y openssh-server net-tools inetutils-ping python-pip rubygems
                            apt-get install -y 
                                apt-transport-https 
                                ca-certificates 
                                curl 
                                gnupg2 
                                software-properties-common

                            curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -

                            add-apt-repository 
                               "deb [arch=amd64] https://download.docker.com/linux/debian 
                               $(lsb_release -cs) 
                               stable"

                            apt-get update
                            apt-get install -y docker-ce docker-ce-cli containerd.io
                            curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
                            chmod  x /usr/local/bin/docker-compose
                            gem install serverspec pygmy
            """
        }
    }
  

Сообщение об ошибке:

 WorkflowScript: 35: illegal string body character after dollar sign;
solution: either escape a literal dollar sign "$5" or bracket the value expression "${5}" @ line 35, column 17.
  

Ответ №1:

Замените двойные кавычки """ одинарными кавычками ''' .

 sh '''
    apt-get update 
    //...
'''
  

Всякий раз, когда Groovy видит $ внутри двойных кавычек, он обрабатывает эту строку как GString и выполняет интерполяцию строки. Однако в вашем случае символ $ не используется в контексте интерполяции, и он завершается неудачей. В качестве альтернативы вы могли бы выполнить escape $ , но имеет больше смысла переключиться на строку, заключенную в одинарные кавычки.

Комментарии:

1. Это самый простой ответ!

2. Это то, что мне нужно. Спасибо

3. Поддержано из-за простоты и именно того, что мне было нужно. У меня был скрипт «оболочки», который выполнял некоторые действия на perl и другие, и использовал переменные как для perl, так и для bash. Экранирование всего — это некрасиво, и приятно знать, что Groovy в этом не нуждается.

Ответ №2:

Если вы хотите использовать строковую интерполяцию groovy, вы можете оставить двойные кавычки, но вам нужно экранировать знак доллара в вашем выражении подоболочки, потому что groovy не знает, что делать с круглой скобкой после знака доллара:

изменить:

 $(lsb_release -cs)
  

Для:

 $(lsb_release -cs)
  

Я заметил, что сообщение об ошибке указывает на неправильную строку. В моем случае:

 sh """
   echo "message: ${env.MESSAGE}" # <-- error message points here
   pwd
   echo "ls: $(ls)" <-- this line has the problem
"""
  

Найдите первый знак доллара после строки, указанной в сообщении об ошибке.

Комментарии:

1. 1 за указание на то, что компилятор Groovy не всегда сообщает о правильном расположении ошибки в исходном коде.

2. то же самое, неправильный номер строки, о котором сообщалось, был виновником (т. Е. Ошибка в Groovy)