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。

这基本上需要两个步骤:

  • 获取所有环境变量
  • 替换模板(.env)文件中环境变量的值
  • 让我们从#2开始,因为它规定了#1必须生成哪种类型的数据

    2.替换模板中的变量 我们可以使用Groovy来完成这项任务

    def result=new SimpleTemplateEngine().createTemplate(templateStr).make(dataMap)
    
    这里的
    templateStr
    是模板字符串(您的.env文件的内容),而
    dataMap
    必须是一个
    Map
    ,由字符串键和值(环境变量的实际值)组成。获取模板字符串非常简单(使用Jenkins
    readFile
    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