Это в основном требует двух шагов:
- Получить все переменные среды
- Заменить значения переменных среды в файле шаблона (.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