Shell 詹金斯。在文件中插入环境变量
我有一个Shell 詹金斯。在文件中插入环境变量,shell,jenkins,Shell,Jenkins,我有一个.env文件,其中包含以下数据 API_URL=${API_URL} API_KEY=${API_KEY} API_SECRET=${API_SECRET} 在Jenkins中设置环境变量并将其传递给管道是很清楚的。但是不清楚如何将.env文件中的${API\u URL}、${API\u KEY}&${API\u SECRET}替换为Jenkins环境变量中的值?另外,如何循环所有Jenkins变量?您可以通过在脚本化管道中执行简单shell来访问变量: def variables =
.env
文件,其中包含以下数据
API_URL=${API_URL}
API_KEY=${API_KEY}
API_SECRET=${API_SECRET}
在Jenkins中设置环境变量并将其传递给管道是很清楚的。但是不清楚如何将
.env
文件中的${API\u URL}、${API\u KEY}&${API\u SECRET}替换为Jenkins环境变量中的值?另外,如何循环所有Jenkins变量?您可以通过在脚本化管道中执行简单shell来访问变量:
def variables = sh(script: 'env|sort', returnStdout: true)
然后在Groovy中通过编程将其转换为列表,并使用每个循环进行迭代
根据替换变量,如果您没有使用任何可以访问env变量的解决方案,那么您可以使用简单的文本操作,例如对该文件执行sed。这基本上需要两个步骤:
def result=new SimpleTemplateEngine().createTemplate(templateStr).make(dataMap)
这里的templateStr
是模板字符串(您的.env文件的内容),而dataMap
必须是一个Map
,由字符串键和值(环境变量的实际值)组成。获取模板字符串非常简单(使用JenkinsreadFile
step),将环境变量读入Map
稍微复杂一些
1.将环境变量读入映射
我写了“稍微多一些参与”,因为GroovyGoods也使这项任务变得非常简单
@Chris如何将环境变量读入字符串。我们需要做的是将该字符串拆分,首先将其拆分为单独的行,然后将每行拆分为键和值。幸运的是,Groovy提供了String
类的成员函数,它可以通过一次调用完成这两个步骤有一点需要注意,因为在Jenkins管道上下文中,
splitEachLine
是一个性能不好的函数,它只返回第一行。将关键代码移动到一个单独的函数中,并用@NonCPS
注释,可以解决这个问题
@NonCPS
映射envStrToMap(字符串envStr){
def envMap=[:]
envStr.splitEachLine('=')){
envMap[it[0]]=it[1]
}
返回环境图
}
最后
现在我们有了让詹金斯为我们做美味模板汤的所有原料
这是一个完整的管道演示。它使用脚本样式,但也应该易于在声明式样式中使用。只需将节点
替换为脚本
块即可
导入groovy.text.SimpleTemplateEngine
节点{
//TODO:将硬编码字符串替换为:
//def tmp=readFile文件:“yourfile.env”
def tmp=“”\
API_URL=${API_URL}
API_KEY=${API_KEY}
API_SECRET=${API_SECRET}''
withEnv(['API\u URL=http://someurl“,”API_KEY=123“,”API_SECRET=456']){
def envMap=getEnvMap()
回显“envMap:\n$envMap”
def tmpResolved=new SimpleTemplateEngine().createTemplate(tmp).make(envMap)
writeFile文件:“test.env”,文本:tmpResolved.toString()
//只是为了演示,让我看看结果
archiveArtifacts工件:“test.env”
}
}
//将所有环境变量读入映射。
//在这里,不能使用@NonCPS,因为我们正在调用Jenkins步骤。
Map getEnvMap(){
def envStr=sh(脚本:“env”,returnStdout:true)
返回envStrToMap(envStr)
}
//拆分多行字符串,其中每行由“=”分隔的键和值组成。
//使用@NonCPS使splitEachLine()工作非常关键!
@非现金
映射envStrToMap(字符串envStr){
def envMap=[:]
envStr.splitEachLine('=')){
envMap[it[0]]=it[1]
}
返回环境图
}
管道使用以下内容创建工件“test.env”:
API\u URL=http://someurl
API_KEY=123
API_SECRET=456