Jenkins API:EnvVars.override所有都不会覆盖Pipeline作业中的现有环境变量。

时间:2018-01-29 21:22:36

标签: java jenkins jenkins-plugins

我试图通过EnvironmentContributor.buildEnvironmentFor()方法在运行时设置Jenkins环境变量。假设我在Jenkins配置页面中设置了一个名为“existingKey”的环境变量,其值为“oldValue”。如果我使用EnvVars.overrideAll将existingKey设置为任何其他值,则不需要。新的键/值对仍然存在。这是我的代码:

@Extension
public class MyEnvironmentContributor extends EnvironmentContributor {
    Logger log...

    @Override
    public void buildEnvironmentFor(@Nonnull Job j, @Nonnull EnvVars envs, @Nonnull TaskListener listener) throws IOException, InterruptedException {
        log.fine("pre: existingKey="+envs.get("existingKey"));

        HashMap<String, String> newEnvVars = new HashMap<String, String>();
        newEnvVars.put("newKey", "newValue");
        newEnvVars.put("existingKey","newValue");
        envs.overrideAll(newEnvVars);

        log.fine("post: existingKey="+envs.get("existingKey"));
    }
}

我使用相同的结果测试了上面的buildEnvironmentFor(Job,...)和buildEnvironmentFor(Run,...)。我也尝试过EnvVar.override()和envVar.overrideExpandingAll(),似乎没有工作。

我还扩展了RunListener,它允许我监视我的env变量是否设置好。

@Extension
public class MyRunListener extends RunListener<Run> {
    Logger log.....

    public MyRunListener(){
        //lazy loaded class
    }

    @Override
    public void onStarted(final Run run, final TaskListener listener) {
        log.fine("Build Started: " + run.getUrl() + ", " + run.getDisplayName());
        try{
            EnvVars env = run.getEnvironment(listener);
            for (Entry<String, String> entry : env.entrySet()) {
                log.fine(entry.getKey() + "=" + entry.getValue());
            }
        }catch(){//trivial}
    }
}

生成的日志如下所示:

Build Started: job/Test/job/EnvTest/20/, #20
pre: existingKey=oldValue
post: existingKey=newValue
newKey=newValue
existingKey=oldValue

我也在我的构建容器中打印出env,它显示了相同的模式。任何想法如何实际覆盖现有变量而不只是设置新变量?

2 个答案:

答案 0 :(得分:0)

由于EnvVars扩展TreeMap,因此在插入existingKey之前,您可以将其删除,即

log.fine("pre: existingKey="+envs.get("existingKey"));

envs.remove("existingKey");
newEnvVars.put("newKey", "newValue");
newEnvVars.put("existingKey","newValue");
envs.overrideAll(newEnvVars);    

log.fine("post: existingKey="+envs.get("existingKey"));

答案 1 :(得分:0)

看起来这是不可能的。

  

并且{是env在首次使用后缓存变量,以避免性能   问题。目前没有任何重新运行的规定   EnvironmentContributor,以及Jenkins中的任何API   贡献者表示他们的结果可能已经发生变化   最后一个电话。   https://groups.google.com/forum/#!msg/jenkinsci-dev/FM_Nx_K_v9g/4BzWXd3cAgAJ