Дженкинс. Вставка переменной окружения в файл - PullRequest
1 голос
/ 10 марта 2020

У меня есть .env файл, который содержит следующие данные

API_URL=${API_URL}
API_KEY=${API_KEY}
API_SECRET=${API_SECRET}

Установка переменных среды в Jenkins и передача в конвейер понятна. Но не ясно, как заменить $ {API_URL}, $ {API_KEY} & $ {API_SECRET} в файле .env их значениями в переменной среды Jenkins? Плюс, как мне пройти через все переменные Дженкинса oop?

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

Это в основном требует двух шагов:

  1. Получить все переменные среды
  2. Заменить значения переменных среды в файле шаблона (.env)

Давайте начнем с # 2, потому что он определяет, какой тип данных должен генерировать # 1.

2. Замените переменные в шаблоне

Мы можем использовать Groovy * SimpleTemplateEngine для этой задачи.

def result = new SimpleTemplateEngine().createTemplate( templateStr ).make( dataMap )

Здесь templateStr - строка шаблона ( содержимое вашего файла .env) и dataMap должно быть Map, состоящим из строковых ключей и значений (фактических значений переменных среды). Получение строки шаблона тривиально (используйте шаг Jenkins readFile), чтение переменных среды в Map немного сложнее.

1. Считайте переменные окружения в карту

Я написал " немного более вовлечен", потому что Groovy доброта делает эту задачу довольно легкой.

@ Chris уже показал , как читать переменные окружения в строку. Нам нужно разбить эту строку, сначала на отдельные строки, а затем каждую строку на ключ и значение. К счастью, Groovy предоставляет функцию-член splitEachLine класса String, которая может выполнить оба шага за один вызов!
Есть небольшое предостережение, потому что splitEachLine - это один из функций, которые не работают хорошо в контексте конвейера Jenkins - он вернул бы только первую строку. Перемещение критического кода в отдельную функцию, помеченную @NonCPS, решает эту проблему.

@NonCPS
Map<String,String> envStrToMap( String envStr ) {
    def envMap = [:]
    envStr.splitEachLine('=') {
        envMap[it[0]] = it[1]
    } 
    return envMap
}

Наконец

Теперь у нас есть все ингредиенты, чтобы позволить Дженкинсу приготовить нам вкусный шаблонный суп!

Вот полная демонстрация конвейера. Он использует скриптовый стиль, но он также должен быть простым в декларативном стиле. Просто замените node блоком script.

import groovy.text.SimpleTemplateEngine     

node {
    // TODO: Replace the hardcoded string with: 
    // def tmp = readFile file: 'yourfile.env'
    def tmp = '''\
API_URL=${API_URL}
API_KEY=${API_KEY}
API_SECRET=${API_SECRET}'''

    withEnv(['API_URL=http://someurl', 'API_KEY=123', 'API_SECRET=456']) {    

        def envMap = getEnvMap()
        echo "envMap:\n$envMap"

        def tmpResolved = new SimpleTemplateEngine().createTemplate( tmp ).make( envMap )

        writeFile file: 'test.env', text: tmpResolved.toString()

        // Just for demo, to let me see the result
        archiveArtifacts artifacts: 'test.env' 
    }
}

// Read all environment variables into a map.
// Here, @NonCPS must NOT be used, because we are calling a Jenkins step.
Map<String,String> getEnvMap() {
    def envStr = sh(script: 'env', returnStdout: true)
    return envStrToMap( envStr )
}

// Split a multiline string, where each line consists of key and value separated by '='.
// It is critical to use @NonCPS to make splitEachLine() work!
@NonCPS
Map<String,String> envStrToMap( String envStr ) {
    def envMap = [:]
    envStr.splitEachLine('=') {
        envMap[it[0]] = it[1]
    } 
    return envMap
}

Конвейер создает артефакт "test.env" со следующим содержимым:

API_URL=http://someurl
API_KEY=123
API_SECRET=456
0 голосов
/ 11 марта 2020

Вы можете получить доступ к переменным, выполнив простую оболочку в скриптовом конвейере:

def variables = sh(script: 'env|sort', returnStdout: true)

Затем программно в Groovy преобразовать его в список и выполнить итерацию, используя каждый l oop.

Согласно для замены переменных, если вы не используете какое-либо решение, которое может обращаться к переменным env, тогда вы можете использовать простые текстовые операции, такие как выполнение sed для этого файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...