Merged revisions 17324-17325,17428,17430,17473-17475,17481-17482,17555-17563,17571,17593-17595,17619-17620,17637-17644,17656-17657,17663-17665,17667-17670,17730,17753,17755-17758,17763-17768,17770-17771,17901,17906,17911-17912,17958,17961-17962,17970-17977 via svnmerge from

https://www.dev.java.net/svn/hudson/branches/tool-autoinstallation

........
  r17324 | jglick | 2009-04-20 18:24:32 -0700 (Mon, 20 Apr 2009) | 2 lines
  
  Defensive cloning and Javadoc corrections.
  (Though it seems no one is using the default impls of these methods yet anyway.)
........
  r17325 | jglick | 2009-04-20 18:29:06 -0700 (Mon, 20 Apr 2009) | 1 line
  
  Deprecation of delegate method is intentional.
........
  r17428 | jglick | 2009-04-23 08:07:14 -0700 (Thu, 23 Apr 2009) | 1 line
  
  Noting ToolLocationTranslator more prominently.
........
  r17430 | jglick | 2009-04-23 09:16:40 -0700 (Thu, 23 Apr 2009) | 1 line
  
  Unused imports.
........
  r17473 | jglick | 2009-04-23 19:21:11 -0700 (Thu, 23 Apr 2009) | 1 line
  
  Allow Plugin.configure to see the StaplerRequest, needed for some kinds of calls.
........
  r17474 | jglick | 2009-04-23 19:25:54 -0700 (Thu, 23 Apr 2009) | 3 lines
  
  Initial sketch of plugin to manage tool installations across slaves.
  (Should really be under ../plugins/ but that was not branched, so putting here for the moment.)
........
  r17475 | jglick | 2009-04-23 20:29:36 -0700 (Thu, 23 Apr 2009) | 1 line
  
  Typo in Javadoc.
........
  r17481 | jglick | 2009-04-23 22:46:26 -0700 (Thu, 23 Apr 2009) | 1 line
  
  Unzip of an unbuffered stream is painfully slow.
........
  r17482 | jglick | 2009-04-23 22:48:01 -0700 (Thu, 23 Apr 2009) | 1 line
  
  ZIP-based tool installer now functional.
........
  r17555 | jglick | 2009-04-27 17:50:38 -0700 (Mon, 27 Apr 2009) | 1 line
  
  Build against newest trunk.
........
  r17556 | jglick | 2009-04-27 18:38:28 -0700 (Mon, 27 Apr 2009) | 1 line
  
  Adding help.
........
  r17557 | jglick | 2009-04-27 18:57:46 -0700 (Mon, 27 Apr 2009) | 1 line
  
  Moving toolName & label config GUI into generic files.
........
  r17558 | jglick | 2009-04-27 19:37:30 -0700 (Mon, 27 Apr 2009) | 1 line
  
  Typo.
........
  r17559 | jglick | 2009-04-27 20:07:47 -0700 (Mon, 27 Apr 2009) | 1 line
  
  Second tool installer type based on a freeform command.
........
  r17560 | jglick | 2009-04-27 20:24:36 -0700 (Mon, 27 Apr 2009) | 1 line
  
  installIfNecessaryFrom will now just return false in case the target dir exists but the URL cannot be opened.
........
  r17561 | jglick | 2009-04-27 20:25:22 -0700 (Mon, 27 Apr 2009) | 2 lines
  
  chmod only if something was actually installed.
  Use a+x, not o+x.
........
  r17562 | jglick | 2009-04-27 20:26:46 -0700 (Mon, 27 Apr 2009) | 1 line
  
  Comment only.
........
  r17563 | jglick | 2009-04-27 20:41:12 -0700 (Mon, 27 Apr 2009) | 1 line
  
  I18N.
........
  r17571 | jglick | 2009-04-28 08:15:31 -0700 (Tue, 28 Apr 2009) | 2 lines
  
  Wiki link.
........
  r17593 | jglick | 2009-04-28 15:38:33 -0700 (Tue, 28 Apr 2009) | 1 line
  
  Turn off echo mode, it's just noise.
........
  r17594 | jglick | 2009-04-28 15:39:29 -0700 (Tue, 28 Apr 2009) | 2 lines
  
  Synchronizing access to installers for a given node/tool combo.
  Sending log messages to Hudson log in real time.
........
  r17595 | jglick | 2009-04-28 15:46:29 -0700 (Tue, 28 Apr 2009) | 1 line
  
  Copyrights.
........
  r17619 | jglick | 2009-04-29 06:25:23 -0700 (Wed, 29 Apr 2009) | 1 line
  
  Improved Javadoc.
........
  r17620 | jglick | 2009-04-29 06:51:11 -0700 (Wed, 29 Apr 2009) | 1 line
  
  Demonstraing how to use DLJ to mechanically install official JDK releases on supported operating systems.
........
  r17637 | kohsuke | 2009-04-30 16:15:24 -0700 (Thu, 30 Apr 2009) | 1 line
  
  fixed what appears to be a C&P mistake
........
  r17638 | kohsuke | 2009-04-30 16:16:21 -0700 (Thu, 30 Apr 2009) | 1 line
  
  show YUI logger if YUI debugging mode is set.
........
  r17639 | kohsuke | 2009-04-30 16:52:28 -0700 (Thu, 30 Apr 2009) | 7 lines
  
  Fixed a UI script problem when <hetero-list> nests inside <repeatable>.
  
  The cause of the problem was that the behavior for inner <hetero-list> kicks in first, altering HTML (by removing "prototypes"), before behavior for outer <repetable> kicks in and removes the master copy from DOM tree.
  
  So <repeatable> ends up computing a master copy after some elements are removed, and hence when we try to reinsert them later by clicking "Add", it'll get incorrect copy, and re-execution of the <hetero-list> behavior bombs out.
  
  I fixed this by skipping those HTML-altering behaviors if they show up in the part of DOM tree that's supposed to be snapshotted and removed.
........
  r17640 | kohsuke | 2009-04-30 16:57:58 -0700 (Thu, 30 Apr 2009) | 7 lines
  
  Added ToolProperty to ToolInstallation (which acts like NodeProperty to Node --- basically decorates the base object with additional properties.)
  
  The original motivation is to implement ToolInstaller this way, if Jesse is OK. But decorating tools seem to have some other interesting use, such as a plugin for configuring $M2_HOME/conf/settings.xml, or a plugin to insert unlimited cryptography extension to JDK, or a plugin to add a few more jars into $ANT_HOME/lib.
  
  For this to work, ToolInstallations that want properties needs to be modified to use a new constructor. For a starter, I modified the JDK class to do this.
  
  I also took the opportunity to modernize JDK/config.jelly.
........
  r17641 | kohsuke | 2009-04-30 17:02:04 -0700 (Thu, 30 Apr 2009) | 1 line
  
  this appears to be a left-over from early days when we didn't have a means to do form validation
........
  r17642 | kohsuke | 2009-04-30 17:02:35 -0700 (Thu, 30 Apr 2009) | 1 line
  
  we don't need no.such.JDK but we need name. rebranching
........
  r17643 | kohsuke | 2009-04-30 17:03:22 -0700 (Thu, 30 Apr 2009) | 1 line
  
  rebranched from Hudson's configure.properties
........
  r17644 | kohsuke | 2009-04-30 17:05:31 -0700 (Thu, 30 Apr 2009) | 1 line
  
  removed unnecessary translations
........
  r17656 | kohsuke | 2009-05-01 11:27:36 -0700 (Fri, 01 May 2009) | 1 line
  
  Less hack for improved type safety. Asking people to write more code is not necessarily bad as long as what they need to do is obvious to them.
........
  r17657 | kohsuke | 2009-05-01 12:07:20 -0700 (Fri, 01 May 2009) | 5 lines
  
  The toolautoinst part of the change that corresponds to rev.17640.
  
  ToolInstallers are now hooked under ToolInstallation through InstallSourceProperty as a ToolProperty.
  
  This allows the relevant UIs to be shown in one place. Still pending Jesse's feedback. Making it a single commit to simplify a revert if necessary
........
  r17663 | kohsuke | 2009-05-01 13:23:51 -0700 (Fri, 01 May 2009) | 1 line
  
  doc improvement
........
  r17664 | kohsuke | 2009-05-01 13:24:10 -0700 (Fri, 01 May 2009) | 1 line
  
  needs this to allow Stapler to databind hetero-list automatically
........
  r17665 | jglick | 2009-05-01 13:31:27 -0700 (Fri, 01 May 2009) | 1 line
  
  Warnings.
........
  r17667 | kohsuke | 2009-05-01 14:20:53 -0700 (Fri, 01 May 2009) | 1 line
  
  added a method to do chmod
........
  r17668 | kohsuke | 2009-05-01 14:30:35 -0700 (Fri, 01 May 2009) | 1 line
  
  prefer JDK6 version to avoid unnecessary JNA loading
........
  r17669 | kohsuke | 2009-05-01 14:33:09 -0700 (Fri, 01 May 2009) | 1 line
  
  no, I must have confused this.
........
  r17670 | kohsuke | 2009-05-01 15:57:11 -0700 (Fri, 01 May 2009) | 2 lines
  
  - Automated JDK installer and its test.
  - Minor update to the signature of ToolInstaller for supplying the expected default location.
........
  r17730 | kohsuke | 2009-05-04 11:27:34 -0700 (Mon, 04 May 2009) | 1 line
  
  avoid NPE as reported in HUDSON-3608
........
  r17753 | jglick | 2009-05-04 19:34:08 -0700 (Mon, 04 May 2009) | 2 lines
  
  Moved toolautoinst functionality into core.
........
  r17755 | jglick | 2009-05-04 20:28:34 -0700 (Mon, 04 May 2009) | 8 lines
  
  Added TaskListener parameter and IOException and InterruptedException to several methods:
  Run.getEnvironment
  NodeSpecific.forNode
  ToolLocationTranslator.getToolHome
  ToolLocationNodeProperty.getToolHome
  ToolInstallation.translateFor
  ProcessCache.Factory.getMavenInstallation
  ProcessCache.Factory.getJava
........
  r17756 | jglick | 2009-05-04 20:36:56 -0700 (Mon, 04 May 2009) | 1 line
  
  expectedLocation was never strictly necessary, and will soon no longer be used even by JDKInstaller.
........
  r17757 | jglick | 2009-05-04 20:40:41 -0700 (Mon, 04 May 2009) | 1 line
  
  Not sure yet what @since should be.
........
  r17758 | jglick | 2009-05-04 20:41:51 -0700 (Mon, 04 May 2009) | 1 line
  
  getDefaultInstallers method added. Not yet in use.
........
  r17763 | kohsuke | 2009-05-05 10:50:36 -0700 (Tue, 05 May 2009) | 1 line
  
  deprecated redundant getJavaHome method
........
  r17764 | kohsuke | 2009-05-05 12:10:45 -0700 (Tue, 05 May 2009) | 1 line
  
  added general-purpose property defaulting mechanism, and added default tool installer for JDK
........
  r17765 | jglick | 2009-05-05 12:35:56 -0700 (Tue, 05 May 2009) | 1 line
  
  capitalize("") -> ""
........
  r17766 | jglick | 2009-05-05 12:49:52 -0700 (Tue, 05 May 2009) | 1 line
  
  Missing @since.
........
  r17767 | jglick | 2009-05-05 13:01:41 -0700 (Tue, 05 May 2009) | 1 line
  
  Unchecked warning.
........
  r17768 | jglick | 2009-05-05 13:19:49 -0700 (Tue, 05 May 2009) | 2 lines
  
  Two unsuccessful attempts at form validation.
........
  r17770 | jglick | 2009-05-05 13:48:37 -0700 (Tue, 05 May 2009) | 1 line
  
  Better class names.
........
  r17771 | kohsuke | 2009-05-05 14:12:21 -0700 (Tue, 05 May 2009) | 5 lines
  
  brought the form validation check back. The trick is to use the 'value' parameter.
  
  In the end we'd expect this check to go away anyway, as we change input field to drop-down list, but in the mean time, this is why it didn't work.
  
  Maybe we probably need more static code checkers? Like FindBugs rules?
........
  r17901 | kohsuke | 2009-05-09 19:15:40 -0700 (Sat, 09 May 2009) | 1 line
  
  having two toolHome is odd.
........
  r17906 | kohsuke | 2009-05-10 11:09:13 -0700 (Sun, 10 May 2009) | 1 line
  
  adding the generalization of UpdateCenter, but for compatibility reasons, we are leaving UpdateCenter as-is.
........
  r17911 | kohsuke | 2009-05-10 17:02:53 -0700 (Sun, 10 May 2009) | 1 line
  
  integrated json-lib with a bit of bug fix
........
  r17912 | kohsuke | 2009-05-10 17:13:05 -0700 (Sun, 10 May 2009) | 1 line
  
  JDK list is now fetched from hudson.dev.java.net
........
  r17958 | kohsuke | 2009-05-11 13:44:25 -0700 (Mon, 11 May 2009) | 48 lines
  
  Handle AbortException better to avoid error like this:
  
  [INFO] ------------------------------------------------------------------------
  [ERROR] BUILD ERROR
  [INFO] ------------------------------------------------------------------------
  [INFO] Failed to delete directory: C:\files\hudson\workspace\hudson\hudson\main\remoting\target. Reason: Unable to delete file C:\files\hudson\workspace\hudson\hudson\main\remoting\target\remoting-1.304-SNAPSHOT.jar
  
  [INFO] ------------------------------------------------------------------------
  [INFO] For more information, run Maven with the -e switch
  [INFO] ------------------------------------------------------------------------
  [INFO] Total time: 31 seconds
  [INFO] Finished at: Sun May 10 18:15:33 PDT 2009
  [INFO] Final Memory: 25M/48M
  [INFO] ------------------------------------------------------------------------
  Recording fingerprints
  Archiving artifacts
  Recording test results
  ERROR: Failed to archive JUnit reports
  hudson.util.IOException2: remote file operation failed
  	at hudson.FilePath.act(FilePath.java:596)
  	at hudson.tasks.junit.JUnitResultArchiver.perform(JUnitResultArchiver.java:82)
  	at hudson.model.AbstractBuild$AbstractRunner.performAllBuildStep(AbstractBuild.java:372)
  	at hudson.model.AbstractBuild$AbstractRunner.performAllBuildStep(AbstractBuild.java:360)
  	at hudson.model.Build$RunnerImpl.post2(Build.java:183)
  	at hudson.model.AbstractBuild$AbstractRunner.post(AbstractBuild.java:345)
  	at hudson.model.Run.run(Run.java:943)
  	at hudson.model.Build.run(Build.java:112)
  	at hudson.model.ResourceController.execute(ResourceController.java:93)
  	at hudson.model.Executor.run(Executor.java:119)
  Caused by: hudson.AbortException: Test reports were found but none of them are new. Did tests run? 
  For example, \files\hudson\workspace\hudson\hudson\main\core\target\surefire-reports\TEST-hudson.BulkChangeTest.xml is 2 days 23 hr old
  
  	at hudson.tasks.junit.TestResult.parse(TestResult.java:134)
  	at hudson.tasks.junit.TestResult.<init>(TestResult.java:95)
  	at hudson.tasks.junit.JUnitResultArchiver$1.invoke(JUnitResultArchiver.java:95)
  	at hudson.tasks.junit.JUnitResultArchiver$1.invoke(JUnitResultArchiver.java:82)
  	at hudson.FilePath$FileCallableWrapper.call(FilePath.java:1583)
  	at hudson.remoting.UserRequest.perform(UserRequest.java:92)
  	at hudson.remoting.UserRequest.perform(UserRequest.java:46)
  	at hudson.remoting.Request$2.run(Request.java:236)
  	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
  	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
  	at java.util.concurrent.FutureTask.run(FutureTask.java:138)
  	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
  	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
  	at java.lang.Thread.run(Thread.java:619)
........
  r17961 | kohsuke | 2009-05-11 15:16:39 -0700 (Mon, 11 May 2009) | 1 line
  
  adding Windows JDK silent installation
........
  r17962 | kohsuke | 2009-05-11 16:08:13 -0700 (Mon, 11 May 2009) | 1 line
  
  Fixing JDK offline installatino for Windows
........
  r17970 | kohsuke | 2009-05-11 19:37:59 -0700 (Mon, 11 May 2009) | 1 line
  
  Fixing a problem that prevents the usage of this tag in <repeatable> block, which reinserts the same fragment over and over. So statically assigning IDs won't work
........
  r17971 | kohsuke | 2009-05-11 22:17:09 -0700 (Mon, 11 May 2009) | 1 line
  
  continuing to remove static ID generation, which breaks the tag when used inside <repetable> tag.
........
  r17972 | kohsuke | 2009-05-11 22:19:11 -0700 (Mon, 11 May 2009) | 1 line
  
  I don't know when this started, but even in the hudson-dev:run mode, the versionis no longer '?', so we need a different way to force reload
........
  r17973 | kohsuke | 2009-05-11 22:26:34 -0700 (Mon, 11 May 2009) | 1 line
  
  adjusted the text a bit since multiple "add" and "delete"s were rather confusing
........
  r17974 | kohsuke | 2009-05-11 22:31:58 -0700 (Mon, 11 May 2009) | 1 line
  
  added help screen
........
  r17975 | kohsuke | 2009-05-11 22:41:39 -0700 (Mon, 11 May 2009) | 1 line
  
  form validation now works against the checkbox, too
........
  r17976 | kohsuke | 2009-05-11 22:43:00 -0700 (Mon, 11 May 2009) | 1 line
  
  with auto installation, we expect users to specify a directory that doesn't exist yet, so don't report it as an error
........
  r17977 | kohsuke | 2009-05-11 22:43:24 -0700 (Mon, 11 May 2009) | 1 line
  
  improving the text
........


git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@17985 71c3de6d-444a-0410-be80-ed276b4c234a
This commit is contained in:
kohsuke committed 2009-05-12 13:59:10 +00:00
1 parent bdd10908e7
commit 2a8a0bf7fa
78 files changed
+2399 -197

No files matched your search

+61 -6
View File
@@ -40,7 +40,7 @@ import hudson.remoting.RemoteInputStream;
import hudson.util.IOException2;
import hudson.util.HeadBufferingStream;
import hudson.util.FormValidation;
import hudson.util.jna.GNUCLibrary;
import static hudson.util.jna.GNUCLibrary.LIBC;
import static hudson.Util.fixEmpty;
import static hudson.FilePath.TarCompression.GZIP;
import org.apache.tools.ant.BuildException;
@@ -88,6 +88,8 @@ import java.util.zip.GZIPOutputStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.ZipInputStream;
import com.sun.jna.Native;
/**
* {@link File} like object with remoting support.
*
@@ -192,6 +194,11 @@ public final class FilePath implements Serializable {
this.remote = localPath.getPath();
}
/**
* Construct a path starting with a base location.
* @param base starting point for resolution, and defines channel
* @param rel a path which if relative will be resolved against base
*/
public FilePath(FilePath base, String rel) {
this.channel = base.channel;
if(isAbsolute(rel)) {
@@ -382,7 +389,7 @@ public final class FilePath implements Serializable {
private void unzip(File dir, InputStream in) throws IOException {
dir = dir.getAbsoluteFile(); // without absolutization, getParentFile below seems to fail
ZipInputStream zip = new ZipInputStream(in);
ZipInputStream zip = new ZipInputStream(new BufferedInputStream(in));
java.util.zip.ZipEntry e;
try {
@@ -408,6 +415,17 @@ public final class FilePath implements Serializable {
}
}
/**
* Absolutizes this {@link FilePath} and returns the new one.
*/
public FilePath absolutize() throws IOException, InterruptedException {
return new FilePath(channel,act(new FileCallable<String>() {
public String invoke(File f, VirtualChannel channel) throws IOException {
return f.getAbsolutePath();
}
}));
}
/**
* Supported tar file compression methods.
*/
@@ -472,10 +490,11 @@ public final class FilePath implements Serializable {
* that supports upgrade and downgrade. Specifically,
*
* <ul>
* <li>If the target directory doesn't exit {@linkplain #mkdirs() it'll be created}.
* <li>If the target directory doesn't exist {@linkplain #mkdirs() it'll be created}.
* <li>The timestamp of the .tgz file is left in the installation directory upon extraction.
* <li>If the timestamp left in the directory doesn't match with the timestamp of the current archive file,
* the directory contents will be discarded and the archive file will be re-extracted.
* <li>If the connection is refused but the target directory already exists, it is left alone.
* </ul>
*
* @param archive
@@ -490,7 +509,21 @@ public final class FilePath implements Serializable {
* @since 1.299
*/
public boolean installIfNecessaryFrom(URL archive, TaskListener listener, String message) throws IOException, InterruptedException {
URLConnection con = archive.openConnection();
URLConnection con;
try {
con = archive.openConnection();
con.connect();
} catch (IOException x) {
if (this.exists()) {
// Cannot connect now, so assume whatever was last unpacked is still OK.
if (listener != null) {
listener.getLogger().println("Skipping installation of " + archive + " to " + remote + ": " + x);
}
return false;
} else {
throw x;
}
}
long sourceTimestamp = con.getLastModified();
FilePath timestamp = this.child(".timestamp");
@@ -591,6 +624,8 @@ public final class FilePath implements Serializable {
// run this on a remote system
try {
return channel.call(new FileCallableWrapper<T>(callable));
} catch (AbortException e) {
throw e; // pass through so that the caller can catch it as AbortException
} catch (IOException e) {
// wrap it into a new IOException so that we get the caller's stack trace as well.
throw new IOException2("remote file operation failed",e);
@@ -709,7 +744,9 @@ public final class FilePath implements Serializable {
}
/**
* The same as {@code new FilePath(this,rel)} but more OO.
* The same as {@link FilePath#FilePath(FilePath,String)} but more OO.
* @param rel a relative or absolute path
* @return a file on the same channel
*/
public FilePath child(String rel) {
return new FilePath(this,rel);
@@ -864,6 +901,24 @@ public final class FilePath implements Serializable {
});
}
/**
* Sets the file permission.
*
* On Windows, no-op.
*
* @since 1.303
*/
public void chmod(final int mask) throws IOException, InterruptedException {
if(!isUnix()) return;
act(new FileCallable<Void>() {
public Void invoke(File f, VirtualChannel channel) throws IOException {
if(LIBC.chmod(f.getAbsolutePath(),mask)!=0)
throw new IOException("Failed to chmod "+f+" : "+LIBC.strerror(Native.getLastError()));
return null;
}
});
}
/**
* List up files and directories in this directory.
*
@@ -1265,7 +1320,7 @@ public final class FilePath implements Serializable {
f.setLastModified(te.getModTime().getTime());
int mode = te.getMode()&0777;
if(mode!=0 && !Hudson.isWindows()) // be defensive
GNUCLibrary.LIBC.chmod(f.getPath(),mode);
LIBC.chmod(f.getPath(),mode);
}
}
} catch(IOException e) {