Change By: Arnaud Nauwynck (06/Jun/13 12:40 PM)
Description: the EnvInject plugin does not really set the "environment variables" at the OS level, using native POSIX call "putenv()". 
It is only available in some jenkins sub-tasks when calling appropriate jenkins API to exec tasks... but not when calling plain old java code "System.exec()" within a Mojo.... so most Mojo don't work (my problem was when using maven-dotnet-plugin, that forks to execute "Msbuild.exe")

When doing few search over google to set an environment variable in java, I found a piece of code that might be "portable enough", using JNA native calls to standards dlls (msvcrt on Windows / libc on Linux, which solve 100% of my needs)

It simply exposes a method "putenv()" to be called as this:
{quote}SetEnvUtil.putenv("testvar", "123", 1); {quote}

So my request is to add such calls within the EnvInject plugin, but I don't know how to patch exactly the EnvInject jenkins plugin 


It depends on the JNA jar, for example using the maven dependency
{
quote {monospaced } }
    <dependency>
  <groupId>net.java.dev.jna</groupId>
  <artifactId>jna</artifactId>
  <version>3.4.0</version>
    </dependency>
{
quote {monospaced } }

Here is the utility class 
{
quote {monospaced } }
import com.sun.jna.Library;
import com.sun.jna.Native;

public class SetEnvUtil {

    // Inside the Environment class...
    public interface WinLibC extends Library {
        public String getenv(String name);
        public int _putenv(String name);
    }

    public interface LinuxLibC extends Library {
        public String getenv(String name);
        public int setenv(String name, String value, int overwrite);
        public int unsetenv(String name);
    }

    private static Object libc;
    static {
        String osName = System.getProperty("os.name");
        if (osName.equals("Linux")) {
            libc = Native.loadLibrary("c", LinuxLibC.class);
        } else {
            libc = Native.loadLibrary("msvcrt", WinLibC.class);
        }
    }

    public static String getenv(String name) {
        if (libc instanceof LinuxLibC) {
            return ((LinuxLibC) libc).getenv(name);
        } else {
            return ((WinLibC) libc).getenv(name);
        }
    }
    
    public static int setenv(String name, String value, int overwrite) {
        if (libc instanceof LinuxLibC) {
            return ((LinuxLibC) libc).setenv(name, value, overwrite);
        } else {
            return ((WinLibC) libc)._putenv(name + "=" + value);
        }
    }

    public static int unsetenv(String name) {
        if (libc instanceof LinuxLibC) {
            return ((LinuxLibC) libc).unsetenv(name);
        } else {
            return ((WinLibC) libc)._putenv(name + "=");
        }
    }

}
{
quote {monospaced } }



I have done a simple Main for testing purpose, so you can convinced it works simply:
{
quote {monospaced } }
public class SetEnvMain {

    public static final String TEST_VAR_NAME  = "TEST_VAR";

    public static void main(String[] args) {
        dump("before setenv() ... ");
        
        // *** first setenv()  : add new env var 
        SetEnvUtil.setenv(TEST_VAR_NAME , "123", 1);
        
        dump("after setenv(\"" + TEST_VAR_NAME + ", \"123\") ... ");

        // *** second call setenv()  : override existing var 
        SetEnvUtil.setenv(TEST_VAR_NAME , "456", 1);
        
        dump("after setenv(\"" + TEST_VAR_NAME + ", \"456\") ... ");
    }
    
    public static void dump(String messagePrefix) {
        String var_native = SetEnvUtil.getenv(TEST_VAR_NAME);
        String var_cached = System.getenv(TEST_VAR_NAME); // FALSE... cached by java!
        System.out.println(messagePrefix + " " + TEST_VAR_NAME + ": " + var_native + ", (cached): " + var_cached);
    }
    
}
{
quote {monospaced } }
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators.
For more information on JIRA, see: http://www.atlassian.com/software/jira

--
You received this message because you are subscribed to the Google Groups "Jenkins Issues" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.
 
 

Reply via email to