#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)