private String getEnvDefinedMavenHome(EnvVars env) { String mavenHome = env.get("MAVEN_HOME"); if (StringUtils.isNotBlank(mavenHome)) { return mavenHome; } return env.get("M2_HOME"); }
/** * Expands the list of environment variables by inheriting current env variables. */ private static EnvVars inherit(String[] env) { // convert String[] to Map first EnvVars m = new EnvVars(); if(env!=null) { for (String e : env) { int index = e.indexOf('='); m.put(e.substring(0,index), e.substring(index+1)); } } // then do the inheritance return inherit(m); }
@Override public Proc launch(ProcStarter ps) throws IOException { maskedPrintCommandLine(ps.commands, ps.masks, ps.pwd); EnvVars jobEnv = inherit(ps.envs); // replace variables in command line String[] jobCmd = new String[ps.commands.size()]; for ( int idx = 0 ; idx < jobCmd.length; idx++ ) jobCmd[idx] = jobEnv.expand(ps.commands.get(idx)); return new LocalProc(jobCmd, Util.mapToEnv(jobEnv), ps.reverseStdin ?LocalProc.SELFPUMP_INPUT:ps.stdin, ps.reverseStdout?LocalProc.SELFPUMP_OUTPUT:ps.stdout, ps.reverseStderr?LocalProc.SELFPUMP_OUTPUT:ps.stderr, toFile(ps.pwd)); }
/** * @param out * Where the stderr from the launched process will be sent. */ public Channel launchChannel(OutputStream out, ProcessBuilder pb) throws IOException { final EnvVars cookie = EnvVars.createCookie(); pb.environment().putAll(cookie); final Process proc = pb.start(); final Thread t2 = new StreamCopyThread(pb.command()+": stderr copier", proc.getErrorStream(), out); t2.start(); return new Channel("locally launched channel on "+ pb.command(), Computer.threadPoolForRemoting, proc.getInputStream(), proc.getOutputStream(), out) { /** * Kill the process when the channel is severed. */ @Override public synchronized void terminate(IOException e) { super.terminate(e); ProcessTree pt = ProcessTree.get(); try { pt.killAll(proc,cookie); } catch (InterruptedException x) { LOGGER.log(Level.INFO, "Interrupted", x); } } @Override public synchronized void close() throws IOException { super.close(); // wait for all the output from the process to be picked up try { t2.join(); } catch (InterruptedException e) { // process the interrupt later Thread.currentThread().interrupt(); } } }; }
private ArgumentListBuilder buildMavenCmdLine( AbstractBuild<?, ?> build, BuildListener listener, EnvVars env) throws IOException, InterruptedException { FilePath mavenHome = getMavenHomeDir(build, listener, env); if (!mavenHome.exists()) { listener.error("Couldn't find Maven home: " + mavenHome.getRemote()); throw new Run.RunnerAbortedException(); } ArgumentListBuilder args = new ArgumentListBuilder(); FilePath mavenBootDir = new FilePath(mavenHome, "boot"); FilePath[] classworldsCandidates = mavenBootDir.list("plexus-classworlds*.jar"); if (classworldsCandidates == null || classworldsCandidates.length == 0) { listener.error("Couldn't find classworlds jar under " + mavenBootDir.getRemote()); throw new Run.RunnerAbortedException(); } FilePath classWorldsJar = classworldsCandidates[0]; // classpath args.add("-classpath"); // String cpSeparator = launcher.isUnix() ? ":" : ";"; args.add(classWorldsJar.getRemote()); // maven home args.addKeyValuePair("-D", "maven.home", mavenHome.getRemote(), false); String buildInfoPropertiesFile = env.get(BuildInfoConfigProperties.PROP_PROPS_FILE); boolean artifactoryIntegration = StringUtils.isNotBlank(buildInfoPropertiesFile); listener .getLogger() .println("Artifactory integration is " + (artifactoryIntegration ? "enabled" : "disabled")); String classworldsConfPath; if (artifactoryIntegration) { args.addKeyValuePair( "-D", BuildInfoConfigProperties.PROP_PROPS_FILE, buildInfoPropertiesFile, false); // use the classworlds conf packaged with this plugin and resolve the extractor libs File maven3ExtractorJar = Which.jarFile(Maven3BuildInfoLogger.class); FilePath actualDependencyDirectory = PluginDependencyHelper.getActualDependencyDirectory(build, maven3ExtractorJar); if (getMavenOpts() == null || !getMavenOpts().contains("-Dm3plugin.lib")) { args.addKeyValuePair("-D", "m3plugin.lib", actualDependencyDirectory.getRemote(), false); } URL classworldsResource = getClass() .getClassLoader() .getResource("org/jfrog/hudson/maven3/classworlds-freestyle.conf"); File classworldsConfFile = new File(URLDecoder.decode(classworldsResource.getFile(), "utf-8")); if (!classworldsConfFile.exists()) { listener.error( "Unable to locate classworlds configuration file under " + classworldsConfFile.getAbsolutePath()); throw new Run.RunnerAbortedException(); } // If we are on a remote slave, make a temp copy of the customized classworlds conf if (Computer.currentComputer() instanceof SlaveComputer) { FilePath remoteClassworlds = build.getWorkspace().createTextTempFile("classworlds", "conf", "", false); remoteClassworlds.copyFrom(classworldsResource); classworldsConfPath = remoteClassworlds.getRemote(); } else { classworldsConfPath = classworldsConfFile.getCanonicalPath(); } } else { classworldsConfPath = new FilePath(mavenHome, "bin/m2.conf").getRemote(); } args.addKeyValuePair("-D", "classworlds.conf", classworldsConfPath, false); // maven opts if (StringUtils.isNotBlank(getMavenOpts())) { String mavenOpts = Util.replaceMacro(getMavenOpts(), build.getBuildVariableResolver()); args.add(mavenOpts); } // classworlds launcher main class args.add(CLASSWORLDS_LAUNCHER); // pom file to build String rootPom = getRootPom(); if (StringUtils.isNotBlank(rootPom)) { args.add("-f", rootPom); } // maven goals args.addTokenized(getGoals()); return args; }
@Override public BuildWrapper.Environment setUp( AbstractBuild build, Launcher launcher, BuildListener listener) throws IOException, InterruptedException { final PrintStream logger = listener.getLogger(); final DeviceFarmApi api = new DeviceFarmApiImpl(); long start = System.currentTimeMillis(); try { EnvVars environment = build.getEnvironment(listener); String expendedTag = environment.expand(tag); log(logger, Messages.TRYING_TO_CONNECT_API_SERVER(deviceApiUrl, expendedTag)); api.connectApiServer( logger, deviceApiUrl, expendedTag, build.getProject().getAbsoluteUrl() + build.getNumber()); final RemoteDevice reserved = api.waitApiResponse( logger, DEVICE_WAIT_TIMEOUT_IN_MILLIS, DEVICE_READY_CHECK_INTERVAL_IN_MS); log( logger, Messages.DEVICE_IS_READY(passedSeconds(start), reserved.ip, reserved.port, reserved.url)); if (descriptor == null) { descriptor = Hudson.getInstance().getDescriptorByType(DescriptorImpl.class); } // Substitute environment and build variables into config final String androidHome = discoverAndroidSdkHome(build, launcher, listener); log(logger, Messages.USING_SDK(androidHome)); AndroidSdk sdk = new AndroidSdk(androidHome, androidHome); final AndroidDeviceContext device = new AndroidDeviceContext(build, launcher, listener, sdk, reserved.ip, reserved.port); // disconnect first to workaround previous error device.disconnect(); // connect device with adb device.connect(DEVICE_CONNECT_TIMEOUT_IN_MILLIS); device.waitDeviceReady(logger, DEVICE_CONNECT_TIMEOUT_IN_MILLIS, 1000); // check availability device.devices(); // unlock screen device.unlockScreen(); // Start dumping logcat to temporary file final LogcatCollector logcatCollector = new LogcatCollector(build, device); logcatCollector.start(); return new BuildWrapper.Environment() { @Override public void buildEnvVars(Map<String, String> env) { env.put("ANDROID_IP", device.ip()); env.put("ANDROID_HOME", androidHome); env.put("ANDROID_SDK_HOME", androidHome); env.put("ANDROID_PORT", Integer.toString(device.port())); env.put("ANDROID_SERIAL", device.serial()); } @Override public boolean tearDown(AbstractBuild build, BuildListener listener) throws IOException, InterruptedException { cleanUp(build, device, api, logcatCollector); return true; } }; } catch (FailedToConnectApiServerException e) { log(logger, Messages.FAILED_TO_CONNECT_API_SERVER()); } catch (MalformedResponseException e) { log(logger, Messages.FAILED_TO_PARSE_DEVICE_FARM_RESPONSE()); } catch (TimeoutException e) { log(logger, Messages.DEVICE_WAIT_TIMEOUT(passedSeconds(start))); } catch (NoDeviceAvailableException e) { log(logger, Messages.NO_SUCH_DEVICE()); } build.setResult(Result.NOT_BUILT); cleanUp(null, null, api, null); return null; }
/** * Expands the list of environment variables by inheriting current env variables. */ private static EnvVars inherit(Map<String,String> overrides) { EnvVars m = new EnvVars(EnvVars.masterEnvVars); m.overrideExpandingAll(overrides); return m; }