Конвейер Дженкинса как правильно использовать интерполяцию строк

#docker #jenkins #groovy #jenkins-pipeline

Вопрос:

В моем запуске docker я хотел бы передать секрет в качестве переменной env. И это работает просто отлично. Однако у меня также есть вторая переменная «foo», которую я хотел бы отобразить внутри моего контейнера. Это не работает. Как я могу заставить переменную «foo» расширяться внутри тройных одинарных кавычек?

  stages {
        stage('test') {
            steps {
                    script {
                        def foo = "bar"
                        sh '''
                        docker run 
                                --rm 
                                --env secret=$ENV_SECRET 
                                python:3.8.12 /bin/bash -c 
                                "echo $foo"
                        '''
                    
                }
                
            }
        }
    }
 

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

1. Секреты должны обрабатываться специально в конвейерах Дженкинса! Смотрите environment { ... credentials('...') } } .

Ответ №1:

Синтаксис для интерполяции строк с переменными Groovy в Groovy включает " . Если ваша ENV_SECRET переменная окружения связана с withCredentials блоком, то вы хотите интерполировать ее в интерпретаторе оболочки. Поэтому мы можем обновить ваш метод шага оболочки с помощью:

 sh """
  docker run 
  --rm 
  --env secret=$ENV_SECRET 
  python:3.8.12 /bin/bash -c 
  'echo $foo'
"""
 

Вместо этого в вашем синтаксисе были бы интерполированы переменные оболочки. Обратите внимание, что оба будут интерполировать переменные среды, но с разными интерпретаторами.

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

1. Ссылка: Groovy, Синтаксис, строка в тройных двойных кавычках

2. Выполнение этого таким образом генерирует предупреждение в Jenkins Следующие шаги, которые были обнаружены, могут иметь небезопасную интерполяцию чувствительных переменных (нажмите здесь для объяснения):

3. Просто убегайте $ для каждого секрета. """ ... secret=$ENV_SECRET ..."""

4. @Kinder9211 Если ваша ENV_SECRET переменная окружения связана с withCredentials блоком, то вы хотите интерполировать ее в интерпретаторе оболочки. В этой ситуации даггетт полностью прав, и я обновлю ответ.

5. Да, это было то, что я искал, потому что объяснение, данное Дженкинсом, заключало его в одинарные кавычки 🙂