首页 > 其他分享 >【Pipeline】Jenkins流水线中如何使用全局变量

【Pipeline】Jenkins流水线中如何使用全局变量

时间:2023-10-31 20:12:04浏览次数:81  
标签:Pipeline FOO BAR value environment env Jenkins 全局变量 stage

例如我们在 stage1中 利用 script 代码块 设置赋值了一个 变量,然后想在 stage2中使用。应该怎么操作呢?

https://stackoverflow.com/questions/53541489/updating-environment-global-variable-in-jenkins-pipeline-from-the-stage-level/53541813

https://www.youtube.com/watch?v=KwQDxwZRZiE

你不能重写在environment{}块中定义的环境变量。不过,有一个技巧你可能想用。可以参考ACC环境变量
有两种方式: 

    explicitly by env.ACC  显示定义,明确地定义,更推荐使用这种 带 env. 的方式来定义
    implicitly by ACC      隐式定义。

The value of env.ACC cannot be changed once set inside environment {} block,
 but ACC behaves in the following way: when the variable ACC is not set then
 the value of env.ACC gets accessed (if exists of course). But when ACC variable
 gets initialized in any stage, ACC refers to this newly set value in any stage.
 Consider the following example:



pipeline {
    agent any

    environment {
        FOO = "initial FOO env value"
    }

    stages {
        stage("Stage 1") {
            steps {
                script {
                    echo "FOO is '${FOO}'" // prints: FOO is 'initial FOO env value'

                    env.BAR = "bar"
                }
            }
        }

        stage("Stage 2") {
            steps {
                echo "env.BAR is '${BAR}'" // prints: env.BAR is 'bar'
                echo "FOO is '${FOO}'" // prints: FOO is 'initial FOO env value'
                echo "env.FOO is '${env.FOO}'" // prints: env.FOO is 'initial FOO env value'
                script {
                    FOO = "test2"
                    env.BAR = "bar2"
                }
            }
        }

        stage("Stage 3") {
            steps {
                echo "FOO is '${FOO}'" // prints: FOO is 'test2'
                echo "env.FOO is '${env.FOO}'" // prints: env.FOO is 'initial FOO env value'
                echo "env.BAR is '${BAR}'" // prints: env.BAR is 'bar2'

                script {
                    FOO = "test3"
                }

                echo "FOO is '${FOO}'" // prints: FOO is 'test3'
            }
        }
    }
}

And as you can see in the above example, the only exception to the rule is if the environment variable gets initialized outside the environment {} block. 
For instance, env.BAR in this example was initialized in Stage 1, but the value of env.BAR could be changed in Stage 2 and Stage 3 sees changed value. 

通过上面的例子,可以看到 如果在 environment {} 块中定义并初始化变量 FOO = "initial FOO env value" 的话
后续在任何 satege 中 这样 使用 env.FOO 的话 这个值一直都是 "initial FOO env value", 不会被后面的赋值语句给覆盖了。

如果后续的 stage 中 这样隐式定义 一个变量FOO,并设置了另外的值 FOO = "test2" 那么后续 的stage 访问 FOO 的话 就会是 test2,
访问 env.FOO 的话 值 还是 "initial FOO env value" 。  注意 一个是这样 FOO 访问的, 一个是 env.FOO 访问的。


如果 在 environment {} 块中 没有定义 变量 BAR, 而是 在后续的stage中定义并初始化这个变量了(env.BAR = "bar2")。
那么后续stage 还可以重新赋值 覆盖 env.BAR 这个变量。

总结一下:
1. 在 environment {} 块中 不定义任何变量, 后续在 stage 这样使用 env.BAR 这样显示的使用。如果显示的使用就一直显示的使用,不要混用。
2. 在 environment {} 块中 定义了变量, 那么后续在 stage 也一直  env.BAR 这样显示的使用,并且不要在做赋值的操作,就当成 env.BAR 是一个只读的全局变量了。 显示的使用就一直显示的使用,不要混用。 
3. 在 environment {} 块中 不定义任何变量, 后续在 stage 这样使用  BAR 这样使用,隐式的定义,赋值来使用。后续就一直隐式的使用,不要混用。
4. 如果 这样 初始化 FOO = "" 赋值一个空字符串,这在groovy中是unset一个变量的。并不是赋值一个空字符串的。

UPDATE 2019-12-18

There is one way to override the environment variable defined in the environment {} block - you can 
use withEnv() block that will allow you to override the existing env variable. It won't change the 
value of the environment defined, but it will override it inside the withEnv() block. Take a look at the following example:

pipeline {
  agent any 

  stages {
    stage("Test") {
      environment {
        FOO = "bar"
      }

      steps {
        script {
          withEnv(["FOO=newbar"]) {
            echo "FOO = ${env.FOO}" // prints: FOO = newbar  这里利用 withEnv 重新 赋值影响的也只是 withEnv 块的代码。
          }
        }
      }
    }
  }
}

标签:Pipeline,FOO,BAR,value,environment,env,Jenkins,全局变量,stage
From: https://www.cnblogs.com/wucaiyun1/p/17801219.html

相关文章

  • 【Pipeline】Jenkins流水线parallel并行构建
    位于parallel块下的阶段都将并行执行,而且并行阶段还可以被分到不同的Jenkinsagent上执行。在默认情况下,Jenkinspipeline要等待parallel块下所有的阶段都执行完成,才能确定结果。如果希望所有并行阶段中的某个阶段失败后,就让其他正在执行的阶段都中止,那么只需要在与parallel块同......
  • 0.Jenkins设置为中文
    方式1:安装Locale插件1.1安装 1.1修改系统配置项,注意前面安装完需要重启Jenkins服务 方式2:安装汉化包并重启jenkins在上面插件不生效的情况下采用。 ......
  • centos 7 + JDK 1.8.0_381+jenkins-2.346.3-1.1环境搭建与安装
    一.查询JDK版本与Jenkins版本对应关系:https://pkg.jenkins.io/redhat-stable/二.centos7安装JDK1.8版本略三.下载并安装jenkinswgethttps://repo.huaweicloud.com/jenkins/redhat-stable/jenkins-2.346.3-1.1.noarch.rpmrpm-ivhjenkins-2.346.3-1.1.noarch.rpm四.......
  • Jenkins忘记管理员密码
    一、删除Jenkins配置文件config.xml的如下内容重启Jenkins后发现不用密码可以直接登录二、启用安全域系统管理全局安全配置选择Jenkins专有用户数据库并保存三、设置admin密码系统管理→管理用户设置新的密码并保存退出后就可以用新密码登录了—————————......
  • 使用 Jenkins + Github + dokcer-compose 部署项目-环境准备篇
    JDK的安装及配置openjdk官网安装sudoadd-apt-repositoryppa:openjdk-r/ppaaptupdateaptupgradeaptinstallopenjdk-11-jdk配置以上方式安装的jdk路径位于/usr/lib/jvm/java-1.11.0-openjdk-amd64配置环境变量,根据自己的shell配置编辑对应的文件vi/etc/profile......
  • 搭建jenkins实现自动化部署
    一、安装jenkins1、添加yumrepos,然后安装sudowget-O/etc/yum.repos.d/jenkins.repohttps://pkg.jenkins.io/redhat/jenkins.reposudorpm--importhttps://pkg.jenkins.io/redhat/jenkins.io.key注:如果上边的执行成功就不用再执行这两行了sudowget-O/etc/yum.repos.d/j......
  • jenkins 使用api生成api-token
    一,背景在使用jenkins-API的情况下,不方便存储用户API时可以在用户首次登陆的时候生成token-api二,获取JSESSIONID和Jenkins-Crumbcurl-verbose -s'http://127.0.0.1:8080/crumbIssuer/api/json'--userchengc9:xxxxxxxxx三,生成api-tokencurl-s-XPOST--cookie"JSESSION......
  • Jenkins安装手册
    Jenkins安装手册一、前期准备工作因为我是在Windows系统上连接Linux服务器以及需要把在Windows系统下载的安装包上传到Linux系统,所以需要用到两个工具---putty和FileZilla。Putty是一个免费的、Windows32平台下的telnet、rlogin和ssh客户端,但是功能丝毫不逊色于商业的telnet类工......
  • jenkins shell
     #/usr/local/python3/bin/python3-mvenvvenv_jenkins#source$WORKSPACE/venv_jenkins/bin/activatepipinstall--upgradepippipinstall-rrequirements.txt--ignore-installed--no-cache-dirpipuninstall-yurllib3pipinstallurllib3==1.26.12pipuninstall-......
  • Jenkins配置java和vue构建环境
    jdk,maven,node,localtime等配置可通过挂载的方式进行配置前提条件是虚拟机中已配置好jdk,maven,node等环境注意自己虚拟机相关环境配置的路径以下样例为我自己的虚拟机中的配置路径-v宿主机(虚拟机)路径:容器路径dockerrun--namejenkins-p28081:8080-p50000:50000-v/v......