使用Groovy创建Jenkins环境变量

the*_*c27 32 groovy jenkins

我认为这是另一个简单的问题,但我无法使任何网络解决方案起作用.我的项目采用版本号.每个数字可以用'.'分隔.或'_'.我想要一个只显示前两个数字的变量.

我尝试编写一个创建Jenkins环境变量的groovy脚本.
我想取前两位而不是整个字符串.

//Get the version parameter
def env = System.getenv()
def version = env['currentversion']
def m = version =~/\d{1,2}/
env = ['miniVersion':m[0].m[1]]
Run Code Online (Sandbox Code Playgroud)

我是否正确地这样做,我甚至可以创建一个新的环境变量,并且有更好的解决方案.

Nic*_*aly 49

詹金斯1.x

以下groovy代码段应该传递版本(正如您已经提供的那样),并将其作为'miniVersion'存储在作业的变量中.

import hudson.model.*

def env = System.getenv()
def version = env['currentversion']
def m = version =~/\d{1,2}/
def minVerVal = m[0]+"."+m[1]

def pa = new ParametersAction([
  new StringParameterValue("miniVersion", minVerVal)
])

// add variable to current job
Thread.currentThread().executable.addAction(pa)
Run Code Online (Sandbox Code Playgroud)

然后可以从其他构建步骤访问该变量.例如

echo miniVersion=%miniVersion%
Run Code Online (Sandbox Code Playgroud)

输出:

miniVersion=12.34
Run Code Online (Sandbox Code Playgroud)

我相信你需要使用"系统Groovy脚本"(仅在主节点上)而不是"Groovy插件" - https://wiki.jenkins-ci.org/display/JENKINS/Groovy+plugin# Groovyplugin-GroovyScriptvsSystemGroovyScript

詹金斯2.x

我相信之前的(Jenkins 1.x)行为由于此安全建议而停止工作...

解决方案(从安全咨询中解释)

它可以通过设置系统属性来恢复以前的行为hudson.model.ParametersAction.keepUndefinedParameterstrue.这可能非常不安全,仅作为短期解决方案.

java -Dhudson.model.ParametersAction.keepUndefinedParameters=true -jar jenkins.war
Run Code Online (Sandbox Code Playgroud)

要允许将特定的已知安全参数名称传递给构建,请将系统属性设置hudson.model.ParametersAction.safeParameters为以逗号分隔的安全参数名称列表.

例如

java -Dhudson.model.ParametersAction.safeParameters=miniVersion,FOO,BAR -jar jenkins.war
Run Code Online (Sandbox Code Playgroud)

  • 这仅在您在主节点中运行groovy脚本时才有效,但在slave上不运行. (3认同)

ste*_*ede 19

您还可以在Groovy系统脚本中定义没有EnvInject插件的变量:

import hudson.model.*
def build = Thread.currentThread().executable
def pa = new ParametersAction([
  new StringParameterValue("FOO", "BAR")
])
build.addAction(pa)
Run Code Online (Sandbox Code Playgroud)

然后,您可以在下一个构建步骤中访问此变量,该步骤(例如)是一个Windows批处理命令:

@echo off
Setlocal EnableDelayedExpansion
echo FOO=!FOO!
Run Code Online (Sandbox Code Playgroud)

这个回声会显示"FOO = BAR".

问候

  • 这正是我需要的,但我得到“无法解析类 StringParameterValue”,有什么想法吗? (2认同)

Raj*_*ish 10

作为其他答案,状态设置new ParametersAction是注入一个或多个环境变量的方式,但是当作业已经参数化时,添加新操作将不会生效.相反,您将看到指向同一组参数的构建参数的两个链接,以及您要添加的参数null.

以下是在两种情况下更新参数列表的片段(参数化和非参数化作业):

import hudson.model.*

def build = Thread.currentThread().executable

def env = System.getenv()
def version = env['currentversion']
def m = version =~/\d{1,2}/
def minVerVal = m[0]+"."+m[1]

def newParams = null

def pl = new ArrayList<StringParameterValue>()
pl.add(new StringParameterValue('miniVersion', miniVerVal))

def oldParams = build.getAction(ParametersAction.class)

if(oldParams != null) {
  newParams = oldParams.createUpdated(pl)
  build.actions.remove(oldParams)
} else {
  newParams = new ParametersAction(pl)
}

build.addAction(newParams)
Run Code Online (Sandbox Code Playgroud)


jam*_*ann 10

对我来说,以下内容也适用于Jenkins 2(2.73.3)

更换

def pa = new ParametersAction([new StringParameterValue("FOO", foo)])
build.addAction(pa)
Run Code Online (Sandbox Code Playgroud)

def pa = new ParametersAction([new StringParameterValue("FOO", foo)], ["FOO"])
build.addAction(pa)
Run Code Online (Sandbox Code Playgroud)

ParametersAction似乎有第二个构造函数允许传入"additionalSafeParameters" https://github.com/jenkinsci/jenkins/blob/master/core/src/main/java/hudson/model/ParametersAction.java


jwe*_*rny 9

Jenkins EnvInject插件可能能够帮助您.它允许将环境变量注入构建环境.

我知道它有一些编写脚本的能力,所以它可能能够做你想要的.我只用它来设置简单的属性(例如"LOG_PATH = $ {WORKSPACE}\logs").


The*_*lis 8

经过一番搜索后,我认为最好的解决方案是使用hudson.model.EnvironmentContributingAction.

import hudson.model.EnvironmentContributingAction
import hudson.model.AbstractBuild 
import hudson.EnvVars

class BuildVariableInjector {

    def build
    def out

    def BuildVariableInjector(build, out) {
        this.build = build
        this.out = out
    }

    def addBuildEnvironmentVariable(key, value) {
        def action = new VariableInjectionAction(key, value)
        build.addAction(action)
        //Must call this for action to be added
        build.getEnvironment()
    }

    class VariableInjectionAction implements EnvironmentContributingAction {

        private String key
        private String value

        public VariableInjectionAction(String key, String value) {
            this.key = key
            this.value = value
        }

        public void buildEnvVars(AbstractBuild build, EnvVars envVars) {

            if (envVars != null && key != null && value != null) {
                envVars.put(key, value);
            }
        }

        public String getDisplayName() {
            return "VariableInjectionAction";
        }

        public String getIconFileName() {
            return null;
        }

        public String getUrlName() {
            return null;
        }
    }    
}
Run Code Online (Sandbox Code Playgroud)

我在一个作业中的系统groovy脚本(使用groovy插件)中使用这个类.

import hudson.model.*
import java.io.File;
import jenkins.model.Jenkins;    

def jenkinsRootDir = build.getEnvVars()["JENKINS_HOME"];
def parent = getClass().getClassLoader()
def loader = new GroovyClassLoader(parent)

def buildVariableInjector = loader.parseClass(new File(jenkinsRootDir + "/userContent/GroovyScripts/BuildVariableInjector.groovy")).newInstance(build, getBinding().out)

def projectBranchDependencies = [] 
//Some logic to set projectBranchDependencies variable

buildVariableInjector.addBuildEnvironmentVariable("projectBranchDependencies", projectBranchDependencies.join(","));
Run Code Online (Sandbox Code Playgroud)

然后,您可以在我的案例中从ANT脚本访问构建中任何其他点的projectBranchDependencies变量.

注意:我从博客文章中借用/修改了部分实现的想法,但在发布时我无法找到原始来源以便给予应有的信任.