在开始管道代码之前,如何使用共享库在jenkinsfile中注入环境变量?

时间:2019-08-28 04:24:48

标签: environment-variables jenkins-pipeline shared-libraries jenkins-groovy jenkins-declarative-pipeline

我想使用共享库将多个环境变量注入到多个jenkinsfile中,因为env变量在这些多个jenkinsfile中是公用的。动机是在全局级别上注入属性,以便变量是全局的,并且可以在整个管道中访问。

我尝试了以下方法: 一种。在jenkinsfile中使用了环境标记。这需要在所有jenkinsfile中完成,因此没有代码可重用性。 b。我能够将env变量注入到阶段的script标签中。但是我想在管道代码开始之前完成。这就像可以从管道中的任何位置访问的全局属性一样。

代替以下内容:

// Jenkinsfile

pipeline {
environment {
TESTWORKSPACE="some_value"
BUILDWORKSPACE="some_value"
...
...
30+ such env properties
}
}

我正在寻找可以在共享库groovy脚本中声明这些env变量,然后在整个管道中对其进行访问的东西。如下所示:

// Jenkinsfile

def call(Map pipelineParams) {

pipeline {
<code>
<Use pipelineParams.TESTWORKSPACE as a variable anywhere in my pipeline>
}
}

1 个答案:

答案 0 :(得分:0)

我认为这是可能的。也许您的jenkinsfile可能类似于:

@Library(value="my-shared-lib@master", changelog=false) _

import com.MyClass

def extendsEnv(env) {
  def myClass = new MyClass()
  myClass.getSharedVars().each { String key, String value -> 
    env[key] = value 
  }
}

pipeline {
  ...
  stage('init') {
    steps {
      extendsEnv(env)
    }
  }
}

请注意,如果您打算以后将共享变量作为环境变量添加,则共享变量应为字符串值。但是我没有尝试这段代码。 您还可以想象另一个解决方案:分解所有团队的管道并使用参数覆盖系统(项目级别>团队离开>全球级别):

@Library(value="my-shared-lib@master", changelog=false) _
      
def projectConfig = [:]
projectConfig['RESOURCE_REQUEST_CPU'] = '2000m'
projectConfig['RESOURCE_LIMIT_MEMORY'] = '2000Mi'

teamPipeline(projectConfig)

teamPipeline函数是在vars目录的共享库中声明的,带有附加的teams参数,该参数最终调用带有参数映射的公用管道。如上所示,将这些参数设置为env var。