Jenkins:通过全局函数设置环境变量

打高尔夫球

我在SCM中有一个带有脚本Jenkinsfile的多分支管道项目。我想通过共享的全局函数在管道中设置环境变量。我共享的全局函数如下所示:

#!/usr/bin/groovy

def call(String envName = 'staging') {

  def json = libraryResource 'env-config.yaml'
  def config = readYaml text: json
  def envObj = config.environments.find{it.name == envName}
  environment {
    PROJECT = ${envObj.project}
    ARTIFACTS_REPOSITORY = ${envObj.artifacts_repository}
    DOCKER_REGISTRY_PREFIX = ${envObj.docker_registry_prefix}
  }
  println "${envObj}"
}

但是在我的Jenkinsfile中,我看不到这些设置:

timestamps {
  withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'xxx', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) {
    node('klm') {
      try {
        def revisionTag
        loadEnvConfig('staging')
        println "project=${env.PROJECT}, repo=${env.ARTIFACTS_REPOSITORY}"
        ...

env.PROJECT并且env.ARTIFACTS_REPOSITORY均为null。如果我envObj从函数返回并在管道中打印属性,则可以看到它们。是否可以通过我的函数设置环境变量?

编辑:我刚刚意识到我无法在多分支管道的Jenkinsfile中设置任何环境变量。例如,这两种模式都不起作用

timestamps {
  withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'xxx', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) {
    node('klm') {
      try {
        environment {
          FOO = "bar"
        }
        println "project=${env.FOO}"
        ...

timestamps {
  withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'xxx', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) {
    node('klm') {
      try {
        withEnv(["FOO=BAR"]) {
        println "project=${env.FOO}"
        ...
mkobit

我不确定是什么environment,为什么它不会让您失望PROJECT = ${envObj.project}是无效的Groovy,因此不会执行该块。似乎您正在尝试将environment指令用于声明性管道,但是您正在使用脚本化管道。由于共享库和声明性管道的限制,以下选项仅对脚本化管道有效。

在当前代码中,您不会修改任何全局脚本变量或返回要在其他步骤中使用的值,因此它们不会起作用。根据要提供给消费者的API,您有几种不同的方法。

第一种选择是只修改env全局变量:

env.PROJECT = envObj.project
env.ARTIFACTS_REPOSITORY = envObj.artifacts_repository
env.DOCKER_REGISTRY_PREFIX = envObj.docker_registry_prefix

这些将修改env脚本中其他任何地方都可用的全局状态(除非它们被覆盖或删除)。

另一种选择是使用现有withEnv步骤编写方法,并允许消费者提供Closure主体。这里是我从改名功能的例子loadEnvConfigwithEnvConfig

def call(String envName = 'staging', Closure body) {
  // Previous code... 
  withEnv([
      "PROJECT=${envObj.project}",
      "ARTIFACTS_REPOSITORY=${envObj.artifacts_repository}",
      "DOCKER_REGISTRY_PREFIX=${envObj.docker_registry_prefix}",
  ]) {
    body()
  }
}

Jenkinsfile

withEnvConfig('staging') {
  println "In block project=${env.PROJECT}, repo=${env.ARTIFACTS_REPOSITORY}"
}
println "Out of block project=${env.PROJECT}, repo=${env.ARTIFACTS_REPOSITORY}"

在主体内部,将它们设置为的值withEnv在块外,它们被重置。

我更喜欢这种模式来修改全局状态。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

以编程方式设置全局环境变量

来自分类Dev

结构全局设置环境变量

来自分类Dev

如何全局设置Go环境变量

来自分类Dev

在 jenkins 文件中设置环境变量

来自分类Dev

詹金斯(Jenkins):在全局函数的主体中获取环境变量

来自分类Dev

通过脚本设置IIS环境变量

来自分类Dev

通过脚本设置环境变量(PATH等)

来自分类Dev

通过 Typescript 脚本设置环境变量

来自分类Dev

bazel:根据环境变量设置全局变量

来自分类Dev

Jenkins Docker通过环境变量设置管理员密码

来自分类Java

如何设置全局环境变量时,单元测试

来自分类Dev

在VS Code中设置全局$ PATH环境变量

来自分类Dev

如何从Inno Setup安装程序设置全局环境变量?

来自分类Dev

在Ubuntu 14.04上全局设置环境变量$ PATH

来自分类Dev

全局设置类路径环境变量值

来自分类Dev

Centos:在启动时设置全局环境变量

来自分类Dev

从自定义文件设置全局环境变量

来自分类Dev

如何通过环境文件设置环境变量

来自分类Dev

全局函数内部的访问环境变量-SwiftUI + CoreData

来自分类Dev

设置环境变量

来自分类Dev

通过函数的管道重定向回显时未设置环境变量

来自分类Dev

Jenkins 无法识别使用 set -a 设置环境变量

来自分类Dev

Jenkins Pipeline:根据参数设置环境变量

来自分类Dev

Jenkins-在执行脚本中设置环境变量

来自分类Dev

从Jenkins中的Groovy脚本设置环境变量

来自分类Dev

为 Jenkins 管道设置环境变量以部署 kubernetes pod

来自分类Dev

Jenkins kubernetes插件未通过管道传递环境变量

来自分类Dev

通过函数设置全局变量

来自分类Dev

通过全局函数设置类变量

Related 相关文章

热门标签

归档