使用jenkins文件设置jenkins环境变量

使用jenkins文件设置jenkins环境变量,jenkins,groovy,jenkins-pipeline,Jenkins,Groovy,Jenkins Pipeline,在Jenkins1中,我们有一个脚本来设置环境变量,类似于: //...imports instance = Jenkins.getInstance() globalNodeProperties = instance.getGlobalNodeProperties() envVarsNodePropertyList = globalNodeProperties.getAll(hudson.slaves.EnvironmentVariablesNodeProperty.class) newEnv

在Jenkins1中,我们有一个脚本来设置环境变量,类似于:

//...imports
instance = Jenkins.getInstance()
globalNodeProperties = instance.getGlobalNodeProperties()
envVarsNodePropertyList = globalNodeProperties.getAll(hudson.slaves.EnvironmentVariablesNodeProperty.class)

newEnvVarsNodeProperty = null
envVars = null

if ( envVarsNodePropertyList == null || envVarsNodePropertyList.size() == 0 ) {
  newEnvVarsNodeProperty = new hudson.slaves.EnvironmentVariablesNodeProperty();
  globalNodeProperties.add(newEnvVarsNodeProperty);
  envVars = newEnvVarsNodeProperty.getEnvVars();
  envVars.put(NEW_VAR, "toto");
} else {
  for (property in envVarsNodePropertyList) {
    envVars = property.getEnvVars();
    envVars.put("EXISTING_VAR","tata");
  }
}
instance.save()
今天我们使用的是Jenkins2,具有jenkinsfile功能,我想知道如何在jenkinsfile中执行相同的操作

这是否可行,如果可行,是否有更好的方法

def setEnvVar() {
    script {
    //all the script above
    }
}
pipeline {
agent any
tools {
    maven 'Maven3_6'
    jdk 'Jdk8'
}
stages {
    stage ('Initialize') {
        steps {
            setEnvVar()
        }
    }
...
编辑:假设我有一个现有的env变量,LAST_DEPLOY=“0.1”,使用:


只会修改当前执行的变量,最终会重置为“0.1”,我希望修改能持续到下一个版本。

只需查看官方文档


然后您可以在sh步骤中使用它,比如${NODE_ENV}

只需查看官方文档


然后您可以在sh步骤中使用它,如${NODE_ENV}

因此,我找到的当前解决方案是将其添加到jenkins文件中:

import jenkins.*
import jenkins.model.*
import hudson.*
import hudson.model.*
import hudson.slaves.*

def updateEnvVar() {
    script {
    instance = Jenkins.getInstance()
    globalNodeProperties = instance.getGlobalNodeProperties()
    envVarsNodePropertyList = globalNodeProperties.getAll(hudson.slaves.EnvironmentVariablesNodeProperty.class)

    newEnvVarsNodeProperty = null
    envVars = null

    if ( envVarsNodePropertyList == null || envVarsNodePropertyList.size() == 0 ) {
      newEnvVarsNodeProperty = new hudson.slaves.EnvironmentVariablesNodeProperty();
      globalNodeProperties.add(newEnvVarsNodeProperty);
      envVars = newEnvVarsNodeProperty.getEnvVars();
      envVars.put(NEW_VAR, "toto");
    } else {
      for (property in envVarsNodePropertyList) {
        envVars = property.getEnvVars();
        envVars.put("EXISTING_VAR","tata");
      }
    }

    instance.save()
    }
}
pipeline {
...
首先,Jenkins将发送一些安全错误,您可以通过转到管理Jenkins->过程中脚本批准->批准来修复这些错误(风险自负)

Cf:

因此,我找到的当前解决方案是在jenkins文件中添加以下内容:

import jenkins.*
import jenkins.model.*
import hudson.*
import hudson.model.*
import hudson.slaves.*

def updateEnvVar() {
    script {
    instance = Jenkins.getInstance()
    globalNodeProperties = instance.getGlobalNodeProperties()
    envVarsNodePropertyList = globalNodeProperties.getAll(hudson.slaves.EnvironmentVariablesNodeProperty.class)

    newEnvVarsNodeProperty = null
    envVars = null

    if ( envVarsNodePropertyList == null || envVarsNodePropertyList.size() == 0 ) {
      newEnvVarsNodeProperty = new hudson.slaves.EnvironmentVariablesNodeProperty();
      globalNodeProperties.add(newEnvVarsNodeProperty);
      envVars = newEnvVarsNodeProperty.getEnvVars();
      envVars.put(NEW_VAR, "toto");
    } else {
      for (property in envVarsNodePropertyList) {
        envVars = property.getEnvVars();
        envVars.put("EXISTING_VAR","tata");
      }
    }

    instance.save()
    }
}
pipeline {
...
首先,Jenkins将发送一些安全错误,您可以通过转到管理Jenkins->过程中脚本批准->批准来修复这些错误(风险自负)

Cf:

但是我测试了这个,如果我执行类似于环境的操作{TITI=“TITI_V0”}TITI将仅在当前jenkins执行中可见,而不会在下一次执行中可见。我希望能够在jenkins文件中创建一个Env变量,该变量在jenkins执行结束时仍然存在,但是我测试了这个变量,如果我执行类似于环境的操作{TITI=“TITI_V0”}TITI将仅在当前jenkins执行中可见,在下一次执行中不可见。我希望能够在jenkins文件中创建一个Env变量,该变量在jenkins执行结束时仍然存在。我不知道有任何内在功能可以实现这一点,因此您最好不要使用您编写的方法nto共享库并在
Jenkinsfile
中调用它。你检查过我下面的答案吗?@MostafaHussein
env.variable
不起作用,我刚刚尝试过,正如我在问题编辑中解释的,我会尽快尝试
def variable=“smt”
env.variable
应该可以正常工作。为了确认我使用的是声明性语法,我可以将变量从一个阶段传递到另一个阶段。关于
环境{}
我以前没有使用过它,所以我不确定它是否与
env.variable
相同,在同一执行过程中从一个阶段到另一个阶段是相同的,但是如果重新启动管道,对
env.variable
所做的任何修改都将丢失。我不知道有任何内在功能可以实现这一点,因此您可能会更好将您编写的方法推迟到共享库中,并在
Jenkinsfile
中调用它。您检查了我下面的答案吗?@MostafaHussein
env.variable
不起作用,我刚刚尝试过,正如我在问题编辑中解释的,我很快就会尝试
def variable=“smt”
env.variable
应该可以正常工作。为了确认我使用的是声明性语法,我可以将变量从一个阶段传递到另一个阶段。关于
环境{}
我以前没有使用过它,因此我不确定它是否与
环境变量相同
是在同一执行过程中从一个阶段到另一个阶段,但如果重新启动管道,则对
环境变量所做的任何修改都将丢失
import jenkins.*
import jenkins.model.*
import hudson.*
import hudson.model.*
import hudson.slaves.*

def updateEnvVar() {
    script {
    instance = Jenkins.getInstance()
    globalNodeProperties = instance.getGlobalNodeProperties()
    envVarsNodePropertyList = globalNodeProperties.getAll(hudson.slaves.EnvironmentVariablesNodeProperty.class)

    newEnvVarsNodeProperty = null
    envVars = null

    if ( envVarsNodePropertyList == null || envVarsNodePropertyList.size() == 0 ) {
      newEnvVarsNodeProperty = new hudson.slaves.EnvironmentVariablesNodeProperty();
      globalNodeProperties.add(newEnvVarsNodeProperty);
      envVars = newEnvVarsNodeProperty.getEnvVars();
      envVars.put(NEW_VAR, "toto");
    } else {
      for (property in envVarsNodePropertyList) {
        envVars = property.getEnvVars();
        envVars.put("EXISTING_VAR","tata");
      }
    }

    instance.save()
    }
}
pipeline {
...