- *.build
- *.changes
- *.pkg
- *.rpm
- *.deb
- *.war
- *.zip
- *.log
+ **/*.build
+ **/*.changes
+ **/*.pkg
+ **/*.rpm
+ **/*.deb
+ **/*.war
+ **/*.zip
+ **/*.log
.repository
.repository/**/*
**/target
diff --git a/changelog.html b/changelog.html
index c95be5195fafc9cb19822d699133fa2b024d1a2a..8167384b77be9c844f115fdc571e867852aa34db 100644
--- a/changelog.html
+++ b/changelog.html
@@ -56,5761 +56,2259 @@ Upcoming changes
-
- Linkage error in
InitializerFinder.discoverTasks
blocks startup.
- (issue 20442)
- -
- Show different “up” link for jobs in folders.
- (issue 20106)
+ Spurious warnings in the log after deleting builds.
+ (issue 25788)
+
-
+ Master labels disappear when system configuration is updated.
+ (issue 23966)
-
+
- -
- Core started relying on Java6 API, completing Java5 -> Java6 migration.
- (discussion)
-
-
- Adding a batch of contributed localization from the community.
+
-
+ After recent Java security updates, Jenkins would not gracefully recover from a deleted
secrets/master.key
.
+ (issue 25937)
-
+
-
- Disabled, aborted, and not-build status now has different image names to allow
- themes to use different icons.
- (issue 19438)
-
-
- Ask for confirmation if an user tries to leave an edited configuration page.
- (issue 19835)
-
-
- Test failure summary appearance is improved.
- (issue 19884)
-
-
- Added CLI commands that manipulate views
- (issue 19996)
+ Dynamic Single/Multi line Build History layout.
+ (issue 25381,
+ issue 25393,
+ issue 24687,
+ issue 24589)
+
+
+
+
+
-
- Polling-triggered jobs get scheduled en-mass on start-up if slaves aren't online yet.
- (issue 8408)
+ Performance problems on large workspaces associated with validating file include patterns.
+ (issue 25759)
+
+
+
-
- Fixed the handling of nested variable expansion.
- (issue 20280)
+ Always use forward slashes in path separators during in ZIP archives generated by Directory Browser
+ (issue 22514)
+
+
+
-
- NPE thrown from CLI
build
command under some circumstances.
- (pull request 979)
+ Basic Authentication in combination with Session is broken
+ (issue 25144)
-
- Fixed a bug in the compatibility transformer (since 1.527) that causes VerifyError in Ivy plugin and possibly others.
- (issue 19383)
+ Some plugins broken since 1.584 if they expected certain events to be fired under a specific user ID.
+ (issue 25400)
-
- Pass full list of all possible jobs to ViewJobFilter when recurse option is set
- (issue 20143)
+ Fixed various real or potential resource leaks discovered by Coverity Scan
+ (pull request 1434)
-
-
get-job
and update-job
CLI commands can now work with folders, or indeed any AbstractItem
.
- (issue 20236)
+ API changes: Expose AbstractProject.AbstractProjectDescriptor#validateLabelExpression
for plugins.
+ (pull request 1456)
-
- Added API allowing plugins to hide entries from the context menu even while they appear in the sidepanel.
- (issue 19173)
-
+ API method to aggregate multiple FormValidations into one.
+ (pull request 1458)
+ -
+ API method to get non-null
Jenkins
instance with internal validation
+ (issue 23339)
-
+
- -
- Upgrade bundled plugin versions: ssh-slaves to 1.5, and credentials to 1.9.1
- (issue 20071)
-
- Build button column was broken in 1.535 for parameterized builds.
- (issue 20080)
-
-
- Miscalculation of environment variables caused some binaries (such as
ssh
) to not be found.
- (issue 19926)
- -
- Extension point for secure users of REST APIs (permitting JSONP and primitive XPath).
- (issue 16936)
+ JNA error in
WindowsInstallerLink.doDoInstall
.
+ (issue 25358)
-
- “Run a build” link in page shown when no workspace existed for a job was not functional; unlinking.
+ Restore compatibility of label assignment for some plugins.
+ (issue 25372)
+
+
+
-
- Integer overflow could cause JavaScript functions to break in long-running Jenkins processes.
- (issue 20085)
+ Unnecessarily slow startup time with a massive number of jobs.
+ (issue 25473)
+
-
+ Custom workspace option did not work under some conditions.
+ (issue 25221)
+
+
+
+ -
+ Queue didn't always leave a trail for cancelled items properly
+ (issue 25314)
+
-
+ JNA update for deprecated JNA-POSIX library.
+ (issue 24527)
-
- Reverted the JENKINS-18629 fix in 1.536 as it causes various regressions in plugins.
- (issue 20262)
+ Introduced slave-to-master security mechanism to defend a master from slaves.
+ (SECURITY-144)
-
+
+ -
+ Bumping up JNA to 4.10. This is potentially a breaking change for plugins that depend on JNA 3.x
+ (issue 24521)
-
- Fixed two file descriptor leaks.
- (issue 14336)
+ Prevent empty file creation if file parameter is left empty.
+ (issue 3539)
-
- RuntimeException if you try to save a config with a choice parameter that has no choices.
- (issue 18434)
+ Servlet containers may refuse to let us set secure cookie flag.
+ Deal with it gracefully.
+ (issue 25019)
-
- 1.534 made ZIP downloads of artifacts work again, but missing a base directory inside the ZIP.
- (issue 19947)
-
-
- Stapler error saving certain kinds of configuration.
- (issue 18629)
-
-
- Upgrade Trilead SSH client library to version that does not cause connection loss when
- there is a lot of logging on the build slave and the performance improvements in
- ssh-slaves 0.27+ are enabled (
- issue 18836,
- issue 18879,
- issue 19619)
-
-
- Upgrade bundled iplugin versions: ssh-slaves to 1.4, ssh-credentials to 1.5.3 and
- credentials to 1.8.3
- (issue 19945)
-
-
- Executor threads are now created only on demand.
+ Existing
FileParameter
s should be handled as different values to avoid merging of queued builds
+ (issue 19017)
-
+
-
- Windows JDK installer failed in a path with spaces.
- (issue 19447)
+ Build health computed repeatedly for a single Weather column cell.
+ (issue 25074)
+
-
+ Missing workspace page should use 404 status code.
+ (issue 10450)
-
- Windows JDK installer should not install a public JRE.
- (issue 8957)
-
-
- After deleting last build, next build of last build is zombie.
- (issue 19920)
-
-
- Split matrix authorization strategies into an independent plugin.
-
-
- UI Samples plugin fully separated from core. To view samples during plugin development or at any other time, just install from the update center.
+ Fixed memory leak occurring on pages producing incremental output with a progress bar.
+ (issue 25081)
-
- View description should be clearly separated from the Jenkins system message.
- (issue 18633)
+ Updated SSH Slaves plugin to 1.8.
-
- SCM polling sometimes broken since 1.527 due to a change in how environment variables are calculated.
- (issue 19307)
+ Due to the reaction, default umask in debian package is set back to 022
+ (issue 25065)
-
- Breadcrumb bar moves away from header when scrolling past end of page on OS X.
- (issue 19803)
-
-
- "java -jar jenkins.war" now runs on Jetty8. Command line options are still compatible.
- (issue 18366)
-
-
- "java -jar jenkins.war" gets the "--spdy" option to enable SPDY.
+ Greater-than characters are not escaped in HTML outputs like e-mails
+ (issue 16184)
+
-
+ Thread starvation from
OldDataMonitor
.
+ (issue 24763)
+ -
+ Integer overflow in quiet-down timeout calculation
+ (issue 24914)
+
-
+ Don't put session IDs in URLs even when cookies are disabled.
+ (issue 22358)
-
- Expand all/Collapse all functionality for artifact tree view.
- (pull request 616)
+ Show keep build log reason in tool tips
+ (pull request 1422)
+
-
+ Do not disable projects, which do not support such operation (like Matrix configurations)
+ (issue 24340)
-
- Visualize queued jobs in view.
- (pull request 531)
-
-
-
- -
- Default crumb issuer configurations saved in older releases did not load as of Jenkins 1.531.
- (issue 19613)
-
-
- As of 1.532 download of artifact ZIPs was broken.
- (issue 19752)
-
-
- Old copies of
maven3-agent.jar
on slaves were not being reliably updated, leading to errors.
- (issue 19251)
- -
- Add option to disable "Remember me on this computer" checkbox in login screen.
- (issue 15757)
-
-
- Added postCheckout method for SCMs
- (issue 19740)
+ Improved the scalability of SSH slaves plugin caused by global lock in SecureRandom
+ (issue 20108)
+
-
+ Incorporated a fix for "Poodle" (CVE-2014-3566) vulnerability in the HTTPS connector of "java -jar jenkins.war"
+ (issue 25169)
-
+
-
- Offer alternate error message for pattern-based project naming strategy.
- (pull request 914)
+ Diagnostic thread names are now available while requests are still in filters
+
-
+ When killing Windows processes, check its critical flag to avoid BSoD
+ (issue 24453)
+
-
+ When a user could not see a view, but could delete/move/rename jobs contained in it, the view was not properly updated.
+ (issue 22769)
+
-
+ Use POST for cancel quiet down link.
+ (issue 23020,
+ issue 23942)
+
-
+ Do not consider port in use error to be a successful start of Jenkins on Debian.
+ (issue 24966)
-
+
-
- Working around a GZip compression bug in jzlib affecting transfer of certain large, repetitive artifacts.
- (issue 19473)
-
-
- Lazy-loading bug: builds go missing.
- (issue 19418)
-
-
- (re)create build number->id symlink if missing when updating permalink.
- (issue 19034)
-
-
- Display the full display name in title for jobs and views.
- (pull request 884)
-
-
- Added a new extension point to control where archived artifacts get stored.
- (issue 17236)
-
-
- Use fine-grained permissions for node manipulation via REST API & CLI
- (issue 18485)
-
-
- Make the link to the aggregated test result from the project page work.
- (issue 9637)
+ Fixes to multiple security vulnerabilities.
+ (security advisory)
-
+
-
- Deleting an external run did not immediately remove it from build list, leading to errors from log rotation.
- (issue 19377)
+ Channel reader thread can end up consuming 100% CPU.
+ (issue 23471)
-
- When copying a directory from master to slave fails due to an error on the slave, properly report it.
- (issue 9540)
+ CancelledKeyException can cause all JNLP slaves to disconnect (and the problem remains until restart).
+ (issue 24050)
-
- Identify user agent for Internet Explorer 11.
- (issue 19171)
+ Consider dynamic label assignments for label load statistics.
+ (issue 15576)
-
- Since 1.518, fingerprint serialization broke when job or file names contained XML special characters like ampersands.
- (issue 18337)
+ Use Windows line endings for batch file build steps.
+ (issue 7478)
-
- Robustness against truncated fingerprint files.
- (issue 19515)
+ Reduced the logging clutter about the lack of @ExportedBean.
+ (issue 24458)
+
-
+ Character encoding problem in form submission when file parameters are present.
+ (issue 11543)
-
- JavaScript error in the checkUrl computation shouldn't break the job configuration page.
- (issue 19457)
+ Improved error handling and "in-progress" UI feedback in JNLP slave to service installation.
-
- Annotate the Advanced section if some fields are already customized.
- (issue 3107)
+ Winstone 2.4: reverse proxy support in the logging, request header size limit control, and different private key password from keystore password.
+ (issue 23665)
-
- No events fired when project is enable/disable or the description is changed
- (issue 17108)
+ umask setting on Debian did not work.
+ (pull 1397)
+
-
+ handle job move when buildDir is configured to a custom location.
+ (issue 24825)
-
+
+ -
+ Use slightly larger Jenkins head icon.
+ (pull 1360)
+
-
+ Allow setting a system property to disable X-Frame-Options header.
+ (issue 21881)
-
- Send Maven agent JARs to slaves on demand, not unconditionally upon connection.
- (issue 16261)
-
-
- Occasional race condition during startup.
- (issue 18775)
-
-
- Robustness against startup error for users of Global Build Stats plugin.
- (issue 17248)
-
-
- 404s from Javadoc and HTML Publisher plugins.
- (issue 19168)
+ Explicitly set background color of various UI elements to white.
+ (issue 24625)
-
- Build number symlinks and permalinks not updated for Maven module builds.
- (issue 18846)
+ Wrong Hebrew localization resulted in broken console output since 1.539.
+ (issue 24614)
-
+
+ -
+ Health reports saved to disk before 1.576 showed no weather icon since that version.
+ (issue 24407)
+
-
+ Renaming jobs fails if parent dir of custom build records directory does not exist.
+ (issue 19764)
-
- With Apache Maven 3.1 build, logging configuration from the Apache Maven distribution is not used.
-
-
- Avoid log duplication with Apache Maven 3.1 builds
+ Add editable descriptions for label atoms.
+ (issue 6153)
+
+
+
-
- Ungraceful handling of empty matrix project axes.
- (issue 19135)
+
ConcurrentModificationException
in RunListProgressiveRendering
.
+ (issue 21437)
-
- Updated Groovy to 1.8.9 to avoid GROOVY-4292.
-
-
- CLI login command broken on Windows since 1.518.
- (issue 19192)
+
StackOverflowError
for some old SCMListener
s.
+ (issue 23522)
-
- A malformed JUnit result file should mark that test suite as a failure, but not interrupt archiving of other tests.
- (issue 19186)
+ Job status page shows "Build has been executing for null on master" for flyweight tasks.
+ (issue 20307)
+
-
+ File locking issue when running functional tests on Windows.
+ (issue 21977)
+
-
+ Tolerate ?auto_refresh in reverse proxy check on /manage page.
+ (issue 24014)
-
- Build for $username now shows also build scheduled by user
- (issue 16178)
+ Debian package now sets umask to 027 by default for better default privacy. See /etc/default/jenkins to change this.
+ (issue 24514)
-
+
-
- Command line now supports "--sessionTimeout" option for controlling session timeout
+ Added 'no-store' to the 'Cache-Control' header to avoid accidental information leak through local cache backup
+ (issue 24337)
-
- Form validation methods weren't getting triggered when one of its dependency controls change.
- (issue 19124)
+ Deadlock in
OldDataMonitor
.
+ (issue 24358)
-
- When POST is required for some HTTP operation but GET was used, the response should have status code 405.
- (issue 16918)
+ Use absolute links for computer sidepanel items so they don't break as easily.
+ (issue 23963)
+
+
+
+ -
+ Failure to migrate legacy user records in 1.576 properly broke Jenkins, resulted in NullPointerExceptions.
+ (issue 24317)
+
-
+ Jenkins did not correctly display icons contributed by plugins in 1.576.
+ (issue 24316)
+
-
+ Moved JUnit reporting functionality to a plugin.
+ (issue 23263)
+
-
+ Fixed ClassCastException on org.dom4j.DocumentFactory
+ (issue 13709)
+
-
+ Jenkins now logs warnings when it fails to export objects to XML/JSON.
+ This can result in a lot of log output in case of heavy API use.
+ We recommend that API users use the
?tree
parameter instead of ?depth
.
+ (commit)
+ -
+ Allow BuildStep to work with non-AbstractProject
+ (issue 23713)
-
- Correct help text of Label field in automatic installation of tools in global configuration.
- (issue 19091)
+ Improved class loading performance when using Groovy.
+ (issue 24309)
+
-
+ Prevent
NullPointerException
from Executor.run
.
+ (issue 24110)
-
- Use Guice from Google rather than a fork
+ Make the lifetime of queue items cache configurable.
+ (issue 19691)
-
- Jenkins does not invoke ProcessKillers for Windows
- (issue 19156)
+ Support --username/--password authentication for CLIMethod based CLI commands.
+ (issue 23988)
+
-
+ Don't link to /safeRestart after update if Jenkins cannot restart itself.
+ (issue 24032)
+
-
+ Properly consider busy executors when reducing a node's executor count.
+ (issue 24095)
-
+
- -
- Fixed NoSuchFieldError: triggers with older Maven plugin
- (issue 18677)
-
-
- Added bytecode transformation driven compatibility ensurance mechanism
- (discussion)
-
-
- Improve search to locate items inside folders.
- (pull request 848)
- (pull request 893)
-
-
- Windows path separators not correctly escaped in Maven properties configuration.
- (issue 10539)
-
-
- Improved EnvironmentContributor to support project-level insertion.
- (issue 19042)
-
-
-
- -
- HudsonAuthenticationEntryPoint can break CLI support, because the port isn't exposed properly.
- (issue 18634)
-
-
- Report an user friendly error page if a deletion of a build fails.
- (pull request 827)
-
-
- Maven build failure wasn't describing errors like Maven CLI does.
- (issue 15025)
-
-
-
MavenModuleSetBuild.getResult
is expensive.
- (issue 18895)
- -
- Revisited fix to be compatible for plugins.
- (issue 18119)
-
-
- Ensuring
/log/all
shows only INFO
and above messages, even if custom loggers display FINE
or below.
- (issue 18959)
- -
- Added a new monitor that detects and fixse out-of-order builds records.
- (issue 18289)
-
-
- Can't build using maven 3.1.0
- (issue 15935)
-
-
- Fixed Winstone+mod_proxy_ajp+SSL combo issue.
- (issue 5753)
-
-
-
JENKINS_DEBUG_LEVEL
misinterpreted by Winstone, causing excessive logging.
- (issue 18701)
- -
- Since 1.520, Jenkins requires Java 6 or later, breaking Maven builds set to use JDK 5. Now falls back to JVM of slave agent but sets compile/test flags to use defined JDK.
- (issue 18403)
-
-
- Since 1.517, Maven projects using Maven 2 could not build projects using extensions depending on Apache Commons Codec.
- (issue 18178)
-
-
- Test harness was packing copies of Maven into plugin archives under some conditions.
- (issue 18918)
-
-
- Provided maven settings.xml in maven builder is lost.
- (issue 15976)
-
-
- Exception when running polling with a Maven installation not defined on master.
- (issue 18898)
-
-
- Since 1.477 GET on
/view/…/config.xml
included a spurious wrapper element.
- (issue 17302)
- -
- Clearer display of log messages: chronological order, and coloration of repeated vs. fresh metadata (date, log level, log source).
-
-
- Fixed a regression that broke some plugins' form validation
- (issue 18776)
-
-
- People View does Not Populate if JQuery plugin enabled.
- (issue 18641)
-
-
-Same as 1.524; botched release.
-
-
- -
- Clock Difference broken on Manage Nodes page
- (issue 18671)
-
-
- Fixed another possible cause of an NPE from MatrixConfiguration.newBuild.
- (issue 17728)
-
-
- NPE in MavenFingerprinter.getArtifactRepositoryMaven21.
- (issue 18441)
-
-
- More reliability improvement in remote slave reconnection.
-
-
-
- -
- Fixed: claiming of tests doesn't work in Maven jobs (claim-plugin)
- (issue 14585)
-
-
-
- -
- Fixed a regression in the config form with some plugins
- (issue 18585)
-
-
- Fixed a dead lock in the Project class and improved the signature of the persisted XML form a bit.
- (issue 18589)
-
-
- Improved memory efficiency in parsing test reports with large stdio output files.
- (issue 15382)
-
-
- Node monitoring now happens concurrently across all the slaves, so it'll be affected less by problematic slaves.
- (issue 18438)
-
-
- Deadlock during Maven builds Parsing POM step
- (issue 15846)
-
-
- If every node is restricted to tied jobs only, Matrix build jobs can never start.
-
-
-
- -
- Build with parameters returns empty web page
- (issue 18425)
-
-
- Access denied error results in ERR_CONTENT_DECODING_FAILED on most browsers, masking the root cause.
- (issue 15437)
-
-
- Fixed the master/slave handshake problem when a slave runs on non-ASCII compatible encoding (such as EBCDIC.)
-
-
- Added a diagnosis for StreamCorruptedException problem
- (issue 8856)
-
-
- Matrix project's parent can be now tied to labels/slaves.
- (issue 7825)
-
-
- Clean up fingerprint records that correspond to the deleted build recods
- (issue 18417)
-
-
- Fixed "Comparison method violates its general contract" error in BuildTrigger.execute
- (issue 17247)
-
-
- Edited description wasn't reflected when pressing the "Apply" button.
- (issue 18436)
-
-
- Fixed a regression in remoting since 1.519 that caused FindBugs plugins to break.
- (issue 18349,
- issue 18405)
-
-
- Revisited the extension point added in 1.519 that adds custom plexus components.
-
-
-
- -
- Slave launch thread should have the background activity credential.
- (issue 15578)
-
-
- “Build Now” link did not work for multijobs.
- (issue 16974)
-
-
- Unix vs. Windows mode not correctly retained for command launchers under some conditions.
- (issue 18368)
-
-
- Edit views with non-ASCII names did not work since 1.500.
- (issue 18373)
-
-
- Fixed API incompatibility since 1.489.
- (issue 18356)
-
-
- “Projects tied to slave” shows unrelated Maven module jobs.
- (issue 17451)
-
-
- Fixed file descriptor leak in fingerprint computation.
- (issue 18351)
-
-
- Test history was not shown if suite name was part of the test name.
- (issue 15380)
-
-
- Added a new extension point to monitor the flow of stuff in the queue.
-
-
- Added a new extension point to monitor the provisioning of nodes from clouds.
- (pull request 819)
-
-
- Possible to create a custom
AbstractDiskSpaceMonitor
.
- -
- Executors running the builds can be now a subject of access control.
- (issue 18285)
-
-
- Core started relying on Java 1.6 as per the agreement in the dev list.
- If you have a serious objection against it, please let us know
- before we really start relying on 1.6 features.
-
-
- Some actions confirmed by dialog were not working when CSRF crumbs were enabled.
- (issue 17977)
- (issue 18032)
-
-
- CLI list-jobs command should list all nested jobs.
- (pull request 793)
-
-
- Provide a mechanism to differentiate between node properties that are applicable
- to the master node only and node properties that can be applied to all nodes
- (issue 18381)
-
-
- Maven module links in the module list page are broken.
- (issue 17713)
-
-
- 100% CPU pegging in Deflator.deflateBytes
- (issue 14362)
-
-
-
- -
- Log cluttered with irrelevant warnings about build timestamps when running on Windows on Java 6.
- (issue 15587)
-
-
- Fingerprint action deserialization problem fixed.
- (issue 17125)
-
-
- Updating the master computer's configuration from the slave list UI had no immediate effect.
- (issue 17276)
-
-
- Improved the tracking of queued jobs and their eventual builds in the REST API.
-
-
- Configured log recorders can now pick up messages logged from slaves.
- (issue 18274)
-
-
- Added a new extension point to contribute custom plexus components into Maven for the maven project type.
-
-
- Remoting classloader performance improvement upon reconnection to the same slave.
- (issue 15120)
-
-
-
- -
- NPE in
DefaultMatrixExecutionStrategyImpl.waitForCompletion
.
- (issue 18024)
- -
- Optimizations in fingerprint recording.
- (issue 16301)
-
-
- Using JNR-POSIX rather than JNA-POSIX for better platform support.
- (issue 14351)
-
-
- Errors searching build records when builds were misordered.
- (issue 15652)
-
-
- Finding the last failed build for a job (e.g. from a view column) broke lazy loading.
- (issue 16023)
-
-
- Do not fail startup in case
ListView.includeRegex
was syntactically malformed.
- -
- CSS stylesheets misrendered in Chrome due to caching.
- (issue 17684)
-
-
- User icon in People broken if Jenkins root URL unconfigured.
- (issue 18118)
-
-
- Progress bar sometimes broken in People.
- (issue 18119)
-
-
-
- -
- Enable word breaking in potentially long strings like job names.
- (issue 17030)
-
-
- Allow filtering of the Run parameter build list by result.
- (issue 7280)
-
-
- Add support for scalatest-maven-plugin.
- (issue 18086)
-
-
- When copying a folder, the display names of contained jobs were gratuitously cleared.
- (issue 18074)
-
-
- “Recurse in subfolders” option for list views produced exceptions when used with native Maven projects.
- (issue 18025)
-
-
- Using proper directory separator character for permalinks on Windows.
- (issue 17681)
-
-
- Use markup formater to display parameter description.
- (issue 18427)
-
-
-
-
- -
- NPE from
Run.getDynamic
.
- (issue 17935)
- -
- Should be able to collect all log records at a given level using a blank logger name.
- (issue 17983)
-
-
- Reworked Upload Plugin gesture to work more like installation from an update center, and in particular to support dynamic load.
- (issue 16652)
-
-
- Errors in
init.groovy
halted startup; changed to just log a warning.
- (issue 17933)
-
-
-
- -
- Windows services now auto-restart in case of abnormal process termination.
-
-
- <f:dropdownDescriptorSelector> does not allow defaulting to specifig instance
- (issue 17858)
-
-
- mark maven settings / global settings as default for new jobs
- (issue 17723)
-
-
- Display Name is not shown.
- (issue 17715)
-
-
- Symlink handling problem with build permalinks on Windows.
- (issue 17681)
-
-
- List views missing a required field were unloadable.
- (issue 15309)
-
-
- Maven module artifacts were not being deleted by the log rotator.
- (issue 17508)
-
-
- Properly find parent POMs when fingerprinting a Maven project.
- (issue 17775)
-
-
- Allow the combination filter to accept parameter values.
- (issue 7285)
-
-
- Extension point to transform test names (for use with alternative JVM languages).
- (issue 17478)
-
-
-
- -
- Added a new set-build-parameter command that can update a build variable from within a build.
-
-
- Can use
-Dhudson.udp=-1
to disable UDP broadcast without showing an ugly exception.
- -
- Third-party license display for core was broken since 1.506.
- (issue 17724)
-
-
- Mitigation of exception from fingerprinting in a Maven project when a parent POM could not be located.
- (issue 17775)
-
-
- NPE from
MatrixConfiguration.newBuild
.
- (issue 17728)
- -
- NPE configuring Copy Artifact with Maven jobs.
- (issue 17402)
-
-
-
/about
now links to license information for plugins as well.
- -
- Updated bundled plugins.
-
-
-
- -
- Slave status monitor page shows when the data is last obtained
-
-
- Delete button to highlight what it is going to delete.
-
-
-
StringIndexOutOfBoundsException
in PackageResult.findCorrespondingResult
.
- (issue 17721)
- -
- Breadcrumb is reworked to show descendants to provide additional navigational shortcuts.
- (discussion)
-
-
-
hpi:run
did not work for bundled plugins.
- (issue 18352)
- -
- Fixed CSRF vulnerabilities
- (SECURITY-63,SECURITY-69)
-
-
- Fixed an XSS vulnerability via stylesheet
- (SECURITY-67)
-
-
- Fixed an XSS vulnerability to copy arbitrary text into clipboard
- (SECURITY-71/CVE-2013-1808)
-
-
-
- -
- Views can now include jobs located within folders.
- (pull 757)
-
-
- Added confirmation dialog before reloading configuration from disk.
- (issue 15340)
-
-
- Switched confirmation before deleting jobs or wiping out workspace to a dialog.
-
-
- Different text than “Build Now” for parameterized jobs.
- (issue 10738)
-
-
- Check the view name with ajax.
-
-
- “Build Now” context menu item broken for parameterized jobs.
- (issue 17110)
-
-
- Incorrect redirection after delete of job in folder in view.
- (issue 17575)
-
-
- ”My Views" links leads to 404 Not Found.
- (issue 17317)
-
-
- Quoting Issue with JDK Installer with Windows Installer.
- (issue 5408)
-
-
- Restored compatibility in
ArtifactArchiver
signature; broken in 1.509 and could affect plugins.
- (issue 17637)
- -
- Fixed a bug in the logic that hides context menu anchor 'v'
- (issue 13995)
-
-
-
- -
- JUnit result archiver should only fail builds if there are really no results - i.e. also no skipped tests.
- (issue 7970)
-
-
-
NullPointerException
related to lazy loading when loading some builds using fingerprinting.
- (issue 16845)
- -
- Better display of parameters in queue items.
- (issue 17454)
-
-
- sort order of plugin list is not working by default.
- (issue 17039)
-
-
-
- -
- UnsatisfiedLinkError on CreateSymbolicLinkw on Windows XP.
- (issue 17343)
-
-
- Flyweight tasks should execute on the master if there's no static
- executors available.
- (issue 7291)
-
-
- Download tool installations directly from the slave when possible, since this is much faster than going through the master.
- (issue 17330)
-
-
- Improved UI for implicitly locked builds.
- (issue 10197)
-
-
- Incorrect URL computation broke context menu for computers with spaces in their names.
- (issue 18236)
-
-
- Promote the use of 'H' in cron.
- (issue 17311)
-
-
- Context menu no longer automatically pops up
- (issue 13995)
-
-
-
- -
- Heavy thread congestion saving fingerprints.
- (issue 13154)
-
-
- Option to make the build not fail if there is nothing to archive.
- (issue 10502)
-
-
- Better report file deletion failures.
- (issue 17271)
-
-
- "Local to the workspace" repository locator does not work when building one module in isolation.
- (issue 17331)
-
-
- Master node mode not correctly displayed in
/computer/(master)/configure
.
- (issue 17263)
- -
- Performance improvement in master/slave communication throughput
- (issue 7813)
-
-
- Quoted label expression can result into dead executors (throwing exception)
- (issue 17128)
-
-
- ChangeLog should produce some output even if some (plugin) annotator fails
- (issue 17084)
-
-
- View name should not allow "..".
- (issue 16608)
-
-
-
- -
- Fixing a regression in 1.507 that causes a failure to load matrix jobs.
- (issue 17337)
-
-
-
- -
- Show the reason for a skipped test if the test result contains one
- (issue 8713)
-
- -
- an in-progress build was dropped from JSON API when lazy-loading was introduced.
- (issue 15583)
-
-
- In-progress builds now survive the "reload from disk" administrator action.
- (issue 3265)
-
-
- If artifact archiving failed with an I/O error, the build nonetheless was considered to be a success.
- (issue 2058)
-
-
- Fixed a bad interaction between Windows symlinks and build record lazy loading.
- (issue 15587)
-
-
- Remember the lastStable/Failed/Successful/etc builds to avoid eager loading builds.
- (issue 16089)
-
-
- Wrong build result in post build steps after failed pre build step in maven projects.
- (issue 17177)
-
-
-
- -
- Saving Global Jenkins Global Config wipes out the crumb issuer settings in the Global Security Config.
- (issue 17087)
-
-
- Made
--httpKeepAliveTimeout
option work (that was supposed to have been introduced in 1.503).
- (issue 16474)
- -
- Preview function for textareas using Jenkins markup did not work when CSRF protection was enabled.
- (issue 17085)
-
-
- Permalinks created in the wrong place when using external build directories.
- (issue 17137)
-
-
- External build directories not updated by job rename/delete.
- (issue 17138)
-
-
- JNA-related error from Windows slave monitoring thrown repeatedly.
- (issue 15796)
-
-
- New JSON library corrects problems such as form values starting with
[
.
- (issue 14827)
- -
- Improved the request handling performance (where the file lookup is expensive, such as on NFS).
- (issue 16606)
-
-
- Windows symbolic support on Java5/6.
-
-
- Improved the duration browsers cache static resources.
-
-
-
- -
- Exception in flyweight tasks when checking if an executor is interrupted.
- (issue 17025)
-
-
- JNA-related linkage errors on Windows not handled gracefully.
- (issue 15466)
-
-
- Builds disappear from build history after completion (revisited).
- (issue 15156)
-
-
- Added run display name as an environment variable when RunParameter is used
- (pull 720)
-
-
- Fixed "Manage" sub-contextmenu for non-standalone deployments
- (pull 721)
-
-
- Absolute URLs in console output
- (issue 16368)
-
-
- Revert ampersand encoding which can cause backward incompatibility issue
- (pull 683)
-
-
- Fix dependency graph computation when upstream build trigger is involved
- (issue 13502)
-
-
- Disabled Authenticode verification for Windows services.
- (issue 15596)
-
-
-
- -
- Fixed a regression in the "discard old builds" in 1.503.
- (issue 16979)
-
-
- Maven 3.0.5 upgrade.
- (issue 16965)
-
-
- Not all log messages were being captured at
/log/all
.
- (issue 16952)
- -
- Incorrect or missing XML encoding declaration on some REST API pages.
- (issue 16881)
-
-
- Fixed: Human readable file size method returns ",00" for files with byte length 0
- (issue 16630)
-
-
- “Build” from job context menu produced a confusing warning page.
- (issue 16844)
-
-
- Maven2 builds with non-standard test plugins failed.
- (issue 16928)
-
-
- Started bundling XStream 1.4.4
- (issue 12542)
-
-
- Significant improvement in Traditional Chinese localizations.
- (pull 716)
-
-
-
- -
- ${ITEM_FULLNAME} variable was not working for Maven projects on Windows,
- so introduced ${ITEM_FULL_NAME} instead.
- (issue 12251)
-
-
- Lock contention issue in build history view.
- (issue 16831)
-
-
- Fixed the HTTP request thread saturation problem with Winstone.
- (issue 16474)
-
-
- Script evaluation script error on IE.
- (issue 16561)
-
-
- surefire-reports not detected for android-maven-plugin
- (issue 16776)
-
-
- maven-failsafe-plugin tests not recognized anymore
- (issue 16696)
-
-
- UI waiting on a queue lock to display cause of queue blockage.
- (issue 16833)
-
-
- UpdateCenter REST API chokes if there was a plugin installation failure.
- (issue 16836)
-
-
- Missing build title in /rssAll when build has no test result.
- (issue 16770)
-
-
- Changed the way matrix axis values are exposed as env variables
- (issue 11577)
-
-
- Maven 3 builds ignored quiet (-q) and debug (-X) options
- (issue 16843)
-
-
- JNLP slave installers can now work transparently with secured Jenkins.
- (SECURITY-54 / despite the ticket marker, this is not a security vulnerability)
-
-
- "Discard old build records" behavior is now pluggable, allowing plugins to define custom logic.
-
-
-
- -
- Miscellaneous security vulnerability fixes. See the advisory for more details.
- (SECURITY-13,16,46,47,54,55,59,60,61)
-
-
- Builds disappear from build history after completion.
- (issue 15156)
-
-
- Plugin Manager’s Filter field did not work. Regression in 1.500.
- (issue 16651)
-
-
- DISCOVER-able jobs break the build queue widget
- (issue 16682)
-
-
- Extension point to provide access to workspace even when node is offline
- (issue 16454)
-
-
- Extension point to listen BuildStep execution
-
-
-
- -
- Reverted change in 1.500 causing serious regression in HTTPS reverse proxy setups.
- (issue 16368)
-
-
- Getting test results from custom test mojos failed build.
- (issue 16573)
-
-
- Restored Java 5 compatibility.
- (issue 16554)
-
-
- Bogus “Build Record Root Directory” inadequately diagnosed.
- (issue 16457)
-
-
- Plugin icons in the sidebar were not being properly cached.
- (issue 16530)
-
-
- Broadly as well as deeply nested build causes overwhelmed the UI after 1.482.
- (issue 15747)
-
-
- API typo
DependecyDeclarer
corrected.
- -
- Avoid eagerly loading builds in Changes in dependency or culprit list.
- (pull 689)
-
-
- Run parameters do not support folders.
- (issue 16462)
-
-
- Fixed RememberMe cookie signature generation.
- (issue 16278)
-
-
- Fixed NullPointerException when copying from existing Maven job
- (issue 16499)
-
-
-
-
- -
- Since 1.494, when signing up as a new user in the private security realm the email address was left unconfigured and a stack trace printed.
-
-
- Enable transparent log decompression support.
- (issue 13655)
-
-
- Display authorities at
/user/*
for convenience.
- (pull 577)
- -
- Slow rendering of view pages in large installations due to eager check whether the “People” link would show anything.
- (issue 16244)
-
-
- Reduced size of memory leak in render-on-demand functionality used e.g. in configuration pages.
- (issue 16341)
-
-
- Improving responsiveness of People page.
- (issue 16342)
- (issue 16397)
-
-
- Exception printed to log while adding Build other projects post-build step.
- (issue 16444)
-
-
-
BindException
when using --daemon
with JMX.
- (issue 14529)
- -
- Improved logging and error output from SSHD in Jenkins.
-
-
- Linking to the
/threadDump
page from /systemInfo
so it is discoverable.
- -
- Rekeying operation (from SECURITY-49 fix in 1.498) failed on Windows.
- (issue 16319)
-
-
- JNLP slave index page failed to explain how to pass
-jnlpCredentials
.
- (issue 16273)
- -
- Links should preserve used protocol
- (issue 16368)
-
-
- Don't report the same plugin twice in the update center if the filtering is in effect.
-
-
- Accept any plugin with a 'test' goal as a test plugin in Maven jobs
- (issue 8334)
-
-
- Avoid unnecessary downloads if automatically installed tools are up-to-date
- (issue 16215)
-
-
-
- -
- Fixed NoClassDefFoundError: Base64 with the -jnlpCredentials option.
- (issue 9679)
-
-
-
- -
- The master key that was protecting all the sensitive data in $JENKINS_HOME was vulnerable.
- (SECURITY-49)
-
-
-
- -
- Delete the oldest build but it still come up on HistoryWidget
- (issue 16194)
-
-
-
- -
- Aborting download of workspace files make Jenkins unstable
- (issue 7114)
-
-
- Unstable main build of maven projects leads to post steps being executed even if configured not to
- (issue 14102)
-
-
- Channel is already closed exception during threadDump
- (issue 16193)
-
-
-
- -
- Fixed java.lang.NoSuchMethodError: hudson.model.RunMap.put(Lhudson/model/Run;)Lhudson/model/Run;
- (issue 15487)
-
-
- Saving the update center list after the metadata has been fetched results in
- the metadata being persisted twice
- (issue 15889)
-
-
- When using container-managed security, display unprotected root actions in the configuration screen for convenience.
-
-
- Display class loading statistics in
/computer/name/systemInfo
.
- -
- Added list-plugins CLI command.
-
-
- Added console CLI command that dumps console output from a build.
-
-
-
- -
- Using file parameters could cause build records to not load.
- (issue 13536)
-
-
- Possible race condition in RemoteClassLoader renders slave unusable.
- (issue 6604)
-
-
- If the CLI client is aborted during "build -s", abort the build.
-
-
- WARNING: Caught exception evaluating: descriptor.getHelpFile(attrs.field). Reason: java.lang.NullPointerException.
- (issue 15940)
-
-
- Allows to disable triggering of downstream jobs (for a maven job)
- (issue 1295)
-
-
- E-mail delivery feature was split off to a separate plugin for better modularity.
- (pull 629)
-
-
- Context menu and tooltip of the queue items were colliding with each other
-
-
- Fix combobox ui component
- (issue 16069)
-
-
- Separated global security configuration into its own view.
- (pull 628)
-
-
-
- -
- Slave's Name should be trimmed of spaces at the beginning and end of the Name on Save.
- (issue 15836)
-
-
- Added new switch to ignore post-commit hooks in SCM polling triggers.
- This requires that the SCM plugin supports this feature, too!
- (issue 6846)
-
-
-
-
- -
- XStream form of projects excessively strict about null fields.
- (issue 15817)
-
-
- Build records were broken if timezone was changed while running.
- (issue 15816)
-
-
- Symlink detection refinement on Java 7.
- (issue 13202)
-
-
- Displaying massive test suite results could bring down Jenkins.
- (issue 15818)
-
-
- Jenkins kicks off the wrong downstream builds for Maven.
- (issue 15367)
-
-
- Rotation of slave agent launch logs is broken for Windows masters.
- (issue 15408)
-
-
- Failure to initialize the SSH daemon shouldn't fail the boot.
-
-
- Added new GUI-based slave installer for upstart
-
-
- Duplicated / multiple "Jenkins CLI" entries under "Manage Jenkins".
- (issue 15732)
-
-
- Maven2 job fails when using maven-failsafe-plugin
- (issue 15865)
-
-
- "Disable Project" button breaks Free style project pages.
- (issue 15887)
-
-
-
- -
- HistoryWidget/entry.jelly throws NullPointerException
- (issue 15499)
-
-
-
ArrayIndexOutOfBoundsException
or StringIndexOutOfBoundsException
launching processes such as Mercurial polling. (Regression in 1.489.)
- (issue 15733)
- -
- Fixed an XSS and a few open-redirect problems
-
-
- Support failsafe the same way as surefire in maven2 jobs
-
-
- Support
settings.xml
provider for freestyle maven buildstep too
- -
- Invert dependency of maven-plugin and config-file-provider plugin (if config-file-provider is installed, this change requires an update of the config-file-provider to >= 2.3)
- (issue 14914)
-
-
-
- -
- Fixed the redirect handling in IPv6 literal address.
- (issue 14452)
-
-
- Update logging levels in LogRotator - hudson.tasks.LogRotator perform
- (issue 15540)
-
-
- Jobs in folders not displayed when showing tied jobs for a computer or label.
- (issue 15666)
-
-
- When installing plugins with overlapping dependencies, Jenkins downloads the duplicate plugins multiple times.
- (issue 10569)
-
-
- Disable Nagle's algorithm for TCP/IP slave connection
-
-
-
- -
- JENKINS_HOME can be now on UNC path (like \\server\mount\dir)
- (issue 9615)
-
-
- Deleting deeply nested directories could fail on Windows in Java 6.
- (issue 15418)
-
-
- Improved the auto-completion of job names to support hierarchy better.
-
-
-
- -
- Harmless but noisy exception running builds on some Windows systems in non-English locale.
- (issue 15316)
-
-
-
- -
- JNLP Slave agent on OS X can install itself as a launchd service.
-
-
- Using the bottom-sticking "OK" button in more places
-
-
- Slave logs are put into sub-directories to avoid cluttering $JENKINS_HOME
-
-
-
/computer/*/doDelete
should try harder to remove even “zombie” Computer
s.
- (issue 15369)
- -
- NPE from
PluginManager
.
- (issue 15511)
- -
-
Uncaught TypeError: Cannot read property 'firstChild' of null
breaks certain forms at least on Chrome.
- (issue 15494)
- -
- Added "manage old data" permanently to the "manage Jenkins" page.
-
-
- Plugin manager now supports uninstallation.
- (issue 3070)
-
-
-
- -
- NullPointerException in various parts of the core due to RunList returning null.
- (issue 15465)
-
-
- Jenkins build records lazy-loading failed to load some of my jobs.
- (issue 15439)
-
-
- Build queue displayed as empty even when it is not. (Regression in 1.483.)
- (issue 15335)
-
-
- Restoring
/people
page as a redirect for compatibility, and fixing links to it.
- (issue 15206 continued)
- -
- Memory exhaustion parsing large test stdio from Surefire.
- (issue 15382)
-
-
-
- -
- NPE deleting a slave.
- (issue 15369)
-
-
- Deadlock involving views.
- (issue 15368)
-
-
- Can't configure Maven Installations on Jenkins ver. 1.483, 1.484
- (issue 15293)
-
-
- Memory footprint improvement, especially under large HTTP request threads.
- (issue 15493)
-
-
- Build records are now lazy loaded, resulting in a reduced startup time
- (issue 8754)
-
-
-
- -
- Check view permissions before showing config page
- (issue 15277)
-
-
- Displaying
/people
can consume huge resources.
- (issue 15206)
- -
- Log recorders do not work reliably.
- (issue 15226)
-
-
- NPE in
MatrixProject.onLoad
.
- (issue 15271)
- -
-
FilePath.validateAntFileMask
too slow for /configure
.
- (issue 7214)
- -
- Mac OS X installer now sends log to /var/log/jenkins/jenkins.log
- (issue 15178)
-
-
-
- -
- Invalid warning message when the config-file-provider plugin is not installed
- (issue 15207)
-
-
- JDK installation failed on some slaves with
InvalidClassException: hudson.tools.JDKInstaller$Platform$1; local class incompatible: …
- (issue 14667)
- -
- Provide symlink support on all possible platforms when using Java 7+, including newer versions of Windows.
- (issue 13202)
-
-
- NPE at hudson.maven.MavenModuleSet.getMaven
- (issue 14510)
-
-
- Invalid JSON gets produced with duplicate keys (seen on change sets)
- (issue 13336)
-
-
- Command line options to control the HTTP request handling thread behavior weren't working.
-
-
- Default max # of concurrent HTTP request handling threads were brought down to a sane number (from 1000(!) to 20)
-
-
- Display non-default update site URLs in the Advanced tab of Plugin Manager. (Currently not configurable from this UI.)
-
-
- Fixed the lock contention problem on Queue.getItems()
- (issue 16468)
-
-
- Put slave back online automatically, if there's enough disk space again
- (pull 514)
-
-
- Track and verify plugins used in configuration XML
- (issue 15003)
-
-
-
- -
- Job created by posting
config.xml
to /createItem
does not set GitHub webhook.
- (issue 14759)
- -
- “Took…on master” shown for a build which ran on a slave which was since deleted.
- (issue 15042)
-
-
- Report root causes of UpstreamCause in log and status pages.
-
-
-
- -
- Matrix jobs are kept forever even if it's not needed
- (issue 14991)
-
-
- 'groovysh' command should be able to see all the plugin classes.
- (issue 14982)
-
-
- Handle version ranges in automatic maven module dependency wiring.
- (issue 12735)
-
-
- Detect bugs relating to short
Descriptor
names early.
- (issue 14995 continued)
- -
- Allow the user to type in the reason why a node is offline
- (pull 535)
-
-
- Parameters defined in matrix projects are now available in configuration builds.
- (pull 543)
-
-
-
- -
- Refactored
behavior.js
to run more predictably.
- Plugin JavaScript should use Behaviour.specify
in place of
- Behaviour.register
, Behaviour.list
,
- hudsonRules
, and jenkinsRules
.
- (issue 14495 cont'd)
- -
- Fixed a possible race condition in the remoting layer.
- (issue 14909)
-
-
-
TarArchiver.visitSymlink
can throw undeclared PosixException
.
- (issue 14922)
- -
- Parameterized Trigger plugin can break form validation for regular “Build after other projects are built” trigger.
- (issue 14995)
-
-
-
hpi:run
failed due to IllegalAccessError
s.
- (issue 14983)
-
-
-
- -
- "Ping-pong" builds store excessively large
CauseAction
.
- (issue 14814)
- -
- Avoid a 404 when navigating to upstream builds.
- (issue 14816)
-
-
- Avoid a 404 when canceling queue items.
- (issue 14813)
-
-
- Added missing parameters as defaults when called from CLI
- (issue 7162)
-
-
- NPE from
UpdateSite$Plugin.getNeededDependencies
.
- (issue 14769)
- -
- Description preview and syntax highlighting broken since 1.477.
-
-
- Parameter values disappear if user is not logged in
- (issue 7894)
-
-
-
- -
- "Monitor External Job" broken since 1.468.
- (issue 14107)
-
-
- Matrix configuration axes are no longer automatically re-ordered to alphanumeric order on reload.
- (issue 14696)
-
-
-
- -
- Annotation processor bugs in Stapler affecting plugin compilation.
- (issue 11739)
-
-
- Regressions in add/delete buttons starting in 1.474.
- (issue 14434 and issue 14495)
-
-
- Collapse nonempty tool installation sections by default in
/configure
.
- (issue 14538)
- -
- Custom workspace in matrix projects should be able to use axis as variables.
-
-
- New SCMCheckoutStrategy extension wasn't workin for matrix projects.
- (pull 519)
-
-
- Fixed a problem in the concurrent matrix build.
- (issue 13972)
-
-
- Single invalid e-mail address shouldn't cause the entire e-mail delivery to fail.
- (pull 526)
-
-
- Dynamically recomputing matrix axes wasn't working.
- (pull 523)
-
-
- "Text" build parameter should use <textarea> for configuration
- (issue 13916)
-
-
- Make the draggable component more obvious by providing a border.
-
-
- Added REST API for view manipulation
-
-
- OS X installer now has an Uninstall tool (in /Library/Application Support/Jenkins).
-
-
- Added "manage Jenkins" as a sub-menu to the Jenkins context menu.
-
-
- Executor is exposed to the remote API
- (pull 520)
-
-
- Changed defaults for the Mac installer to make iOS codesigning easier.
- (pull 527)
-
-
- Notify user when search result is truncated and provide link to get more results
- (issue 10747)
-
-
- Add a setter for node label string.
- (issue 14327)
-
-
- Option to set java executable path for managed windows slaves
-
-
- Added new extension point for transient user actions, and displays user properties if they are also Actions.
-
-
-
- -
-
NullPointerException
from JUnitParser.parse
.
- (issue 14507)
-
-
-
- -
- Enable/disable GUI for jobs either did not appear, or threw exceptions, for jobs inside folders
- (issue 14325)
-
-
-
NullPointerException
from UnlabeldLoadStatistics
[sic]
- (issue 14330)
- -
- Incorrect display of list items in project changes for SCMs such as Mercurial.
- (issue 14365)
-
-
-
- -
- Fix French translation
- (issue 13274)
-
-
- Avoid doing AJAX updates if the page becomes invisible.
- (pull 506)
-
-
- Added a new extension point to listen to polling activities.
- (issue 14178)
-
-
-
- -
- Updating job config.xml shouldn't clobber in-progress builds.
- (issue 12318)
-
-
- Search index includes all top-level jobs, not just jobs in the current view.
- (issue 13148)
-
-
- Updated typo in Serbian translation.
- (issue 13695)
-
-
-
- -
- Fixed a synchronization problem between master/slave data communication.
- (issue 11251)
-
-
- Added a mechanism to filter extension points as they are discovered.
-
-
- Exposed the master's own node properties to be configured in /computer/(master)/configure
- (whereas /configure controls global node properties that apply to all nodes.)
-
-
- Made the list of environment variables in the help page pluggable
- (pull 434)
-
-
- Added a new hook to enable matrix project axes to change its values per build.
- (pull 449)
-
-
-
- -
- JSON MIME type should be "application/json"
- (STAPLER-17)
- (issue 13541)
-
-
- Fixed: XML API Logs Too Much Information When Invalid Char is Present
- (issue 13378)
-
-
- Improved the way we store hashed passwords.
- (motivation)
-
-
- Reduce the total height of items shown in the view configuration page.
- (pull 488)
-
-
- The CLI build command now has the -v option that reports the console output of the build in progress.
-
-
- The CLI build command can now wait until the start of the build.
-
-
-
- -
- Problem in syncing mirrors with native packages. Re-releasing the same bits as 1.469 as 1.470.
-
-
-
- -
- Fixed a regression in 1.468 that broke LDAP
-
-
-
- -
- Added more MIME type mapping for Winstone.
- (issue 13496)
-
-
- Winstone wasn't handling downloads bigger than 2GB.
- (issue 12854)
-
-
- With 'on-demand' retention strategy, wrong slave can be started for jobs restricted to specific slave.
- (issue 13735)
-
-
- Fixed encoding handling in e-mail headers.
- (pull 486)
-
-
- Added a new extension point for custom checkout behaviour, especially targeted for matrix projects.
- (pull 482)
-
-
- REST API now supports pretty printing of JSON and other formats.
-
-
- Allow the tree parameter and the xpath parameter to be used together in the REST API.
-
-
- Improved the background transparency of the animating ball icon
-
-
-
- -
- When accessing a page that requires authentication, redirection to start authentication results in a content decoding failure.
- (issue 13625)
-
-
- Fixed a bug in the way cloud support handles free-roaming jobs.
- (discussion)
-
-
- Fixed a regression in untar operation in exotic platforms
- (issue 13202)
-
-
- Fixed a possible race condition
-
-
- Fixed nested view not showing up with just read perm for View
- (issue 13429)
-
-
- Allow file parameters to be viewed as plain text.
- (issue 13640)
-
-
- CLI connection to the master is now encrypted.
-
-
- Improve the low disk space warning message.
- (issue 13826)
-
-
- Matrix custom workspace support is improved to allow configuration builds to share workspace
-
-
- Added more context menus to hyperlinks in the console output
-
-
- Exposed plugin manager and update center to the REST API
-
-
- Added a new extension point for agent protocols.
-
-
- Enabled concurrent build support for matrix projects
- (issue 6747)
-
-
- Maven plugin: expand variables in "Room POM" field
- (issue 13822)
-
-
-
- -
- Exposed plugin manager and update center to the REST API
-
-
- Enabled concurrent build support for matrix projects
-
-
-
- -
- Artifact archiving from an ssh slave fails if symlinks are present
- (issue 13202)
-
-
-
- -
- Don't try to set cookies on cachable requests.
- (issue 12585)
-
-
- Fixed a regression in 1.462 that introduced Java6 dependency.
- (issue 13659)
-
-
- Fixed JDK auto-installer
-
-
- missing search image on plugin manager.
-
-
-
- -
- Fixed a bug in the Content-Range header handling.
- (issue 13125)
-
-
- Ant's default exclusion was preventing plugins from archiving some files.
- (issue 13165)
-
-
- Fixed NPE in PAM authentication if the user is in a group that doesn't exist anymore.
-
-
- End up more gracefully if there's some problem when searching for user partipication in the build
- (issue 13564)
-
-
- Improved the performance of the fingerprint persistence.
- (issue 13154)
-
-
- PAM authentication supports '@group' to force interpretation as a group instead of user.
- (issue 13526)
-
-
- Honor the Accept header in the job/name/build URL.
- (issue 13546)
-
-
- Added a DISCOVER permission to allow anonymous users to be presented the login screen
- when accessing job URLs.
- (issue 8214)
-
-
- Publishers can be now reordered by the user.
- (discussion)
-
-
-
- -
- API token authentication was broken in 1.461
- (issue 13600)
-
-
- Added the filter textbox to the update center selector.
- (issue 13476)
-
-
- Move "View as plain text" link on console output page from top right to the sidepanel.
- (issue 13389)
-
-
- Convert "Delete this build" buttons into links in the sidepanel.
- (issue 13387)
-
-
- Validate project naming regex immediately.
- (issue 13524)
-
-
-
- -
- Flag -U is not used during the parsing step of a Maven Job
- (issue 8663)
-
-
- Custom workspace validation not working.
- (issue 13404)
-
-
- allow j/k navigation for search results
- (issue 13105)
-
-
-
- -
- Fixed: tests with the same name are no longer counted correctly.
- (issue 13214)
-
-
- Added a tag to copy text into clipboard for plugins
-
-
- Removed ASM dependency to avoid class incompatibility trobules.
-
-
- Supported hash token in the crontab syntax to distribute workload and avoid spikes.
-
-
-
- -
- CLI - I/O error in channel Chunked connection/Unexpected termination of the channel - still occuring in Jenkins 1.449.
- (issue 12037)
-
-
- Quiet period is blocking other jobs in queue.
- (issue 12994)
-
-
- Loading All Build History Fails.
- (issue 13238)
-
-
- Added the View.READ permission to control visibility of views, and updated the default implementation to hide empty views.
- (issue 3681)
-
-
- Added new extension point for transient build actions.
- (pull 421)
-
-
-
- -
- Build Status page continues to show flashing "building" icons after build completion.
- (issue 13217)
-
-
- New Breadcrumb bar covers search suggestions
- (issue 13195)
-
-
- Fixed a log rotation portability problem on RedHat RPM package.
- (issue 5784)
-
-
- Computer.getHostName() returns null when it is not.
- (issue 13185)
-
-
- Fixed a socket file descriptor leak.
-
-
- Run $JENKINS_HOME/init.groovy.d/*.groovy as the init script if present
- (feature)
-
-
- Improved the page loading performance, especially on large latency network
-
-
- Resolve dependency issue between 'maven-plugin' and 'config-file-provider' plugin. If you are using the 'config-file-provider' plugin, you have to upgrade to version 1.9.1!
-
-
-
- -
- Fixed a thread leak in the embedded servlet container.
- (issue 9882)
-
-
- Fixed a file handle leak in serving static content
- (issue 13097)
-
-
- Breadcrumb popup menu gives javascript error on Internet Explorer 8.
- (issue 13082)
-
-
- Ajax on Update Center does not work in prototype 1.7
-
-
- 'View as plain text' in Console Output is hidden by the new breadcrums bar
-
-
- Last modification date of files in a zip are not the original timestamps
- (issue 13122)
-
-
- "Reload Configuration from Disk" loses labels for swarm-clients
- (issue 8043)
-
-
- Jenkins uses correct port in mDNS advertisement and shows up in Safari Bonjour bookmarks.
-
-
-
- -
- After renaming a job, the redirect goes to a wrong view.
- (pull 401)
-
-
- BUILD_TAG wasn't unique for hierarchical project.
- (pull 402)
-
-
- Workspace archiving wasn't handling symlinks correctly.
- (issue 9118)
-
-
- Fixed a bug in the auto-overwrite of bundled plugins on Windows.
- (issue 12514)
-
-
- Fixed a temporary memory spike when dealing with rapidly growing large console output and interactive monitoring.
-
-
- Fixed a file handle leak while serving static files.
- (issue 12674)
-
-
- Fixed a bug in executor/queue filtering for matrix projects.
- (pull 394)
-
-
- Some of the context menu items have wrong links
- (issue 12945)
-
-
- Removed entries that don't make sense from the context menu
-
-
- Enable automatic hyperlinking on failed test summary.
- (pull 392)
-
-
- Performance improvement in JavaScript on modern browsers
- (pull 276)
-
-
- Matrix project execution order is made pluggable.
- (issue 12778)
-
-
-
- -
- Fixed a regression in 1.453 with IE9
- (pull 397)
-
-
- Fixed NPE in Groovy script execution via CLI (issue 12302)
-
-
- Fixed bug where a queued build could start while the previous build was still in its post production state.
-
-
- Improved the error retry logic of update center retrieval.
-
-
- Update JavaMail to 1.4.4.
- (issue 1152, issue 3983)
-
-
- Integrated prototype.js 1.7
- (discussion)
-
-
- Supported programmatic retrieval/update of slave config.xml
-
-
- Breadcrumb now supports drop-down menu for faster navigation
- (discussion)
-
-
- Configuration pages show a navigation drop-down menu in the breadcrumb bar to jump to sections
-
-
- Hyperlinks to model objects also supports drop-down menu for faster navigation.
- (discussion)
-
-
- New ExtensionPoint to enforce naming conventions for projects/jobs and two implementations: Default (no restriction), Pattern (regex).
- (issue 12928)
-
-
- java -jar jenkins.war now uses the HTTP only session cookie that's more robust against XSS vulnerability.
-
-
-
- -
- Adjusted the HTML sanitization rules as they were too restrictive.
-
-
-
- -
- Fixed a XSS vulnerability.
- (SECURITY-26)
-
-
- Fixed a directory traversal vulnerability.
- (SECURITY-23)
-
-
- Fixed a file descriptor leak on Windows
- (issue 9882)
-
-
- 'Age' column on 'Test Result' tab may show incorrect value when a test suite is divided into multiple junit files.
- (issue 12457)
-
-
- System Message - Doesnt appear on any view other than the default view.
- (issue 7733)
-
-
- Added UI component to show notification bar at the top of the page
-
-
- Users can configure search to be case insensitive.
- (issue 850)
-
-
- Inline help now reports the plugin that contributes the said feature.
-
-
- Various configuration pages are getting the "apply" button.
-
-
- Avoid post-build depoy to Maven repository in release build
- (issue 12397)
-
-
- Jenkins no longer failes to start if plugins have cyclic dependencies, but deactivates these plugins.
-
-
- Adding the video/webm mime type for files with extension .webm.
-
-
- update to guava 11.0.1
-
-
-
- -
- Infinite loop or invalid next execution with crontab DoW=7
- (issue 12357)
-
-
- Broken links to test results with '#' or '?' in the name
- (issue 10458)
-
-
- Fix launching browser too early to http://localhost:8080 in OS X
- installer.
- (issue 12622)
-
-
- Bundled slf4j binding to avoid classloader contraint violation in JBoss
- (issue 12334,
- issue 12446,
- issue 12650)
-
-
- Fixed a UI problem with the "save" button that sticks to the bottom.
-
-
- Misc performance improvements
- (pull 342)
-
-
-
- -
- The -c option in the build command wasn't working for some SCM.
-
-
- Fix multi submit with shortcut key in script console.
- (pull 364)
-
-
- job rows in view should have id= for easy access
- (issue 12518)
-
-
- M2 job: create links to codehaus maven plugins and their goals
- (issue 12529)
-
-
- Matrix job now allows delete whole matrix, including sub-jobs.
-
-
- Fixed a bug in LDAP default root DN inference.
- (issue 8152)
-
-
- ComputerListener.onOffline was not called when the client was terminated abruptly.
- (issue 12680)
-
-
- CLI now supports also encrypted key file
-
-
- Recognize test results from eviware:maven-soapui-plugin.
- (issue 11353)
-
-
-
- -
- install-plugin CLI command fails to put a file in the right location when installing from URL.
-
-
- Fixed a bug where long post-production processing in matrix jobs can cause incorrect abortion.
-
-
- month should not be 0.
- (issue 12356)
-
-
- "Create a new slave" page didn't auto-complete for copying.
- (issue 12490)
-
-
- Fixed a bug in the auto-overwrite of bundled plugins.
-
-
- Upgrade to maven artifacts 3.0.4
-
-
- Running build via CLI now records actual user who started the build
-
-
-
- -
- Build fails on "Deploy artifacts to Maven repository" due to trying to upload parent POM twice for release artifacts.
- (issue 11248)
-
-
- Fixed an occasional "URI must start with a slash" error when the anonymous user doesn't have the read access.
-
-
- OS X installer can optionally create a new user "jenkins" and use
- it. This user has a writable home directory, making it possible to set up ssh for Jenkins.
-
-
- No workspace available message includes wiped out workspace as a potential cause.
- (issue 10432)
-
-
- Stop users being created in memory if they failed to provide all the required registration information correctly.
- (issue 7096)
-
-
- java -jar jenkins.war finally detects invalid command line options and report that as an error.
-
-
- When run in terminal, warning/error messages are colored.
-
-
-
- -
- Location of the temporary file "Maven Global Settings" incompatible with release:prepare
- (issue 12315)
-
-
- Failure to check the username/groupname in the matrix security shouldn't hide the user name
- (issue 9519)
-
-
- Fixed a hash DoS vulnerability.
- (SECURITY-22)
-
-
- Fixed "Deploy artifacts to Maven repository" as a promotion action.
- Requires promoted-builds plugin 2.5+.
- (issue 11766)
-
-
- Fixed a bug in the symlink creation code on BSD platforms.
- issue 12119
-
-
- Default e-mail suffix should be used to complete the domain name portion of the recipients list.
- (pull #324)
-
-
- Closure execution after CLI.upgrade() should carry over the transport credential.
- issue 10890
-
-
- Incorrect path delimiter used in ZipArchiver when creating archive on Windows.
- issue 9942
-
-
- .jpi is now supported as well as .hpi as a plugin extension.
- (pull #331)
-
-
- Windows service slave launcher now supports more generalized user account option.
- (pull #328)
-
-
- OSX installer now checks for the existence of JVM and open the browser in the end.
- (pull #329)
-
-
- Added the Reploy-To header support.
- (pull #306)
-
-
- The location of Maven local repository is now pluggable, and supported per-executor configuration out of the box.
- (pull #293)
-
-
- Jobs now support display name separate from its unique name
- issue 11762
-
-
-
- -
- Fixed a hash DoS vulnerability.
- (SECURITY-22)
-
-
- NullPointerException in maven-plugin: Maven3Builder / ExecutedMojo (1.445)
- (issue 12259)
-
-
- Reduced overhead of maven jobs.
- (issue 11883)
-
-
- Link to user profile from console output should go to the user ID, not the user name
- (issue 12279)
-
-
- Copy artifacts fails on windows slaves due to failing to set a timestamp.
- (issue 11073)
-
-
-
- -
- Jenkins now acts as an SSH daemon
- (doc)
-
-
- Added hyperlinks to console output
- (pull #334)
-
-
- Add option to disable mailnotifications for each failed maven module.
- (issue 5695)
-
-
- Sort workspace file list based on request locale.
- (issue 12139)
-
-
-
- -
- CLI now supports using HTTP proxy for tunneling its TCP/IP connection.
-
-
- CLI now supports routing TCP/IP requests without going through HTTP reverse proxy.
-
-
- If reload fails, don't let the partially loaded state running, or risk the user overwriting the configs they have.
- (issue 11204)
-
-
- Update center UI improvement. "Install" button is now always visisble.
-
-
- Configuration UI improvement. "Save" button is always visible.
-
-
- Fixed a bug where a large output from Maven can cause module log output to go out of sync with module build log files.
-
-
- Confusing error message when the --username option is used on the system with the .ssh directory.
- (issue 11873)
-
-
- Fixed prematurely re-drawn matrix test result graph.
-
-
-
- -
- Make the matrix configuration table looks like the rest of Jenkins tables.
- (issue 10251)
-
-
- Improved Italian translation.
-
-
- Fixed the incorrect table border cropping
- (issue 12061)
-
-
-
- -
- Wagon 2.0 upgrade broke the Redeploy task for webdav repositories
- (issue 11318)
-
-
- Self-restart wasn't working with 32bit x86 Solaris
- (issue 6629)
-
-
- Fixed IPv6 handling in Winstone
- (pull request #2)
-
-
- OS X installer can fail to set the file permissions correctly.
- (issue 11714)
-
-
- Build history time line wasn't working for IE8.
- (issue 7403)
-
-
- Build history time line should be resizable
- (issue 11834)
-
-
- Fixed a bug in Windows registry enumeration with large data.
- (issue 11767)
-
-
- Debian/Ubuntu init script does not wait long enough during stop operation
- (issue 11744)
-
-
- Jenkins takes up too much space in /var/run
- (issue 11366)
-
-
- Fixed a NoSuchMethodError on JBoss 5.1 EAP
- (issue 11960)
-
-
- Use $JENKINS_USER in Debian postinst script.
- (issue 5771)
-
-
- Fixed a bug where Jenkins failed to show localized text for Hebrew, Indonesian, and Yedish.
-
-
- Canonical name of Maven artifacts may end with "-" if classifier is empty.
- (issue 11819)
-
-
- Proxy configuration supported "no proxy host" setting to allow some hosts to bypass proxy.
- (issue 8710)
-
-
- Added/improved localization to Arabic, Bulgarian, Catalan, Czech, Danish, German, Greek, Esperanto, Spanish, Estonian, Basque, Finnish, French, Hebrew, Hindi, Hungarian, Indonesian, Icelandic, Italian, Kannada, Korean, Lithuanian, Latvian, Marathi, Norwegian, Dutch, Polish, Portugeese, Romanian, Russian, Slovak, Slovenian, Serbian, Swedish, Telgu, Turkish, Ukrainian, and Chinese. Thanks everyone!
-
-
-
- -
- Workspaces mixed when launching multiple concurrent builds.
- (issue 11825)
-
-
- Fixed ConcurrentModificationException in parallel Maven 3 builds.
- (issue 11256)
-
-
- Upgrade aether version to 1.13 and sisu to 2.3.0 .
-
-
- add new action type to enable plugins to intercept the maven 'goals and options'
- (pull #316)
-
-
- Upgrade to Maven Wagon 2.1 which supports preemptive authz for dav deployment.
-
-
- Plugins can be now installed without taking Jenkins offline.
-
-
-
- -
- If running as a daemon, don't daemonize one more time during restart.
- (issue 11742)
-
-
- Fixed NPE in Subversion polling of Maven jobs.
- (issue 11592)
-
-
- CLI jar now has the version number in the manifest as well as the "-version" option.
-
-
-
- -
- Sorting "diff" in test result requires 2 clicks
- (issue 5460)
-
-
- java.io.IOException: Unexpected termination of the channel - SEVERE: I/O error in channel Chunked connection when using jenkins-cli.jar (works on older Hudson version)
- (issue 11130)
-
-
- Debian init script now returns the proper exit code from the 'status' command.
- (issue 11306)
-
-
- Fixed a bug in Mac OS X ProcessKiller argument parsing.
- (issue 9634)
-
-
- Dependency wasn't recalculated with CLI "update-job" command.
- (issue 11636)
-
-
- Sortable table wasn't "stable" when there are same values in different rows
- (issue 11551)
-
-
- Managed windows slaves can be now run as a specific user account
- (pull #289)
-
-
- Description field now has the preview button to test it inline.
- (pull #243)
-
-
- Record fingerprints of parent POMs - only working with Maven 2.2 or newer
- (issue 8383)
-
-
- Maven mojo records can be now sorted
-
-
-
- -
- Fixed random OutOfMemoryError with console annotations
- (issue 9349)
-
-
- Fix small UI issue on build queue.
- (issue 11637)
-
-
- Textbox for numbers should be type=number
- (issue 11513)
-
-
- Added an extension point to sort matrix configuration builds when executing them sequentially
- (pull #301)
-
-
-
- -
- Thanks to Luca De Fulgentis, fixed XSS vulnerability with the built-in servlet container.
- (SECURITY-17)
-
-
- Repeated ids, expandTextArea() and multiple "Invoke Ant" build steps.
- (issue 10989)
-
-
- Improve the resilience to the missing 'nextBuildNumber' file.
- (issue 11563)
-
-
- NPE when running Maven 3 jobs with -T.
- (issue 11458)
-
-
- Support mailto: links in actions.
- (issue 7725)
-
-
- Rewrote the JDK installer to remove problematic HtmlUnit dependencies.
- (issue 11420)
-
-
-
- -
- Added MIME headers with job name and build result to notification emails.
-
-
- "Changes" in Build Summary broken in IE standard mode since 1.434
- (issue 11383)
-
-
- GET request to configSubmit wipes some configuration
- (issue 11397, issue 7847)
-
-
- Jenkins logo headless when server is starting.
- (issue 11444)
-
-
- Allow update center CA certificates to be placed in $JENKINS_HOME/update-center-rootCAs
-
-
-
- -
- Fixed a plugin boot problem that causes Jenkins to startup gracefully when some optional plugin dependencies aren't met (such as ivy to nant)
- (issue 11279)
-
-
- Avoid overwriting the repository definitions.
- (issue 11229)
-
-
- "Tailing" the console of an active job broken in 1.434
- (issue 11307)
-
-
- Fingerprint's age should be sorted by its elapsed time
- (issue 9210)
-
-
- Improved the classloading performance
-
-
- Expose original file name as a String parameter on for FileParameters
- (issue 11326)
-
-
- Added hyperlinks to build trigger console messages.
- (pull #291)
-
-
-
- -
- Fixed the XML encoding sniffing problem in environments that have old JAXP
- (issue 4525)
-
-
- Suggestions for search do not work since 1.433
- (issue 11208)
-
-
- "System Admin E-mail Address" is confusing label for notification mail "from"
- (issue 11209)
-
-
-
- -
- Add support for android-maven-plugin integration test reports and fix an error with 2.x maven-android-plugin
- (issue 10913)
-
-
- HTTPS on port 80 makes Jenkins infer his URI incorrectly
- (issue 11151)
-
-
- Resizable textarea handle does not work if CodeMirror is enabled
- (issue 11132)
-
-
- "Alternate settings file" build parameter is getting cleaned after job execution
- (issue 10955)
-
-
- upgrade Apache Maven Wagon to 2.0.
- (issue 11164)
-
-
- Made build SCM change set a weak reference to reduce heap usage
-
-
- Added a way to show avatar images on user pages.
- (issue 7494)
-
-
-
- -
- Port on HTTP Proxy Configure accepts characters except the digits
- (issue 11068)
-
-
- Broken link in help text of HTTP Proxy Configuration
- (issue 11051)
-
-
- Broken help button for Log Recorders
- (issue 11052)
-
-
- Fatal exception apparently within Xalan code on AIX
- (issue 10851)
-
-
- NOT_BUILT & other build status are reported inconsistently
- (issue 11013)
-
-
- Canceling a parent multi-config build produces non-deserializable build.xml
- (issue 10903)
-
-
- Label of the master should be editable if cloud is set up.
- (issue 11100)
-
-
- Improved the error diagnosis by ping-driven connection termination.
- (issue 11097)
-
-
- YUI updated to 2.9
-
-
- Concurrent build is no longer beta
-
-
- Permission check added when viewing configuration of computer set.
-
-
- Maven project now supports arbitrary build steps
- (pull #233)
-
-
- Jenkins internally started using Guice for loading extensions
- (issue 8751)
-
-
-
- -
- JDK auto-installation does not respect proxy settings
- (issue 10634)
-
-
- Tools download does not respect proxy settings
- (issue 5271)
-
-
- Recover from a corrupted JSON update data file automatically
- (issue 7034)
-
-
- Fixed the reported system reboot problem on installing JDK on Windows
- (issue 7288)
-
-
- Fixed the OutOfMemoryError in trying to download/install JDK
- (issue 10689)
-
-
- Enabled shortcut key on script console
-
-
- Remember sortable table state into local storage
- (issue 203)
-
-
-
- -
- Jenkins unable to start if the /tmp/jna catalogue exists and is owned by a different user
- (issue 10774)
-
-
- Display the file size in the artifact list page
- (issue 7798)
-
-
- Fixed a file permission handling in the unzip code.
- (issue 9577)
-
-
- Add "un/check all" buttons on matrix-based security.
- (issue 7565)
-
-
-
- -
- Added way to mark all plugins to be updated at once
- (issue 10443)
-
-
- Fixed a bug in the UI JavaScript behavior with IE
-
-
- Matrix project pages don't show latest test results.
- (issue 10864)
-
-
- Bundling the translation assistance plugin in the hope of increasing the contribution.
-
-
- Introduce a fine-grained permission to control who is allowed to run the Groovy Console.
-
-
- Maven jobs should include fingerprints of their parent POMs
- (issue 8383)
-
-
- Add support for maven-android-plugin integration test reports
- (issue 10913)
-
-
-
- -
- maven submodule build fails doing mkdir on master.
- (issue 10831)
-
-
- CLI clients should be able to see plugin classes
- report
-
-
- Fixed NPE in running assembly:assembly with Maven3
- (issue 8837)
-
-
- Fixed a bug in one of the file copy operations that caused the copy-artifact plugin to fail to preserve the timestamp.
- (issue 10805)
-
-
- Jenkins didn't start on IBM JDK.
- (issue 10810)
-
-
- Fixed a possible NPE during the boot sequence
- (issue 10799)
-
-
- stdin/stdout based remote slaves, such as ones launched via SSH or script, now does a better redirect to avoid interference with JVM output to stdout.
- (issue 8856)
-
-
- Project names in fingerprint records weren't updated when a project is renamed.
- (issue 10330)
-
-
- External job submision now supports <displayName> and <description> elements
- (pull 215)
-
-
-
- -
- CLI jar download was making the browser prefer a wrong file name.
-
-
- Link "Started by user XXX" broken on build status page if user name modified.
- (issue 10698)
-
-
- 404 error when clicking "Build History" link on MyView.
-
-
- Add a DefaultViewsTabBar config.jelly to avoid jelly exception
- (issue 10640)
-
-
- go back to view page when job is deleted.
- (issue 10510)
-
-
- A Global Environment variable with an empty key would fail maven builds since 1.424. Ignore these variables instead of failing the build.
- (report)
-
-
-
-
- -
- Builds failing while archiving test result if build is running in different VM (e.g. IBM J9) than Jenkins is
- (issue 10030)
-
-
- Maven builds failing with NullPointerException at the end.
- (issue 10715)
-
-
- Jenkins self-restart causes process name to change from java to exe
- (issue 9206)
-
-
- Fixed a bug where SSH public key authentication for CLI wasn't working for username/password based security realm.
- (issue 10647)
-
-
- Failing to install a plugin from CLI should result in non-zero exit code
- (issue 10057)
-
-
- Fixed NPE in trying to diagnose undefined job error.
- (issue 7826)
-
-
- Disable auto refresh in slave markOffline screen
- (issue 10608)
-
-
- Workspace-cleanup thread shouldn't delete custom workspace directories
- (issue 8880)
-
-
- Improved the speed of shutdown
-
-
- RPM package should honor user-modified configuration file better
- (issue 10037)
-
-
- OS X package now provides customizable commandline
- (pull request 195)
-
-
- Improved the remote API for queue
- (issue 10414)
-
-
- Added a dignosis CLI command to report the current granted authorities.
-
-
- Added a CLI command to set display name of the build
- (issue 9126)
-
-
- Added an option in CLI build command to check for SCM changes before carrying out a build
- (issue 9968)
-
-
- If CLI fails to connect via a JNLP Slave port, fall back to HTTP full-duplex.
- (issue 10611)
-
-
- Added two CLI commands to manipulate job by its XML definition.
- (issue 8797)
-
-
- Added two CLI commands to shutdown Jenkins
- (issue 6594)
-
-
- Fixed unclear text for Tabs with no jobs
- (issue 9330)
-
-
-
- -
- Auto Install JDK asks for Oracle account, but the link goes 404.
- (issue 10556)
-
-
- Record and display who aborted builds.
- (issue 5754)
-
-
- Added API token support.
- (issue 9363)
-
-
- Maven Plugin can use settings and global settings files provided by the config provider plugin
-
-
- Fixed background of title image
- (issue 9571)
-
-
-
- -
- Make syntax highlighting optional
- (issue 10509)
-
-
- isPartial() check for matrix builds now only reference active configurations.
- (issue 10197)
-
-
- Maven jobs building plugins were no longer identified as upstream snapshot dependencies.
- (issue 10530)
-
-
- MAVEN_OPTS configuration wasn't expanding environment variables.
-
-
-
- -
- Java Web Start binaries weren't signed.
- (report)
-
-
- Fixed Maven build error if headless option is set and MAVEN_OPTS empty
- (issue 10375)
-
-
- Tests not recognized as failed if test initialization failed
- (issue 6700)
-
-
- Support for gzipped log in consoleText
- (issue 10400)
-
-
- Expand variables in the Maven POM definition in Maven projects.
- (issue 5885)
-
-
- Some CLI command are not available.
- (issue 10418)
-
-
- Maven jobs deploying or installing artifacts should be used for dependency graph instead of jobs which don't
- (issue 10366)
-
-
- Maven jobs which are disabled should be excluded from dependency graph
- (issue 10367)
-
-
- Updated JDK installer to reflect changes in Oracle download server
- (issue 10511)
-
-
- Fixed memory leak in the master/slave communication.
- (issue 10424)
-
-
- Fixed a problem in the core that prevents CLI users from authenticating with Crowd plugin (and others like it.)
-
-
-
- -
- Fixed a boot problem in 1.422.
-
-
-
- -
- Fixed a regression in 1.421 that broke CentOS installations.
- (issue 10354)
-
-
- When run as "java -jar jenkins.war", failing to listen on HTTP ports should be fatal.
-
-
- Fixed a race condition in the fingerprint computation
- (issue 10346)
-
-
- Fixed an occasional NPE when running Maven jobs
- (issue 9822)
-
-
- Added a new hudson.model.Computer.CREATE permission to limit who can create new slaves.
-
-
-
- -
- NPE when requesting http://server/job/TEST-START/description and the description is empty
- (issue 10182)
-
-
- Redeploy artifacts for the whole project wasn't showing up for Maven3 projects.
-
-
- PAM authentication wasn't working with Ubuntu 11.04
- (issue 9486)
-
-
- ToolCommandInstaller: Fix CR/LF and always make it Unix style.
- (issue 9963)
-
-
- Empty emailAddress causes Mailer error.
- (issue 10300)
-
-
- Label Alignment does not correctly work for top-level entries that span several lines
- (issue 10253)
-
-
- Fixed a bug in Groovy view taglib rendering for "/lib/hudson"
-
-
- PAM authentication now works with CLI login mechanism.
- (issue 9681)
-
-
- Jenkins behaves better in JRebel-enhanced environment during core/plugin development
- (details)
-
-
- Generalized the mechanism to control scopes of security permissions
-
-
- Added an extension point to record arbitrary data to fingerprints.
-
-
- Build trigger dependency wasn't recalculated when jobs are copied.
-
-
- Exposed more remote APIs around archived Maven artifacts.
-
-
- Allow build directories and workspace directories in $JENKINS_HOME to be placed elsewhere.
- (issue 8446)
-
-
- Mac installer update: set file permissions to be more in line with Mac conventions.
- (pull request 188)
-
-
- Maven build script to produce the binary was significantly modified.
- (pull request 193)
-
-
-
- -
- Fix: jenkins did not record test results generated by the GWT maven plugin
- (pull request 186)
-
-
- Fixed a race condition in the remoting that can break the pipe support
- (issue 8703)
-
-
- Restart button does not restart jenkins after plugin upload
- (issue 10044)
-
-
- Fixed a file handle leak in GET config.xml API call
- (issue 8042)
-
-
- Fixed the redundant/incorrect encoding handling in XML configuration files.
- (issue 4525)
-
-
- File parameter didn't work correctly with matrix projects
- (issue 10108)
-
-
- Fixed the double escaping problem in the update center error message
- (issue 10081)
-
-
- Fixed JellyTagException in the manage page after Jenkins upgrade
- (issue 10066)
-
-
- Groovy script console is now syntax highlighted.
-
-
- Improved the form validation to the "restrict where jobs can run" field.
-
-
- Text area to enter description is now syntax highlighted.
-
-
- Don't recalculate internal dependency graph if Maven dependencies haven't changed
- (issue 9301)
-
-
-
- -
- "Ant Version" field in "Invoke Ant" Build step missing in 1.416
- (issue 10036)
-
-
- post build deployment task fails with : Unbuffered entity enclosing request can not be repeated.
- (issue 10076)
-
-
- After an unsuccessful Maven incremental build, make sure that all modules are deployed on the next successful one.
- (issue 5121)
-
-
- Fixed the permission issues on /Applications/Jenkins with OS X installer
- (issue 9398)
-
-
- Block up-/downstream Projects of matrix projects
- (issue 4959)
-
-
- Just like SSH connector, managed Windows connector now allows the machine name to be specified.
- (pull request #172)
-
-
- Debian package no longer distributes /etc/apt/sources.list.d/jenkins.list
- (pull request #170)
-
-
- Added SSH public key based CLI authentication
- (wiki)
-
-
- Jenkins OS X installer now starts Jenkins upon system boot, not upon user login
- (issue 9399)
-
-
- Improve the vertical alignment of form fields and labels
- (pull request #175)
-
-
- Improve the column sorting behaviours
- (pull request #174)
-
-
- Managed Windows slave launcher now lets you define a host name separately from the slave name.
- (issue 10099)
-
-
-
- -
- Permissions from LDAP groups weren't working properly since 1.416
- (issue 10075)
-
-
- "0 tests started to fail" makes no sense
- (pull request #165)
-
-
- Defined a proper way to interrupt the build and mark it as a failure.
- (issue 9203)
-
-
- Prevent a occasional JavaScript safety warning message when running in HTTPS
-
-
- About page should not autorefresh
- (issue 9967)
-
-
- Added a new build parameter type that shows a text area
- (issue 5577)
-
-
- Making views more reusable outside the root object.
-
-
- Added a new hudson.footerURL system property to tweak the link displayed at
- the bottom of the UI
-
-
- Added a new hudson.security.WipeOutPermission system property to enable a
- new WipeOut permission controlling the "Wipe Out Workspace" action.
-
-
-
- -
- Fixed a regression in 1.416 that broke cloud plugins like libvirt and EC2.
-
-
-
- -
- Make captcha support optional; remove LGPL jcaptcha
- (issue 9915)
-
-
- Validate new view name relative to current context
-
-
- Unfilled custom workspace textbox shouldn't be allowed.
- (issue 9806)
-
-
- Fixed a race condition between remoting I/O operations.
- (issue 9189)
-
-
- Fixed a bug in LDAP group search based on memberUid
- (pull request #151)
-
-
- If the user tries to run Jenkins on Java 1.4 and earlier, detect that more gracefully.
-
-
- Fixed NPE in site generation when building a single Maven module
- (issue 7577)
-
-
- Fixed timeline on build trend page.
- (issue 6439)
-
-
- Fixed the initialization order of plugins
- (issue 9960)
-
-
- Label/node tree is not visible in multi-configuration project config page
- (issue 9689)
-
-
- LDAPBindSecurityRealm.groovy can be now overridden in $JENKINS_HOME
- if it exists.
-
-
- AJP port is customizable in RPM/OpenSUSE packages
- (pull request #149)
-
-
- "Deploy to Maven repository" post build task should default to unique version,
- as per Maven3 default.
- (issue 9807)
-
-
- Improved the URL hyperlinking behavior in the console output
- (pull request #119)
-
-
- Plugins can now override where jobs are executed.
-
-
- Rotate the slave log files instead of deleting them.
-
-
- Added a mechanism to control the XML parser behaviour
- (pull request #67)
-
-
- Minor UI improvements for Jenkins update center.
- (issue 9212)
-
-
- Added a mechanism to write views in Groovy. The interface isn't committed yet. We are looking for feedback.
-
-
-
- -
- Output correct version from java -jar jenkins.war --version (broken since 1.410)
-
-
- Correct usage text from java -jar jenkins.war --help
-
-
- Incremental maven jobs: if POM parsing failed, do a full build next time.
- (issue 9848)
-
-
- Do not expose the proxy password in the HTML for Update Center
- (issue 4000)
-
-
- CLI command page now lists all the available commands
- (issue 9789)
-
-
- Improve the post deployment job to make a clear error if you disabled artifacts archives
- (issue 9791)
-
-
- Post-build deploy task for Maven jobs : Repositories definitions can now be read from the POMs.
- (issue 9786)
-
-
- Run maven jobs as headless process. on OSX this avoid jumping Dock icon to take focus.
- (issue 9785)
-
-
- Reduce memory consumption of dependency calculation in maven jobs.
- (issue 9845)
-
-
- Strongly encrypt the proxy password
- (issue 4002)
-
-
- Added an extension point to allow prodding the NodeProvisioner into taking action faster than it might usually.
-
-
- When there are absolutely no executors for a specific label, there was an unnecessary delay in provisioning the
- first node for that label.
-
-
-
- -
- Fixed the concurrent modification exception in classloading during startup
-
-
- Show an error message if no name is provided when creating a job (CLI)
- (issue 6958)
-
-
- Fix unescaped apostrophe in French translation.
- (issue 9699)
-
-
- Allow building multiple downstream dependencies on a single job via DependencyGraph and BuildTrigger.
- (issue 8985)
-
-
- Catch FileNotFoundException in Maven builds if Mojos are executed from a classes directory.
- (issue 5044)
-
-
- Fix NPE if node of last build isn't available anymore while polling for SCM changes.
- (issue 9003 )
-
-
- Set NODE_NAME for master node to "master"
- (issue 9671)
-
-
- Jenkins Maven build does not recognize Tycho surfire reports with new groupId org.eclipse.tycho
- (issue 9326)
-
-
- Add a default attribute to repeatableProperty and repeatable jelly tags
-
-
- Log which build steps have changed the build result to build console.
- (issue 9687)
-
-
-
- -
- Fixed extra ' character in french translation.
- (issue 9197)
-
-
- "Downgrade Jenkins" incorrectly shows 1.395
- (issue 9656)
-
-
- Fixed NPE in GlobalMatrixAuthorizationStrategy.doCheckName
- (issue 9412)
-
-
- Fixed a ClassCastException caused by multiple loading of the same class in different classloaders.
- (issue 9017)
-
-
- Support rebuilding a subset of matrix configurations
- (issue 1613)
-
-
- Gracefully handle old slave.jar to avoid AbstractMethodError
- (thread)
-
-
- Debian packages now do log rotation
- (issue 8641)
-
-
- Provide more information to QueueTaskDispatcher
- (thread)
-
-
- Replaced all gif images with png images (transparency support).
- (issue 3969)
-
-
- Boldify names of executed mojos for Freestyle and Maven2/3 jobs using Maven3 in console output.
- (issue 9691)
-
-
-
- -
- Wait until updates are successfully installed before restarting Jenkins
- (issue 5047)
-
-
-
- -
- Allow blank rootDN in LDAPSecurityRealm.
- (thread)
-
-
- Fixed the UI rendering problem when certain controls are nested together.
-
-
- Auto-refresh is now disabled when triggering a build with parameters
- (issue 7342)
-
-
- 404 when clicking in the weather report column of a build that hasn't yet been run.
- (issue 9532)
-
-
- Manually uploading a bundled plugin should trigger pin-down.
-
-
- Clicking "History" from the left bar in a test result history page results in 404
- (issue 5450)
-
-
- Add active configurations in remote API for matrix projects.
- (issue 9248)
-
-
- Link to the console output from the status icon of an entry in the HistoryWidget.
-
-
- Exploit commons-codec for Base64 encoding rather than proprietary sun.misc.BASE64Encoder
- (issue 9521)
-
-
- Order of extension implementations is made bit more deterministic
-
-
-
- -
- Maven3 with multiple threads does not work in Jenkins.
- Fix support of -Tx maven 3 option.
- (issue 9183)
-
-
- Jenkins Maven build does not recognize Tycho surefire reports
- (issue 9326)
-
-
- Fixed a persistence problem in View$PropertyList
- (issue 9367)
-
-
- Added unique instance identifier to UDP broadcast and DNS multicast information.
- (issue 9230)
-
-
- jenkins.xml explains how to use hudson.exe for Windows
- (issue 9470)
-
-
- Maven agent needs a fix for the 'hardcoded' socket connection to localhost
- (issue 6795)
-
-
- Support custom workspace for maven/ivy projects
- (issue 8848)
-
-
- Added a new extension point to execute background tasks more flexibly.
-
-
- Memory space monitor now works for Mac OS X Snow Leopard
- (issue 9374)
-
-
-
- -
- Some french strings are incorrect after renaming to Jenkins
- (issue 9334)
-
-
- Debian init script gives false positives for port already in use
- (issue 9281)
-
-
- "include culprits" should treat unstable and failure as the same
- (issue 4617)
-
-
- fixed "Copy existing job" autocompletion.
- (issue 9384)
-
-
- Zip/tar files created by Jenkins now properly retains Unix file modes.
- (issue 9397)
-
-
- Added two new CLI commands "wait-node-online" and "wait-node-offline" to block until a slave becomes online/offline.
-
-
- Move Jenkins URL setting from E-mail Notification to its own section in the main configuration.
-
-
- Add LOADING overlay when triggering a build with parameters
- (issue 9343)
-
-
- Support self restart on Mac OS X 10.6 and onward
- (issue 7537)
-
-
- Added "about Jenkins" screen that shows the 3rd party license acknowledgement.
-
-
-
- -
- Fixed a regression that resulted in too much escaping
- (issue 9426)
-
-
- Fixed a persistence problem in View$PropertyList
- (issue 9367)
-
-
-
- -
- Implemented comprehensive preventive measure against cross-site scripting.
- (SECURITY-14)
-
-
- Javadoc links on maven job page with only one module
- (issue 9202)
-
-
- Duplicate test results with Maven2 projects
- (issue 1557)
-
-
- Re-fixed JDK1.6 dependency that has crept into the core in 1.400
- (issue 8914)
-
-
- eclipse-plugin packaging doesn't work with maven plugin support.
- (issue 8438)
-
-
- Failed to parse POMs for packaging swc.
- (issue 8448)
-
-
- Fixed "AdjunctManager is not installed" error when Jenkins failed to startup.
- (issue 9271)
-
-
- Jenkins has a new logo, thanks to Charles Lowell at The Frontside
-
-
-
- -
- Default viewport of the Timeline widgets were off by one day.
- (issue 6439)
-
-
- Label expression logic wasn't supporting a binary operator sequence like "a || b || c"
- (issue 8537)
-
-
- In matrix security, newly added rows weren't removable
-
-
- Improve the stability of the test harness
-
-
- Fixed a bug in handling ' and " in matrix build label axis
- (issue 9009)
-
-
- Fixed NPE in the "deploy to Maven repository" as a post-action.
- (issue 9084)
-
-
- Performance: Specify image sizes for faster page loading
- (issue 9182)
-
-
- Support nested testsuites in the JUnit test result
- (issue 6545)
-
-
- Added an extension point to allow adding transient actions to computers.
-
-
- Added an extension point to allow associating custom properties with views.
-
-
- Actions can now override their rendering in the parent model object.
-
-
- Jenkins is exposed to DNS multi-cast as Jenkins now
-
-
- Added a mechanism for plugins to write an invisible job property
-
-
- Added a mechanism for plugins to write an invisible node property
-
-
-
- -
- Fixed link to javadoc in maven modules and add link to generated test javadoc
-
-
- Fixed an AbstractMethodError in ItemGroupMixin.create when using some older plugins.
-
-
- The "last duration" column was broken since 1.403.
-
-
- Fixed a bug where XML API can produce malformed XML.
- (issue 8988)
-
-
- Archive maven artifacts by their canonical names to avoid possible name conflicts
- (issue 9122)
-
-
- Marking modules as 'not build' in maven incremental builds didn't work anymore in maven 3 jobs
- (issue 9072)
-
-
- In incremental maven builds, modules could be left unbuilt, although they had SCM changes
- (issue 5764)
-
-
- Rebuilding dependency graph was taking much too long for big maven projects
- (issue 7535)
-
-
- Maven builds didn't work in JBoss 6.
-
-
- Ping setup for detecting bad master/slave communication is done more consistently now
- (issue 8990)
-
-
- Expand environment variables in fingerprint targets
- (issue 9138)
-
-
- Added an extension point to allow adding transient actions to computers.
-
-
-
- -
- Regression in jenkins .401 maven plugin - deploy to repository post-task
- (issue 9084)
-
-
- Fixed a bug in persisting user configuration that causes NPE in some plugins
- (issue 9062)
-
-
- Replacement of some maven properties is not working
- (issue 8573)
-
-
- Fixed JDK1.6 dependency that has crept into the core in 1.400
- (issue 8914)
-
-
- When both "block build when upstream/downstream is building" are checked, the upstream block check wasn't taking effect.
- (issue 8968)
-
-
- A project aggregating tests without any tests itself should now link properly
- to latest aggregated results, rather than broken link to non-existent test
- results.
-
-
- Initial position of the "build time" timeline was off by one day
- (issue 8865)
-
-
- Build list tables had "Date" as column label, but actual content of the column was "Time Since".
- (issue 9102)
-
-
- PAM authentication fails to restore group membership information on "remember me" tokens.
- (issue 9094)
-
-
- Upstream culprits did include culprits of an old build.
- (issue 8567)
-
-
- Shell Task on Windows Slave Uses Incorrect /bin/sh.
- issue 8449)
-
-
- NPE during run - fingerprint cleanup thread.
- issue 6128)
-
-
- Failed to instantiate class hudson.slaves.DumbSlave.
- issue 7174)
-
-
- "Last Duration" column was showing all N/A. Regression in 1.403
- issue 9134)
-
-
- Added the --mimeTypes command line option to define additional MIME type mappings.
-
-
- Added a new axis type to the matrix project that lets you use boolean expressions
- (pull request #66)
-
-
- Improved the error diagnostics when a remote method call fails to deserialize.
- (issue 9050)
-
-
- Added "Manage Jenkins" link to the left side panel.
- (issue 7743)
-
-
- LDAP group names are now available as-is for the use in authorization. No upper casing / no 'ROLE_' prefix.
-
-
- Added a new extension point to contribute build variables.
-
-
-
- -
- Fixed a race condition in the remote data transfer that results in silent file copy failures.
- (issue 7871)
-
-
- Maven Plugin : Successful build ends with NPE
- (issue 8436)
-
-
- Fixed a deadlock when upstream and downstream jobs are blocked on each other
- (issue 8929)
-
-
- Email fails when sending to multiple recipients if _any_ of them are in error
- (issue 9006)
-
-
- Ant properties with Windows %VAR% type variables did not expand since 1.370.
- (issue 7442)
-
-
- Fixed a concurrent data access corruption in crumb generation.
-
-
- Allow maven builds to (opionally) make use of the token-macro-plugin.
-
-
- Proactively watch out for incomplete extensions to avoid cryptic NPE.
- (issue 8866)
-
-
- Added more event callbacks on ComputerListener
- (thread)
-
-
- Improved the auto-completion for creating a job by copying.
-
-
- Improved the performance of the configuration page rendering by lazy-loading fragments.
-
-
- Introduced a behind-the-scene mechanism to lazy-load portions of HTML pages.
-
-
- Introduced a behind-the-scene mechanism to simplify server/client communication through JavaScript proxies.
-
-
- Added an option to aggregated test results to include failed builds as well as passing and unstable builds.
-
-
- Added autocompletion to "Build after other projects" textbox, with support for "autoCompleteField" on textboxes without a true field.
-
-
- Include OS type and version of slave in the system information page.
- (issue 8996)
-
-
-
- -
- Botched release. It doesn't exist.
-
-
-
- -
- Fix for JENKINS-8711 breaks deployments with credentials
- (issue 8939)
-
-
- Environment variable not available for Maven build/POM parsing.
- (issue 8865)
-
-
- Fixed a dead lock in concurrent builds of the same Maven projects.
- (issue 4220)
-
-
- Plugin Manager incorrectly displays "Changes will take effect when you restart Jenkins".
- (issue 8917)
-
-
- Added Manage Jenkins link in sidepanel of Plugin Manager and Update Center.
- (issue 8780)
-
-
- Thread dump now reports all the threads from all the slaves, not just the master.
-
-
- Made the extension point implementation discovery logic customizable by a plugin
- (issue 8897)
-
-
- Defined a mechanism to replace some of the key UI text.
- (issue 8579)
-
-
-
- -
- NPE during in parsing POMs for Multi Module Build
- (issue 8525)
-
-
- Post build action deploy to maven repository can fail when using "use private maven repository option"
- (issue 8711)
-
-
- Groovy CLI command was failing to resolve plugin classes
- (issue 8892)
-
-
- Exposing more key variables to the Groovy CLI command.
-
-
- Allow classworlds.conf to be externally configured for M3 builds
- (issue 8905)
-
-
- Configure the environment for Maven job type builds
- (issue 8902)
-
-
-
- -
- On IBM JDKs, Jenkins incorrectly ended up closing stdout to read from forked processes.
- (issue 8420)
-
-
- Fixed a race condition in obtaining the tail of the output from remote process.
- (issue 7809)
-
-
- Jenkins was unable to kill/list up native processses on 64bit Mac JVMs.
-
-
- Many messages about RecordReaper IllegalArgumentException
- (issue 8647)
-
-
- Multiple polling events triggering a single build show up as multiple identical BuildActions in the sidebar, since there
- is only one polling log file, regardless of how many times polling happened. Should only be the latest polling instance now.
- (issue 7649)
-
-
- Fix javascript errors on config pages when view name or user name contains an apostrophe.
- (issue 8789)
-
-
- Fix expansion of builtin environment variables in Ant properties on Windows.
- (issue 7442)
-
-
- Fixed a log rotation configuration problem on openSUSE.
- (issue 5784)
-
-
- Fixed a bug in the OpenSUSE startup script (again)
- (issue 5020)
-
-
- Change prefix of BUILD_TAG variable to "jenkins-"
-
-
- Lock down maven plugin versions to shut up m3
- (issue 7275)
-
-
- BuildWrappers can now act on the build in progress before the checkout occurs.
-
-
- Improved the process forking abstractions so that plugins can more easily read from child processes.
- (issue 7809)
-
-
-
- -
- MavenBuild does not respect the "alternate settings" value of its parent MavenModuleSetBuild
- (issue 8670)
-
-
- Jenkins wasn't telling build wrappers that builds were aborted when they were aborted.
- (issue 8054)
-
-
- Maven deployment with uniqueVersion == true creating "new" versions for attached artifacts
- (issue 8651)
-
-
- Fixed a bug in the OpenSUSE startup script
- (issue 5020)
-
-
- Fixed a XSS vulnerability in the project relationship page.
-
-
- "apt-get purge" with Debian should really purge
-
-
- Added a new extension point to expose unprotected root action.
-
-
- While editing description, inline help should show the syntax guide based on the current markup formatter.
-
-
- Started exposing JENKINS_URL, JENKINS_SERVER_COOKIE env vars in addition to legacy HUDSON_* variables
-
-
-
- -
- Fixed a master/slave communication problem since 1.378 that often manifests as "Not in GZIP format"
- (issue 7745)
-
-
- When run as "java -jar jenkins.war", "~/.hudson" was still used as default.
- (issue 8658)
-
-
- Debian package no longer messes around with the file permissions
- (issue 4047)
-
-
- Fixed a JVM dependency in debian package so that it can run with OpenJDK
- (issue 8159)
-
-
- Fixed a log rotation configuration problem on Red Hat
- (issue 5784)
-
-
- Windows XP slave stopped working in 1.396 (related to name change)
- (issue 8676)
-
-
- Unnecessary log messages if a remote pipe is not read until EOF
- (issue 8592)
-
-
- Fixed a bug in the calendar computation.
- (issue 8656 in Hudson)
-
-
- Fixed an NPE when loading full build history.
- (issue 8660)
-
-
- EXECUTOR_NUMBER uniqueness can degrate over time
- (issue 4756)
-
-
- jenkins-cli.jar should honor JENKINS_URL.
-
-
- build RSS feeds now contain description of builds.
- (issue 3935)
-
-
- Debian package will force-terminate Jenkins if it fails to shut down in 5 seconds.
- (issue 5415)
-
-
-
- -
- Fixed a bug in crontab "day of week" handling in locales where a week starts from Monday.
- (issue 8401)
-
-
- If a master fails to ping a slave, it should be hard-disconnected.
-
-
- "java -jar hudson.war --daemon" was forcing umask 027. This includes Debian/redhat packages.
- (issue 5114)
-
-
- If the JNLP-connected slave drops out without the master not noticing, allow the reconnection
- without rejecting it.
- (issue 5055)
-
-
- Fixed a trademark bug that caused a considerable fiasco by renaming to Jenkins
-
-
-
- -
- Do not chmod/chown symlink targets in /var/lib/hudson (debian package)
- (issue 8502)
-
-
- M2 and M3 builds behave differently when tests fail.
- (issue 8415)
-
-
- Hudson was failing to record the connection termination problem in slave logs.
-
-
- Node names can be edited to include slashes and then cannot be removed.
- (issue 8437)
-
-
- Fix temporarily offline slaves not showing active jobs
- (issue 8546)
-
-
- Startup performance improvement
-
-
- Reduced the memory footprint used by fingerprints.
-
-
- Added a new extension point to support external login mechanisms.
-
-
- Heap dump of running Hudson instance can be obtained by requesting /heapDump from
- the browser.
-
-
- MavenReporter#postExecute parameter Throwable error is always empty in case of mojo failure
- (issue 8493)
-
-
- Improved the error diagnosis if a build fails because of the slave connectivity problem.
- (issue 5073)
-
-
-
- - Parsing poms fails if a module is a path to a pom (and not to a directory)
- (issue 8445)
-
- M3 builds doesn't have a colorized console
- (issue 8411)
-
- Bad path for submodules
- (issue 8452)
-
- Add more options to configure maven project building
- (issue 8406)
-
- Violations plugin tries to access nonexistant directory.
- (issue 8418)
-
- maven2 build fails due to 'RELEASE' plugin version.
- (issue 8462)
-
-
- Block build when downstream projects are building.
- (issue 7046)
-
- nonRecursive option is not honored anymore when parsing pom
- (issue 8484)
-
-
- Maven 3 support : display same logging output as a maven build with the cli
- (issue 8490)
-
-
-
- -
- Added CharacterEncodingFilter to prevent Non-ASCII characters from getting garbled.
-
- Maven mirrors not used when project uses Maven 2.2
- (issue 8387)
-
- NPE while parsing POMs
- (issue 8391)
-
- M2 POMs aren't parsed if there is a M3 control error like an invalid scope in a plugin dep.
- (issue 8395)
-
- POMs parsing fails in m2 projects which has a wrong inheritence (m3 constraint).
- (issue 8390)
+
-
+ Worked around "incompatible InnerClasses attribute" bug in IBM J9 VM
+ (issue 22525)
+
-
+ Fixed a file descriptor leak with CLI connections.
+ (issue 23248)
+
-
+ Fixed a regression that removed all users with uppercase letters in the user name since 1.566.
+ (issue 23872)
+
-
+ Improving security of
set-build-parameter
and set-build-result
CLI commands.
+ (issue 24080)
+ -
+ Startup can be broken by deeply recursive causes in build records.
+ (issue 24161)
+
-
+ Displaying unabridged test result trend on project index page defeated lazy loading.
+ (issue 23945)
+
-
+ Added support for host:port format in X-Forwarded-Host header.
+ (commit 19d8b80)
+
-
+ API to launch processes without printing the command line.
+ (issue 23027)
+
-
+ Added option to increase impact of test failures on the weather report.
+ (issue 24006)
+
-
+ Modernized sidebar
<l:pane>
s and making them work better with new layout.
+ (issue 23810,
+ issue 23829)
+ -
+ Add option to CLI to skip key authentication (e.g. when there's a password on the default key).
+ (issue 23970)
+
-
+ Modernize tabBar and bigtable. Makes the project view look better. Same for Plugin Manager.
+ (issue 24030)
-
+
- -
- Maven 3 support in maven-plugin.
- (issue 4988)
-
-
- Turn Off "Show Friendly HTTP Error Messages" Feature on the Server Side.
- (issue 8352)
-
-
- Hudson installed as Windows service wasn't restarting properly
- (issue 5090)
-
-
- Escape quotes.
- (issue 8270)
+
-
+ Move option to fingerprint artifacts to Archive the Artifacts, Advanced options.
+ (commit f43a450)
+
-
+ Move option to keep dependencies (builds) from Fingerprint to Advanced Project Options.
+ (commit a8756c6)
+
-
+ Improved validation of Build Record Root Directory setting.
+ (issue 14538)
+
-
+ Indicate which node the workspace being viewed is on.
+ (issue 23636)
+
-
+ Show full project name for projects in folders.
+ (issue 22971)
+
-
+ UI redesign: Shrink the top bar, change logo, changed links in top bar.
+ (pull 1327,
+ (pull 1328)
+
-
+ Killing processes started by builds on Unix was broken as of 1.553.
+ (issue 22641)
+
-
+ Should not stop a build from finishing just to compute JUnit result difference to a prior build which is still running.
+ (issue 10234)
+
-
+ Do not show link to System Information page for offline slaves, make page more robust when offline.
+ (issue 23041)
+
-
+ Fix link to SCM polling log from downstream job cause.
+ (issue 18048)
+
-
+ Autocomplete logger names.
+ (issue 23994)
+
-
+ UI redesign: Fix links in header bar when logged in.
+
-
+ Do not show changes for the build at the lower bound of the changes list.
+ (issue 18902)
+
-
+ Restrict access to SCM trigger status page to administrators.
+ (pull 1282)
-
+
- -
- failed to build with "Trigger builds remotely" enabled.
- (issue 8319)
-
-
- added a new extension point to use markup for job/user description
+
-
+ UI redesign: Use Helvetica as default font
+ (pull 1315,
+ issue 23840)
+
-
+ Synchronization issue during tool installation
+ (issue 17667)
+
-
+ Use native encoding for filenames in downloaded ZIPs.
+ (issue 20663)
-
+
- -
- " (from WhateverTest)" gratuitously appended to test result detail pages.
- (issue 5655)
-
-
- Fixed a pipe leak to child processes.
- (issue 8244)
-
-
- Fixed an NPE in ComputerRetentionWork
- (issue 3696)
-
-
- Fixed an issue preventing to copy data on AIX, HP-UX or Linux for S/390.
- (issue 8155)
-
-
- Debian package init script now honors ~/.profile.
-
-
- Build names (e.g., "#123") can be now modified by users/plugins to arbitrary text.
- (issue 53,
- issue 4884)
-
-
- Allow the administrator to yank out dead executors.
+
-
+ UI redesign: Changed element alignment, removed sidebar link underlines
+ (pull 1314,
+ pull 1316)
+
-
+ Word-break links in build logs to preserve page width
+ (pull 1308)
+
-
+ Log rotation fails with "...looks to have already been deleted"
+ (issue 22395)
+
-
+ Fixed unnecessary eager loading of build records in certain code path.
+ (issue 18065)
-
+
+ -
+ UI redesign: Changed header, made layout <div>-based and responsive
+ (pull 1310)
-
- Hide executors for offline nodes to conserve space in Build Executors Status list.
- (issue 8252)
+ Improved handling of X-Forwarded-* headers
+ (issue 23294)
-
- throw AccessDeniedException if "Authentication Token" is invalid.
- (hudson-ja)
+ Do not offer automatic upgrade if war parent directory is not writable
+ (issue 23683)
-
+
-
- Failure to UDP broadcast shouldn't kill the Hudson bootup process.
-
-
- Fixed an AbstractMethodError in listing up executors.
- (issue 8106)
+
IllegalArgumentException
from AbstractProject.getEnvironment
when trying to get environment variables from an offline slave.
+ (issue 23517)
-
- Slaves launched by JNLP fail to reprot their version numbers.
- (issue 8060)
+ Overall.READ is sufficient to access /administrativeMonitor/hudsonHomeIsFull/
+ (SECURITY-134)
-
- Restarting Hudson via debian init script didn't wait for the process to really terminate.
- (issue 7937)
-
-
- Test history with long build records had a scalability problem.
- (issue 4621)
-
-
- Added the build number to the test result graph tooltip.
-
-
- Added a new extension point to contribute transient View actions.
-
-
- Added "disable project" button.
-
-
- Added "set-build-description" CLI command.
+ Master computer is not notified using ComputerListener
+ (issue 23481)
-
+
- -
- Avoid AbstractMethodError in the executors rendering.
-
-
- Don't litter HUDSON_HOME with atomic*.xml files.
-
-
- Hudson is made more robust in the face of malformed console annotations.
-
-
- Add parameter definition type and job name to job API
- (issue 8133)
-
-
- "Install as a service" now supports Vista and Windows 7.
-
- "Restart Hudson" button should appear when a plugin is manually installed.
+ Add CLI commands to add jobs to and remove jobs from views (add-job-to-view, remove-job-from-view).
+ (issue 23361)
-
- In this release only the background is changed until Dec 5th to i387 chip,
- to celebrate our 1.387 release (the feature is time bombed and will revert
- to the butler after that date.)
-
-
-
- -
- Support CSRF protection when submitting results of an external job.
- (issue 7961)
-
-
- Allow build to start when polling interval is shorter than quiet period and
- we need a workspace for polling.
- (issue 8007)
+ UI improvements / refreshing.
+ (issue 23492)
-
- Fix escaping of some special characters when passing properties to Ant on Windows.
- (issue 7657)
+ Failed to correctly resave a project configuration containing both a forward and a reverse build trigger.
+ (issue 23191)
-
- Check poll_scm_threads.
-
-
- "Retain long standard output/error" option could not be checked when
- configuring a job.
- (issue 7562)
-
-
- Build number in Build History status was off-by-one.
- (issue 7973)
-
-
- Check whether the name of ToolInstlation is not null.
- (issue 8088)
-
-
- Prevent AbstractMethodError because of new method in Queue.Executor interface.
- (issue 8033)
-
-
- View "Delete" permission was not checked properly for showing link.
- (issue 7605)
-
-
- Fix javascript error in IE for some UI elements, such as one used by copyartifact plugin.
- (issue 6756)
+ Long log output resulted in missing Console link in popup.
+ (issue 14264)
+
-
+ HTTP error 405 when trying to restart ssh host.
+ (issue 23094)
+
-
+ Move 'None' Source Code Management option to top position.
+ (issue 23434)
-
- Fix serialization of array containing null elements.
- (issue 8006)
+ Fixed
NullPointerException
when ArctifactArchiver
is called for a build with the undefined status.
+ (issue 23526)
-
- Update bundled subversion plugin to version 1.20 and ssh-slaves to version 0.14.
+ Allow disabling use of default exclude patterns in
ArctifactArchiver
(.git, .svn, etc.).
+ (issue 20086)
+ -
+ Fixed
NullPointerException
when "properties" element is missing in a job's configuration submission by JSON
+ (issue 23437)
-
+
- - Oops, same as 1.384
+
-
+ Jenkins can now kill Win32 processes from Win64 JVMs.
+ (issue 23410)
+
-
+ Allow custom security realm plugins to fire events to
SecurityListener
s.
+ (issue 23417)
+ -
+ Recover gracefully if a build permalink has a non-numeric value.
+ (issue 21631)
+
-
+ Fix form submission via the Enter key for Internet Explorer version 9.
+ (issue 22373)
+
-
+ When Jenkins had a lot of jobs, submitting a view configuration change could overload the web server, even if few of the jobs were selected.
+ (issue 20327)
-
+
-
- JDK download for auto installation was not honoring the proxy setting.
- (issue 7327)
+ Fixed JNLP connection handling problem
+ (issue 22932)
-
- Fixed the "Not in GZIP format" error when archiving site / copying files / etc.
- (issue 7745)
+ Fixed
NullPointerException
caused by the uninitialized ProcessStarter
environment in build wrappers
+ (issue 20559)
+ -
+ Support the range notation for pagination in API
+ (issue 23228)
-
- Fixed garbled node description.
- (Hudson-ja)
+ Incorrect redirect after deleting a folder.
+ (issue 23375)
-
- Fixed 404 Not Found error when downgrade buttons are clicked.
- (issue 7988)
+ Incorrect links from Build History page inside a folder.
+ (issue 19310)
+
-
+ API changes allowing new job types to use SCM plugins.
+ (issue 23365)
-
- Label expression textbox for "Restrict where this project can be run" now
- provides autocompletion suggestions.
+ API changes allowing to create nested launchers (
DecoratedLauncher
)
+ (issue 19454)
-
+
+ -
+ Fixed a reference counting bug in the remoting layer.
+ (commit)
+
-
+ Avoid repeatedly reading symlinks from disk to resolve build permalinks.
+ (issue 22822)
+
-
+ Show custom build display name in executors widget.
+ (issue 10477)
+
-
+ CodeMirror support for shell steps broke initial configuration.
+ (issue 23151)
+
-
+ Jenkins on Linux can not restart after plugin update when started without full path to java executable
+ (issue 22818)
+
-
+ Fixed
NullPointerException
when a build triggering returns null cause
+ (issue 20499)
+ -
+ Fixed
NullPointerException
on plugin installations when invalid update center is set
+ (issue 20031)
+ -
+ Use DISABLED_ANIME icon while building a disabled project
+ (issue 8358)
+
-
+ Process the items hierarchy when displaying the Show Poll Thread Count option
+ (issue 22934)
+
-
+ Compressed output was turned on even before Access Denied errors were shown for disallowed Remote API requests, yielding a confusing error.
+ (issue 17374)
+ (issue 18116)
+
-
+ Properly close input streams in
FileParameterValue
+ (issue 22693)
+ -
+ Incorrect failure age in the JUnit test results
+ (issue 18626)
+
-
+ Fixed deletion links for JVM Crash error logs
+ (issue 22617)
+
-
+ Distinguish "nodes for label offline" from "no nodes for label"
+ (issue 17114)
+
-
+ Add causes to queue item tool tip
+ (issue 19250)
+
-
+ RPM: added JENKINS_HTTPS_KEYSTORE and JENKINS_HTTPS_KEYSTORE_PASSWORD options to Jenkins sysconfig file
+ (issue 11673)
+
-
+ RPM: Do not install jenkins.repo file
+ (issue 22690)
+
-
+ Don't advertise POSTing config.xml on master
+ (issue 16264)
-
- Fix security issue where a user with job configure permission could obtain
- admin permission for their session.
- (issue 7256)
-
-
- Build wrappers can now decorate the launcher or logger for matrix builds.
- (issue 7868)
-
-
- Fixed a bug where non-existent optional dependencies can result in a cascading load failure.
-
-
- Added extension point to allow plugins to add global filters to console
- log streams.
-
-
- Calculate "Estimated remaining time" for incremental Maven builds based on
- the modules which are actually being build.
- (issue 6544)
+ Handle null parameter values to avoid massive executor deaths
+ (issue 15094)
+
-
+ Added an option to archive artifacts only when the build is successful
+ (issue 22699)
-
+
- -
- Recognize initialization tasks from plugins.
- (issue 5427)
-
-
- Hudson was failing to report error messages in several situations during a build.
-
-
- UI for tying jobs to labels wasn't shown in some situations.
+
-
+ Configurable case sensitivity mode for user IDs.
+ (issue 22247)
+
-
+ Extension point for project naming strategies did not work from actual plugins.
+ (issue 23127)
+
-
+ Introduce directly modifiable views
+ (issue 22967)
+
-
+ Jenkins cannot restart Windows service
+ (issue 22685)
-
+
- -
- Fixed a race condition.
-
-
- Fixed issue with LabelAxis longer than 30 characters causing failures when saving matrix job configuration.
- (issue 7500)
-
-
- Improved packet fragmentation in Winstone when writing out HTTP responses.
-
- Extension Point to provide alternate UI for Project Views implemented
- (issue 1467)
+
-
+ Misleading error message trying to dynamically update a plugin (which is impossible) on an NFS filesystem.
+ (issue 12753)
+
-
+ Updated component used by the swap space monitor to better support Debian and AIX.
+
-
+ SSH slave connections die after the slave outputs 4MB of stderr, usually during findbugs analysis
+ (issue 22938)
+
-
+ Polling no longer triggers builds (regression 1.560)
+ (issue 22750)
+
-
+ Allow markup formatter to be selected without enabling security.
+ (issue 22028)
+
-
+ Fixed localization of build environment variable help.
+ (issue 22867)
-
+
- -
- Safe restart was not working since 1.376
-
-
- Don't let help icons get keyboard focus. This improves the keyboard navigability of the configuration page.
-
-
- Debug message crept into the production code in 1.379.
- (issue 7662)
-
-
- Fixed an AbstractMethodError in the UI with plugins (such as batch task.)
- (issue 7546)
-
-
- Add "proxy compatible" option to default crumb issuing algoritm
- (issue 7518)
+
-
+ Improve list view performance on large instances with folders.
+ (issue 22720)
+
-
+ Add indicator when build queue is filtered.
+ (issue 22698)
+
-
+ Update bundled Matrix project plugin to 1.2 fixing issues introduced in 1.561.
+ (issue 22879,
+ issue 22798)
-
+
- -
- Fixed a pipe clogging problem that can result in a hanging build.
- (issue 5977,
- issue 7572)
-
-
- Fixed a possible NPE in computing dependency changes.
-
-
- Fixed the malformed HTTP request error recovery behavior in Winstone.
- (issue 7201)
-
-
- When checking module descendant relationships, SCM changelog paths were using system file separators while module paths were always using /s.
- (issue 7611)
-
-
- Hudson was creating multiple instances of PageDecorators, resulting in data consistency problem.
- (report)
+
-
+ Memory exhausion in remoting channel since 1.560.
+ (issue 22734)
+
-
+ Configurable size for log buffer.
+ (issue 22840)
+
-
+ Gesture to clear log buffer.
+ (issue 22839)
-
- Fixed a possible AbstractMethodError
- (issue 7546)
-
-
- Supported failsafe reports for the Maven2 job type.
- (issue 4229)
+ Prevent up to two-minute delay before scheduling jobs from a cron trigger.
+ (pull request 1216)
+
-
+ Occasional attempts to delete a build during log rotation which had already been deleted.
+ (issue 22395)
+
-
+ Again show proper display names for build parameters.
+ (issue 22755)
-
+
- -
- Improving the master/slave communication to avoid pipe clogging problem.
- (issue 5977)
-
-
- Rolling back to Ant 1.8.0 due to bug in Ant 1.8.1 file copy with large files.
- (issue 7013)
-
-
- Multiple fingerprints and "redeploy artifacts" links are added to M2 builds when multiple forked lifecycles are invovled.
-
-
- Computation of the module build time in the m2 job was incorrect when multiple forked lifecycles are involved.
-
-
- Standardized logic for determining alternate settings file location in Maven projects for POM parsing and actual Maven execution.
- (issue 4963)
-
-
- Side effect from earlier fix of issue 7300 - some help files were linking to a now-moved file in SVN directly. Those are all changed to relative paths now.
-
- BuildWrapper teardowns could not get result of build for Maven2 projects.
- (issue 6033)
-
-
- Properly handle incremental builds of Maven projects using relative paths to modules.
- (issue 5357)
-
-
- Setting of MAXOPENFILES was not reflected in the debian init script.
- (issue 5721)
-
-
- Do not expose static resources under WEB-INF to clients
- (issue 7457)
-
-
- Console annotations are added to highlight warnings/errors in Maven
-
-
- If a polling initiated a build, capture its log to the build.
-
-
- Added a new extension point to prolong the quiet down period programmatically.
-
-
- Added a new extension point to make the ping behaviour customizable.
- (issue 5249)
-
-
- Added a new classloader ("a la" child first for plugin)
- (issue 5360)
+ Next build link was not reliably available from a previous build after starting a new one.
+ (issue 20662)
+
-
+ Debian postinst: check for present user/group before adding them.
+ (issue 22715)
+
-
+ Add distance between time tick labels on load statistics.
+ (issue 22686)
+
-
+ Correctly show load statistics for master node.
+ (issue 22689)
+
-
+ Make load statistics graph font configurable, use sans serif font by default.
+ (issue 22688)
+
-
+ Add links to nodes on thread dump page for easier navigation.
+ (issue 22672)
-
+
-
- Moved nulling out of buildEnvironments to cleanUp, so that node variables are available in Publishers.
- (issue 5925)
-
-
- Fixed a persistence problem in the label properties.
- (issue 7378)
-
-
- Fixed a problem in saving configuration for matrix projects with multiple label axes.
- (issue 7281)
-
-
- Fixed French localization problem.
- (issue 6003,
- issue 7404)
+ Fixed a corner case handling of tool installation.
+ (issue 16846)
-
- Matrix project now supports custom workspace.
- (issue 5077)
-
-
- Queue/execution model is extended to allow jobs that consume multiple executors on different nodes.
-
-
-
+ Enabled log rotation on the OSX package
+ (issue 15178)
-
- Error in some remote API requests since 1.373.
- (issue 7299)
+ When measuring the length of the queue, jobs that consist of multiple subtasks should
+ count as more than 1.
+ (pull request 742)
+
-
+ Close drop-down button menu when clicking outside
+ (issue 17050)
-
- Fixed RSS of each user's "last builds only" are not found.
- (issue 7384)
+ RunParameter with filtering enabled incorrectly includes builds which have not yet completed
+ (issue 20974)
-
- Handle initialization problem more gracefully
- (issue 7380)
+ Fixed NPE if RunParameterValue points to a stable build.
+ (issue 20857)
-
- A matrix build configuration page with multiple nodes/labels was broken since 1.373.
- (issue 7281)
-
-
- Added downgrade support for the core and plugins.
-
-
-
+ Fixed a JavaScript problem in sortable table with IE8.
+ (issue 21729)
-
- CLI login did not work for about half of the CLI commands (those defined via @CLIMethod annotation).
- (issue 6628)
+ More efficient deletion of old builds (specified by date).
+ (issue 22607)
+
-
+ The matrix project type was moved into its own plugin.
-
- Add escaping for comma character for Ant properties on Windows.
- (issue 2149)
+ Linkage errors in notifiers could leak workspace leases.
+ (issue 21622)
-
- Small update to empty Ant properties on Windows fix from 1.374, now also working for two consecutive empty properties.
- (issue 7204)
+ Better correction of the anomalous condition that several builds of a job specify the same number.
+ (issue 22631)
-
- Fixed a possible race condition during Hudson start up.
-
-
- Improved the memory consumption when used with LDAP.
-
-
- Improved console annotations for Ant.
-
-
- (Internal) ConsoleNotes can now inject its associated CSS.
-
-
-
+ Under certain conditions, a running build could mistakenly be shown as completed (and failed), while still producing output.
+ (issue 22681)
-
- Unable to add empty Ant properties on Windows since 1.370.
- (issue 7204)
-
-
- Maven2 projects now pick up Flexmojo test results automatically.
- (issue 6893)
-
-
- Auto-completion can be now easily added to text boxes by plugins.
+ Fix a bug which only showed the first detail part for radio buttons.
+ (issue 22583)
-
- Non build modules in incremental Maven builds are now set to NOT_BUILD at the beginning of the build, already.
+ Update version of bundled Mailer plugin to 1.8 to avoid issues with older versions
-
- Plugins can now transform the console output.
- (issue 7112)
+ Show larger load statistics graphs.
+ (issue 22674)
-
- Administrator can unpin plugins that are pinned.
+ Linebreak project names less aggressively.
+ (issue 22670)
-
- Memory footprint reduction with fingerprints.
-
-
- Added "This build is disabled" on Matrix project when it disabled.
- (issue 7266)
-
-
-
- -
- Fixed a config page regression in the matrix project.
- (issue 7213)
+ Added a new extension point for more pluggable JNLP slave handling
-
- Ant target annotation should allow colon in the target name.
- (issue 7026)
+ Don't ask for confirmation when it doesn't make any sense.
+ (issue 21720)
-
- Fixed a 1.372 regression in handling whitespace and other characters in label names.
- (issue 7216)
-
-
- Allow use of username/password parameters for CLI when using LDAP authentication.
- (issue 6628)
+ Jenkins asks for confirmation before leaving form even though user is not authorized to make changes.
+ (issue 20597)
-
- Axes in multi-configuration projects are now extensible.
+ Make the computers monitor status row look different from regular node rows.
+ (pull request 1095)
-
- Multi-configuration projects now allow multiple label/node axes.
+ Do not offer "Install without restart" for plugin updates.
+ (pull request 1125)
-
- Improved the layout algorithm of the matrix project visualization.
- (patch)
+ Require POST on more actions.
+ (pull request 877)
-
- JUnit report archiving now captures stdout of tests run in Surefire.
- (issue 4158)
+ Optimize image sizes.
+ (pull request 648)
+
-
+ Properly close resources in case of exceptions.
+ (pull request 737)
-
- Updated bundled ssh-slaves plugin to version 0.13.
+ Fix warning on JBoss AS7 due to unnecessary xpp3_min dependency.
+ (pull request 733)
+
-
+ Return queue item location when triggering buildWithParameters.
+ (issue 13546)
-
+
- -
- Persist matrix-based security settings in a consistent order
- (issue 7138)
-
- Jobs can now use boolean expression over labels to control where they run.
-
-
-
- -
- A security hole in CLI command implementations enable unauthorized users
- from executing commands.
- (SECURITY-5)
-
-
-
- -
- Added escaping of special characters when passing properties to Ant on Windows.
- (issue 7108)
-
-
- Workaround issue in IBM JVM causing intermittent ClassNotFoundExceptions.
- (issue 5141)
+ Enforcing build trigger authentication at runtime by checking authentication associated with a build, rather than at configuration time.
+ For compatibility, enforcement is skipped by default; you must install the Authorize Project plugin or similar for this to take effect.
+ The “upstream pseudo trigger” was also removed in favor of a true trigger configured on the downstream project;
+ you may use either the post-build action or the trigger according to where you want this configuration stored, and who is authorized to change it.
+ (issue 16956)
-
- Fixed a memory leak in Winstone
- (issue 5119)
+ Fixed NPE from view new job name autocompletion since 1.553.
+ (issue 22142)
+
-
+ Deadlocks in concurrent builds under some conditions since 1.556.
+ (issue 22560)
-
- Updated bundled cvs plugin to version 1.2.
+ JNLP slaves are now handled through NIO-based remoting channels for better scalability.
-
- Incorporated community contributed translations in Korean and Dutch.
-
-
-
- -
-
X-Hudson
header not being sent in 1.368.
- (issue 7100)
- -
- NPE on build after incremental Maven builds are aborted.
- (issue 6429)
-
-
- On-demand slaves would launch even when "only for tied jobs" is set.
- (issue 7054)
-
-
- Fix links to ant targets in console output view that were added in 1.367.
- (issue 7041)
-
-
- Avoid error with invalid or null primary view, such as in upgrade from older Hudson.
- (issue 6938)
+ Integrated codemirror v2.38.
+ (issue 22582)
-
- Support LogRotator deletion of old artifacts in multiconfiguration projects.
- (issue 6925)
+ Listing plugins shortly after installation throws ConcurrentModificationException.
+ (issue 22553)
-
- Build queue was not saved in safeRestart or safeExit.
- (issue 6804)
+ Fixed NoSuchMethodException when destroying processes using JDK1.8.
+ (issue 21341)
-
- CLI can now work with a reverse proxy that requires BASIC auth.
- (issue 3796)
-
-
-
+ Avoid irrelevant job queing while node is offline.
+ (issue 21394)
+ -
+ Debian package now creates 'jenkins' group
+
-
+ Suppress fingerprint link if fingerprint record isn't available.
+ (issue 21818)
-
- Make /buildWithParameters support remote cause and user supplied cause text
- for build via authentication token, just as /build does.
- (issue 7004)
+ Job hangs if one of multiple triggered builds was aborted
+ (issue 21932)
-
- Auto install of JDK when master/slave are different platforms would fail.
- (issue 6880)
+ Don't submit form on Save after Apply in new window on some browsers.
+ (issue 20245)
-
- Modified to work with Tomcat 7.
- (issue 6738)
+ Remotely triggered builds now show correct IP address through proxy.
+ (issue 18008)
-
+
+ -
+ Slaves connected via Java Web Start now restart themselves when a connection to Jenkins is lost.
+ (issue 19055)
-
- Safe restart made Hudson unresponsive until all running jobs complete, since 1.361.
- (issue 6649)
-
-
- Plugins with dependencies show wrong description on installed plugins page.
- (issue 6966)
-
-
- Fix redirect after login when return URL has characters that need encoding.
- (issue 6960)
+ Fixed NPE from
Slave.createLauncher
.
+ (issue 21999)
-
- <input type='hidden'> field shouldn't be getting the plain text password value.
-
-
- Added a mechanism to register CLI option handler as an extension point.
-
-
- Added a CLI command 'set-build-result' that can be used from inside a build to set the build status.
-
-
- Show outline structure for Ant execution in the console output view.
-
-
- Remote API now supports the 'tree' filter query parameter which is more efficient and easier to use.
- (issue 5940)
+ Faster rendering of views containing many items.
+ (issue 18364)
-
+
- -
- Fixed a possible security issue where a malicious user with the project
- configuration access can trick Hudson into leaking the proxy password,
- if Hudson is configured with a proxy with username/password.
- (SECURITY-3)
-
-
- Delete contained module builds when a maven project build is deleted, to avoid
- orphaned builds which can then affect the displayed result of a prior build.
- (issue 6779)
-
-
- Hide some sidepanel links that should not be shown in user-private views.
- (issue 6832)
+
-
+ Cron-style trigger configuration will now display expected prior and subsequent run times.
-
- Fix for file parameters that are copied to a subdirectory of the workspace.
- (issue 6889)
+ Incorrect filtering of build queue and executors widgets after 1.514.
+ (issue 20500)
-
- File parameters uploaded via the CLI are now displayed correctly on the build Parameters page.
- (issue 6896)
+
NoSuchMethodError: hudson.model.BuildAuthorizationToken.checkPermission(…)
from Build Token Root plugin since 1.556.
+ (issue 22382)
+ -
+ Allow a
Trigger
to be a DependencyDeclarer
.
+ (issue 22397)
-
- Allowed file parameters to be downloaded even when the name contains URL-unfriendly characters.
- (issue 6897)
+ Fixed a slow down in resource loading caused by fix to JENKINS-18677.
+ (issue 21579)
-
- Fixed a garbage in the raw console plain text output.
- (issue 6034)
+ jenkins.war file shouldn't be exploded into /tmp
+ (issue 22442)
-
- "Hudson is loading" page didn't take the user back to the same page.
+ Fixed NPE in UserCause
+ (issue 21875)
-
- Hudson can now remotely install JDK on Windows slaves when connecting via the
- "Let Hudson control this Windows slave as a Windows service" mode.
-
-
- The "Let Hudson control this Windows slave as a Windows service" mode now allows the same Windows slave
- to be used by multiple Hudson masters.
-
-
-
+ Added RobustMapConverter
.
+ (issue 22398)
-
- Fixed a critical security problem. See the advisory for more details.
-
-
-
- -
- Fixed a race condition where a queued build may get executed multiple times.
- (issue 6819)
+ JNLP slaves now satisfies stricter requirements imposed by JDK7u45.
+ (issue 20204)
-
- Some UI labels related to JUnit results were shown in the wrong locale.
- (issue 6824)
-
-
- BuildWrappers can now contribute build variables.
- (issue 6497)
+ Fixed NPE executing Pipe.EOF with ProxyWriter
+ (issue 20769)
-
+
-
- Fix queue handling to close locking gap between removing job from queue and starting build,
- to prevent unintended concurrent builds (refactor of change first made in 1.360).
- (report)
+ Fixed ArrayIndexOutOfBoundsException in XStream with Oracle JDK8 release version
+ (issue 18537)
-
- Allow multiple dependencies between same two projects, as they may trigger under
- different conditions and with different parameters.
- (issue 5708)
+ Corrected permission checks for
copy-job
and create-job
CLI commands.
+ (issue 22262)
-
- Timeline on build trend page should use server timezone instead of always GMT.
- (issue 6692)
+
identity.key
, used to secure some communications with Jenkins, now stored encrypted with the master key.
-
- Don't mask the cause of the checkout related exception.
+ When dynamically loading a plugin which another loaded plugin already had an optional dependency on, class loading errors could result before restart.
+ (issue 19976)
-
- "who am I?" page should be visible to everyone.
+ Memory leaks in the old data monitor.
+ (issue 19544)
-
- Avoid pointless and harmful redirection when downloading slave.jar.
- (issue 5752)
+ Ability for custom view types to disable automatic refresh.
+ (issue 21190)
+ (issue 21191)
-
- Cache downloaded JDKs.
+ Option to download metadata directly from Jenkins rather than going through the browser.
+ (issue 19081)
-
- Reinstall a JDK when a different version is selected.
- (issue 5551)
-
-
- Integrated community-contributed translations (Germany, Greek, Spanish, Finnish, Hungarian, Italian, Japanese, French,
- Russian, Slovenian, Dutch, Traditional Chinese, Swedish, Ukrainian, and Portuguese.)
-
-
- Upgraded bundled Ant to version 1.8.1.
- (issue 6562)
+ Allow JDK8 (and other versions) to be downloaded by JDKInstaller correctly.
+ (issue 22347)
-
+
- -
- Restored optional container-based authentication for CLI.
- (issue 6587)
-
-
- Fix javascript error when a plugin uses an empty dropdownList, resulting in LOADING overlay being left up.
- (issue 6542)
-
-
- Add setting so job views may show only enabled or disabled jobs.
- (issue 6673)
-
- File parameters can now be downloaded from the build Parameters page.
- (issue 6719)
+ Access through API token and SSH key login now fully retains group memberships.
+ (issue 20064)
-
- Added an ability to point to different update sites.
+ API changes allowing more flexibility in unusual job types.
+ (issue 22131)
-
- Added a new extension point to plug in custom utility to kill processes.
-
-
- Added a proactive error diagnostics to look for a broken reverse proxy setup.
- (report)
+ Job can be reloaded individually from disk with "job/FOO/reload" URL or "reload-job" CLI command
-
+
-
- Fixed a bug where IE shows empty client cert dialog when connecting to HTTPS site run by Winstone.
- (report)
-
-
- "java -jar hudson.war" with AJP was broken.
- (issue 5753)
-
-
- Safe restart stopped working on protected Hudson since 1.359.
- (issue 6667)
-
-
- Parameterized jobs did not use configured quiet period.
- (issue 6660)
+ Jenkins should recover gracefully from a failure to process "remember me" cookie
+ (issue 11643)
-
- Fix form data conflict when fingerprinting is used with Promoted Builds plugin.
- (issue 6642)
+ Fixed Up link in matrix projects
+ (issue 21773)
+
+
+
-
- Avoid possible exception at startup when some plugins have optional dependencies.
- (issue 6435)
+ Archiving of symlinks as artifacts did not work in some cases.
+ (issue 21958)
-
- Add autocomplete="off" for LDAP managerDN and managerPassword fields.
- (issue 3586)
+ Slow rendering of directories with many entries in remote workspaces.
+ (issue 21780)
+
+
+
-
- Set a TCP timeout when slaves connect to the master.
- (issue 6262)
+ Build history widget only showed the last day of builds.
+ (Due to JENKINS-20892, even with this fix at most 20 builds are shown.)
+ (issue 21159)
-
- File parameter builds started with the CLI command no longer throw an NPE.
- (issue 4296)
+ Random class loading error mostly known to affect static analysis plugins.
+ (issue 12124)
-
- Workaround for bug in Glassfish Enterprise.
- (issue 6459)
+ After restarting Jenkins, users known only from changelogs could be shown as
First Last _first.last@some.org_
, breaking mail delivery.
+ (issue 16332)
-
- Ensure nested f:repeatable content does not inherit outer list when inner list is null.
- (issue 6679)
+ CLI
build -s -v
command caused 100% CPU usage on the master.
+ (issue 20965)
-
- Add two new permalinks to job pages: "Last unstable build" and "Last unsuccessful build".
+ Slave started from Java Web Start can now install itself as a systemd service.
-
- Allow the build number to be set so long as it's still bigger than the last build.
- (issue 4930)
-
-
- Copied jobs are now disabled until configuration is saved, so they don't start building before ready.
- (issue 2494)
-
-
- Reduced logging from jmDNS.
-
-
-
+ Split the “raw HTML” markup formatter out of core into a bundled plugin.
-
- A Java6 dependency had crept in in 1.359.
- (issue 6653)
+ Do not show Maven modules and matrix configurations in the Copy Job dialog.
+ (issue 19559)
-
- Workaround for bug in Glassfish Enterprise.
- (issue 6459)
-
-
- Added an extension point to control the assignment of tasks to nodes.
- (issue 6598)
+ Fix autocompletion for items in folders.
+ (pull request 1124)
-
+
-
- Accept latest JRockit JVM release as a compatible JVM.
- (issue 6556)
+ Fixed handling of default JENKINS_HOME when storing CLI credentials
+ (issue 21772)
+
-
+ Fixed broken action links on Label page
+ (issue 21778)
-
- Hudson now broadcasts itself in DNS multicast at "_hudson._tcp.local" to facilitate auto-discovery from other tools
+ Allow Actions to contribute to Labels' main page
+ (issue 21777)
+
-
+ Expensive symlink-related calls on Windows can be simplified.
+ (issue 20534)
-
- Added the "-block" option to the "quiet-down" CLI command so that the command will block until the system really quiets down.
+ Improve detection of broken reverse proxy setups.
-
+
+ -
+ Valentine's day security release that contains more than a dozen security fixes.
+ (security advisory)
+
-
+ Regression in Windows slaves since 1.547.
+ (issue 21373)
-
- Too much memory used by stdout/stderr from test results.
- (issue 6516)
-
-
- Fixed a memory leak in Winstone sessions.
- (issue 5119)
+ Using
java -jar jenkins-core.jar folder/external-monitor-job cmd …
did not work.
+ (issue 21525)
-
- Fix to handle usernames with colon character on Windows.
- (issue 6476)
+ Jenkins crash on startup after upgrade from 1.546 to 1.548.
+ (issue 21474)
-
- Fixed the port number handling problem in debian init script.
- (issue 6474)
+ f:combobox is narrow.
+ (issue 21612)
-
- Fix FilePath.getParent() handling of edge cases.
- (issue 6494)
+ The workspace cleanup thread failed to handle the modern workspace location on master, and mishandled folders.
+ (issue 21023)
-
- Fix css conflict introduced in 1.357 that caused missing data display in analysis plugins.
- (issue 6496)
-
-
- Support "optional=true" parameter for @Extension.
-
-
- Supported OpenSSL-style certificate/key file format with "java -jar hudson.war"
+ Fixed missing help items on "Configure Global Security" page
+ (issue 19832)
-
- If --httpsPort option is given without the certificate, run with a one-time self-signed certificate.
-
-
- Hudson shouldn't show a login error page unless the user really failed to login (think about when the user presses a back button.)
-
-
-
- -
- Maven builds abort unexpectedly due to a SocketTimeoutException on machine with poor resources.
- (issue 3273)
+ Sort groups on user index page alphabetically.
+ (issue 21673)
-
- Fix incorrect handling of ".." in paths with mix of / and \ separators since 1.349.
- (issue 5951)
-
-
- Javadoc publishing should not fail build if javadoc is already current.
- (issue 6332)
-
-
- Fix download of files/artifacts larger than 2GB.
- (issue 6351)
+ Should not be able to create a job named
.
(period).
+ (issue 21639)
+ -
+ Plugins implementing "AsyncPeriodicWork" can overwrite default logging level
+ (pull request #1115)
-
- Build page may not list all of the artifacts since 1.348.
- (issue 6371)
+ Wrong log message for out-of-order build record repair.
+ (issue 20730)
-
- Add workaround for Opera 10.52/53 bug causing error in saving job configuration.
- (issue 6424)
+ Existing Fingerprint Action is reused and not added a second time.
+ (issue 19832)
-
- Fix createSymlink problem on *nix systems that do not use GNUCLibrary since 1.356.
- (issue 6437)
+ TestObject doesn't replace '%' character
+ (issue 21707)
-
- Hide add/edit description link on test result pages when user does not have
- permission to submit a description.
-
-
- Changed permission required to set description on test result pages
- from Build Job to Update Run.
-
-
- Add "LOADING" overlay on global and job config pages until form is ready for use.
-
-
- Email recipient lists now support build parameters.
- (issue 6394)
-
-
- Make it easier to see the latest update jobs on the Update Center page.
- (issue 4255)
-
-
- Allow plugins to use forms with an onsubmit handler, and fix "no-json" handling.
- (issue 5927)
-
-
- Updated bundled subversion plugin to version 1.17.
+ "java -jar jenkins.war" should use unique session cookie for users who run multiple Jenkins on the same host.
-
+
-
- Fix StringIndexOutOfBoundsException in console log from UrlAnnotator.
- (issue 6252)
-
-
- Fixed potential deadlock between saving project config and getting project page.
- (issue 6269)
+ Report number of all jobs as part of usage statistics
+ (issue 21448)
-
- Fixed timeline display on build time trend page.
- (issue 6439)
+ Replace description in error dialog instead of appending
+ (issue 21457)
+
+
+
-
- Fixed garbled response of XML API if xpath is specified.
- (ja@hudson.dev.javanet)
+ Removing the "keep this build forever" lock on a build should require the DELETE permission.
+ (issue 16417)
-
- Fix broken links for stopping jobs in executor list on pages for slave nodes or filtered views.
+ Files added to zip archive are closed properly.
+ (issue 20345)
-
- Fixed NoSuchMethodError with Maven and Ivy plugins.
- (issue 6311)
+ Broken CSS when reloading Jenkins after a time of inactivity
+ (issue 17526)
-
- Extension points can be now sorted.
+ Add Batch Command tool installer for Windows nodes.
+ (issue 21202)
+
-
+ Allow more specific loggers to reduce log level.
+ (issue 21386)
-
+
+ -
+ API for adding actions to a wide class of model objects at once.
+ (issue 18224)
+
-
+ Added infrastructure for moving items into or out of folders.
+ (issue 20008)
+ (issue 18028)
+ (issue 18680)
-
- Colored ball image at top of build pages was broken for Hudson in some web
- containers (fixed by removing workaround for a Firefox bug fixed since 3.0.5/Dec2008).
- (issue 2341)
-
-
- Console page while build is running did not wrap lines when viewed in IE.
- (issue 5869)
-
-
- Fixed build history to indicate test failure for MavenBuild and MavenModuleSetBuild.
-
-
- Make dropdownList work in repeatable content, such as a build step.
-
-
- Fixed a bug where a job created via XML didn't properly receive upstream/downstream computation.
- (report)
+ Apply buttons did not work in Internet Explorer in compatibility mode.
+ (issue 19826)
+
-
+ Builds can seem to disappear from a job in a folder if that folder is renamed.
+ (issue 18694)
-
- Argument masking wasn't working correctly for commands run on slaves
- (report)
+
/login
offers link to /opensearch.xml
which anonymous users cannot retrieve.
+ (issue 21254)
-
- Added the slave retention strategy based on a schedule.
+ Added API class
SecurityListener
to receive login events and similar.
+ (issue 20999)
-
- Added to configure charset option of Mailer.
+ Option to hold lazy-loaded build references strongly, weakly, and more.
+ (issue 19400)
-
+
+ -
+ Split Windows slave functionality into its own plugin.
+
-
+ NPE since 1.545 when using aggregated test result publisher without specifying downstream jobs explicitly.
+ (issue 18410)
-
- POM parsing was still using the module root as the base for relative paths for alternate settings files.
- (issue 6080)
-
-
- Fix dynamic updates of build history table when CSRF protection is turned on.
- (issue 6072)
-
-
- Improved the error reporting mechanism in LDAP setting.
-
-
- Raw console output contains garbage.
- (issue 6034)
-
-
- Fixed a file handle leak in the slave connection.
- (issue 6137)
-
-
- Quiet period wasn't taking effect properly when doing parameterized builds.
+ Fixed Trend Graph NPE when there isn't any builds
+ (issue 21239)
-
+
+ -
+ Builds disappear after renaming a job.
+ (issue 18678)
-
- Tagging a repository can result in NPE.
-
-
- Fix possible form submission error when using multiple combobox elements.
- (issue 6025)
-
-
- Better escaping of test case names in test results pages.
- (issue 5982)
-
-
- Make radio buttons work in repeatable content, such as a build step.
- (issue 5028)
+ When clicking Apply to rename a job, tell the user that Save must be used instead.
+ (issue 17401)
+
-
+ Exception from XStream running Maven builds on strange Java versions.
+ (issue 21183)
-
- Fixed the handling of verifying that the POM path entered for Maven projects exists.
- (issue 4693)
-
-
- Added link to builds in buildTimeTrend
- (issue 3993)
+ When clicking Apply results in an exception (error page), show it, rather than creating an empty dialog.
+ (issue 20772)
-
+
-
- Fixed a file handle leak when a copy fails.
- (issue 5899)
-
-
- Replace '>' with '_' in username, as already done for '<'.
- (issue 5833)
-
-
- Fix editableComboBox to select item when mouse click takes more than 100ms.
- (issue 2722)
-
-
- Fixed NPE when configuring a view without "Regular expression".
+
CannotResolveClassException
breaks loading of entire containing folder, not just one job.
+ (issue 20951)
-
- Page shouldn't scroll up when the user opens/closes a stack trace in the test failure report.
+ Better robustness against XML deserialization errors.
+ (issue 21024)
-
- Fixed a bug where Hudson can put a wrong help file link.
- (report)
+ Minimizing disk I/O while loading the names of build records during Jenkins startup.
+ (issue 21078)
-
- Fixed Maven site goal archiving from slaves.
- (issue 5943)
-
-
- Fixed a regression with NetBeans Hudson plugin progressive console output.
- (issue 5941)
-
-
- Fixed a situation where a failure in plugin start up can prevent massive number of job loss.
-
-
- Supported JBoss EAP 5.0.0 GA.
- (issue 5922)
-
-
- CLI commands on protected Hudson now asks a password interactively, if run on Java6.
-
-
- Added CLI 'login' and 'logout' commands so that you don't have to specify a credential
- for individual CLI invocation.
-
-
- URLs in the console output are now hyperlinks.
-
-
- Improved the URL annotation logic.
-
-
- Add drag&drop support for f:repeatable lists and use this for
- the JDK/Ant/Maven installations in global config so these can be reordered.
-
-
- Integrated a new round of community-contributed localizations (ca, es, fi, fr, hi_IN, it, nl, ru, and sv_SE locales.)
-
-
-
- -
- Regression in 1.350 that can delete old build artifacts.
- (report)
+ Avoiding serializing the owning build as part of a test result action, as this can lead to errors later.
+ (issue 18410)
-
+
-
- Fix handling of relative paths in alternate settings.xml path for Maven projects.
- (issue 4693)
+ RingBufferLogHandler throws ArrayIndexOutOfBoundsException after int-overflow.
+ (issue 9120)
-
- Alternate settings, private repository, profiles, etc were not used in embedded Maven for
- deploy publisher.
- (issue 4939)
-
-
- Make editableComboBox work in repeatable content, such as a build step.
+ Hudson shows 0GB free space when space available drops below 1GB.
+ (issue 7776)
+
-
+ Added filter field for installed plugins tab.
+ (issue 20219)
-
- If content is captured using <j:set var="..">..content..</j:set>,
- fixed this to use proper HTML rendering when appropriate.
+
groovysh
command did not work in authenticated Jenkins instances.
+ (issue 17929)
-
- '<' and '&' in the console output was not escaped since 1.349
- (issue 5852)
-
-
- Fixed an AbstractMethodError in SCM polling under some circumstances.
- (issue 5756)
-
-
- Fixed a ClassCastException in the Subversion plugin - now using Subversion plugin 1.13.
- (issue 5827)
+ Avoid eagerly loading all builds when displaying lists of them (Build History and Build Time Trend UIs).
+ (issue 20892)
-
- The Maven Integration plugin link in the Update Center was going to a dead location.
- (issue 4811)
+ Error page should be visible even if the anonymous user does not have overall/read access.
+ (issue 20866)
-
- On RPM/DEB/etc installation, don't offer the self upgrade. It should be done by the native package manager.
- (report)
+ JavaScript errors when navigating away from a page with a build timeline widget while the timeline is loading.
+ (pull request 1041)
-
- Fixed a possible lock up of slaves.
-
-
- Added advanced option to LogRotator to allow for removing artifacts from old builds
- without removing the logs, history, etc.
- (issue 834)
-
-
- Authentication support in Hudson CLI.
- (issue 3796)
-
-
- Added console annotation support to SCM polling logs.
+ Fixed a possible dead lock problem in deleting projects.
+ (issue 19446)
-
+
-
- Fix deserialization problem with fields containing double underscore.
- (issue 5768)
+ HTML metacharacters not escaped in log messages.
+ (issue 20800)
+
+
+
-
- Fix deserialization problem for Exception objects where the XML has bad/old data.
- (issue 5769)
+ Improved error diagnosis for jzlib deflate problem.
+ (issue 20618)
-
- Fix serialization problem with empty CopyOnWriteMap.Tree.
- (issue 5776)
+ Improved error diagnosis for CLI stream corruption.
+ (issue 18058)
-
- Fixed a bug that can cause 404 in the form validation check.
-
-
- Remote build result submission shouldn't hang forever even if Hudson goes down.
-
-
- Added a monitor for old or unreadable data in XML files and a manage screen to assist
- in updating files to the current data format and/or removing unreadable data from plugins
- that are no longer active. "Manage Hudson" page will show a link if any old/unreadable
- data was detected.
-
-
- Added a mechanism to bundle init.groovy inside the war for OEM.
- (report)
-
-
- Added an extension point to annotate console output.
- (issue 2137)
+ Don't hold off building until saved for jobs copied from CLI.
+ (issue 20744)
+
-
+ Allow build queue and executor status panes to be collapsed.
+ (issue 5622)
+
-
+ Jenkins 1.540 just doesn't boot on Windows at all.
+ (issue 20630)
-
+
-
- Fixed a performance problem of the job/build top page when there are too many artifacts.
+ Add option to create view by copying an existing one.
+ (issue 13978)
-
- Improved /etc/shadow permission checks.
-
-
-
+ Introduced the boot failure hook script that gets executed when Jenkins fails to start.
+ (issue 20609)
-
- Fix javascript problem showing test failure detail for test name with a quote character.
- (issue 1544)
+ Fixed "java.lang.NoClassDefFoundError: JarURLConnection" on OpenJDK
+ (issue 20163)
-
- Hudson can incorrectly configure labels for the master when bleeding edge EC2 plugin is used.
+
FileAlreadyExistsException
upon “deleted” symlink while (re)creating it.
+ (issue 20610)
-
- Fixed the regression wrt the whitespace trimming caused by 1.346.
- (issue 5633)
+ Allow background tasks to run simultaneously, preventing task blockage.
+ (issue 19622)
-
- Under some circumstances, Hudson can incorrectly delete the temporary directory itself.
- (issue 5642)
-
-
- Newlines in MAVEN_OPTS environment variable can cause problems in other contexts.
- (issue 5651)
-
-
- Improved the form validation mechanism to support multiple controls.
- (issue 5610)
-
-
- Added message to slave log when it has successfully come online.
- (issue 5630)
+ Fixed failed tests displaying as Yellow in JUnit history plot
+ (issue 7866)
-
+
-
- Maven modules should not be buildable when the parent project is disabled.
- (issue 1375)
-
-
- Fixed the broken quiet period implementation when polling interval is shorter than
- the quiet period. (Changes in SCM impls are needed for this to take effect.)
- (issue 2180)
+ CLI over HTTP was not working since 1.535.
+ (issue 20128)
-
- Escape username in URLs in case it contains special characters such as "#".
- (issue 2610)
+ hudson appears in a the webpage title.
+ (issue 14380)
-
- Fix sidepanel link for People to be visible and show view-specific info when appropriate.
- (issue 5443)
+ Linkage error in
InitializerFinder.discoverTasks
blocks startup.
+ (issue 20442)
+ -
+ Add Test button to check proxy connection
+ (issue 20191)
+
-
+ Collect and report JVM crash dump files to assist trouble-shooting
-
- Improved HTML rendering, not using closing tags that do not exist in HTML.
- (issue 5458)
+
ClassCastException
s sometimes shown from views set to be recursive.
+ (issue 20415)
+ -
+ Show different “up” link for jobs in folders.
+ (issue 20106)
+
-
+ Add log handling line beginning with 'file://' as URL.
+ (issue 19866)
+
-
+ Builds of a concurrently executable job might end up colliding on the same workspace.
+ (issue 10615)
-
- Show better error message for missing view type selection when creating a view.
- (issue 5469)
+ Fixed error during installation of .deb package (/var/run/jenkins doesn't exists)
+ (issue 20407)
-
- Hudson wasn't properly streaming a large external build submission,
- which can result in OOME and unresponsiveness.
+ Global search box now remembers entered text
+ (issue 18192)
-
- Use fixed-width font in text area for shell/batch build steps.
- (issue 5471)
+ Add extension point to allow plugins to contribute to the checking of
+ assigned labels.
+ (issue 20514)
+
-
+ Fixed issue where CLI required giving Overall read permission to anonymous.
+ (issue 8815)
+
-
+ Jar cache option wasn't taking effect on JNLP slaves.
+ (issue 20093)
+
-
+ Interrupting remote class loading can lead to NoClassDefFoundError: Could not initialize class.
+ (issue 19453)
-
- Use user selected icon size on People page.
- (issue 5447)
+ Name channel executor threads for better diagnosability.
+ (issue 19004)
-
- Speed/footprint improvement in the HTML rendering.
+ Better diagnosability for remoting StreamCorruptedException
+ (issue 8856)
-
+
- -
- Update center retrieval, "build now" link, and real-time console update was broken in 1.344.
- (issue 5536)
-
-
- Fixed the backward incompatibility introduced in JENKINS-5391 fix in 1.344.
- (issue 5391)
+
-
+ Core started relying on Java6 API, completing Java5 -> Java6 migration.
+ (discussion)
+
-
+ Adding a batch of contributed localization from the community.
-
+
+ -
+ Disabled, aborted, and not-build status now has different image names to allow
+ themes to use different icons.
+ (issue 19438)
+
-
+ Ask for confirmation if an user tries to leave an edited configuration page.
+ (issue 19835)
+
-
+ Test failure summary appearance is improved.
+ (issue 19884)
+
-
+ Added CLI commands that manipulate views
+ (issue 19996)
+
-
+ Improved the /cli help screen.
+ (issue 20023)
-
- Removed the forced upper casing in parameterized builds.
- (issue 5391)
+ Polling-triggered jobs get scheduled en-mass on start-up if slaves aren't online yet.
+ (issue 8408)
-
- Password parameter on the disk should be encrypted.
- (issue 5420)
+ Fixed the handling of nested variable expansion.
+ (issue 20280)
-
- Duplicate entries on Upstream/Downstream project with "Build modules in parallel".
- (issue 5293)
+ NPE thrown from CLI
build
command under some circumstances.
+ (pull request 979)
-
- "Projects tied on" should be "Projects tied to".
- (issue 5451)
+ Fixed a bug in the compatibility transformer (since 1.527) that causes VerifyError in Ivy plugin and possibly others.
+ (issue 19383)
-
- Fixed the bug that prevents update center metadata retrieval in Jetty.
- (issue 5210)
+ Pass full list of all possible jobs to ViewJobFilter when recurse option is set
+ (issue 20143)
-
- Show which plugins have already been upgraded in Plugin Manager.
- (issue 2313)
+
get-job
and update-job
CLI commands can now work with folders, or indeed any AbstractItem
.
+ (issue 20236)
-
- Show Hudson upgrade status on manage page instead of offering same upgrade again.
- (issue 3055)
+ Added API allowing plugins to hide entries from the context menu even while they appear in the sidepanel.
+ (issue 19173)
+
+
+
+
+ -
+ Upgrade bundled plugin versions: ssh-slaves to 1.5, and credentials to 1.9.1
+ (issue 20071)
+
-
+ Build button column was broken in 1.535 for parameterized builds.
+ (issue 20080)
+
-
+ Miscalculation of environment variables caused some binaries (such as
ssh
) to not be found.
+ (issue 19926)
-
- Make badges in build history line up.
- (report)
+ Extension point for secure users of REST APIs (permitting JSONP and primitive XPath).
+ (issue 16936)
+
-
+ “Run a build” link in page shown when no workspace existed for a job was not functional; unlinking.
+
-
+ Integer overflow could cause JavaScript functions to break in long-running Jenkins processes.
+ (issue 20085)
+
-
+ Reverted the JENKINS-18629 fix in 1.536 as it causes various regressions in plugins.
+ (issue 20262)
-
+
-
- Don't report a computer as idle if it running the parent job for a matrix project.
- (issue 5049)
+ Fixed two file descriptor leaks.
+ (issue 14336)
-
- Improve error message for a name conflict when renaming a job.
- (issue 1916)
+ RuntimeException if you try to save a config with a choice parameter that has no choices.
+ (issue 18434)
-
- Job description set via the remote API was not saved.
- (issue 5351)
+ 1.534 made ZIP downloads of artifacts work again, but missing a base directory inside the ZIP.
+ (issue 19947)
+
-
+ Stapler error saving certain kinds of configuration.
+ (issue 18629)
+
-
+ Upgrade Trilead SSH client library to version that does not cause connection loss when
+ there is a lot of logging on the build slave and the performance improvements in
+ ssh-slaves 0.27+ are enabled (
+ issue 18836,
+ issue 18879,
+ issue 19619)
+
-
+ Upgrade bundled iplugin versions: ssh-slaves to 1.4, ssh-credentials to 1.5.3 and
+ credentials to 1.8.3
+ (issue 19945)
+
-
+ Executor threads are now created only on demand.
+
+
+
-
- Work around a JVM bug on Windows that causes the "Access denied" error
- while creating a temp file.
- (issue 5313)
+ Windows JDK installer failed in a path with spaces.
+ (issue 19447)
-
- Fixed a NPE in the update center with the container authentication mode.
- (issue 5382)
+ Windows JDK installer should not install a public JRE.
+ (issue 8957)
+
-
+ After deleting last build, next build of last build is zombie.
+ (issue 19920)
+
-
+ Split matrix authorization strategies into an independent plugin.
+
-
+ UI Samples plugin fully separated from core. To view samples during plugin development or at any other time, just install from the update center.
-
- Global MAVEN_OPTS for Maven projects wasn't getting loaded properly for configuration.
- (issue 5405)
+ View description should be clearly separated from the Jenkins system message.
+ (issue 18633)
-
- Fix for parameterized project with choice parameter value that has < or > character.
- (report)
+ SCM polling sometimes broken since 1.527 due to a change in how environment variables are calculated.
+ (issue 19307)
-
- Build queue was showing some of the items in the wrong order — it should show new ones first and
- old ones later.
+ Breadcrumb bar moves away from header when scrolling past end of page on OS X.
+ (issue 19803)
+
-
+ "java -jar jenkins.war" now runs on Jetty8. Command line options are still compatible.
+ (issue 18366)
-
- Move form to adjust logging levels to its own page and include table of configured levels.
- (issue 2210)
+ "java -jar jenkins.war" gets the "--spdy" option to enable SPDY.
-
- Allow the administrator to control the host names via a system property "host.name" per slave,
- in case auto-detection fails.
- (issue 5373)
+ Expand all/Collapse all functionality for artifact tree view.
+ (pull request 616)
-
- Introduced a new extension point for test result parsers.
- (discussion)
+ Visualize queued jobs in view.
+ (pull request 531)
+
+
+
+ -
+ Default crumb issuer configurations saved in older releases did not load as of Jenkins 1.531.
+ (issue 19613)
+
-
+ As of 1.532 download of artifact ZIPs was broken.
+ (issue 19752)
+
-
+ Old copies of
maven3-agent.jar
on slaves were not being reliably updated, leading to errors.
+ (issue 19251)
+ -
+ Add option to disable "Remember me on this computer" checkbox in login screen.
+ (issue 15757)
+
-
+ Added postCheckout method for SCMs
+ (issue 19740)
+
+
+
-
- Data loading is made more robust in the face of linkage failures.
- (issue 5383)
+ Offer alternate error message for pattern-based project naming strategy.
+ (pull request 914)
+
+
+
+ -
+ Working around a GZip compression bug in jzlib affecting transfer of certain large, repetitive artifacts.
+ (issue 19473)
+
-
+ Lazy-loading bug: builds go missing.
+ (issue 19418)
+
-
+ (re)create build number->id symlink if missing when updating permalink.
+ (issue 19034)
-
- Auto-detect if Hudson is run in Solaris SMF
- and provide restart capability.
- (report)
+ Display the full display name in title for jobs and views.
+ (pull request 884)
+
-
+ Added a new extension point to control where archived artifacts get stored.
+ (issue 17236)
-
- Formalized an extension point to control priority among builds in the queue.
- (issue 833)
+ Use fine-grained permissions for node manipulation via REST API & CLI
+ (issue 18485)
+
-
+ Make the link to the aggregated test result from the project page work.
+ (issue 9637)
-
+
-
- Commands run on slaves (such as SCM operations) were not printed to the log
- the way they would be when run on master.
- (issue 5296)
-
-
- Downstream jobs could fail to trigger when using per-project read permissions.
- (issue 5265)
-
-
- Update lastStable/lastSuccessful symlinks on filesystem later in build process to avoid
- incorrectly updating links when build fails in post-build actions, and links briefly
- pointing to a build that is not yet complete.
- (issue 2543)
-
-
- Debian package no longer changes the permissions and owner of the jobs and .ssh directory.
- This is to improve upgrade speed and so that ssh works properly after upgrading.
- (issue 4047 and
- issue 5112)
-
-
- Automatic tool installation wasn't honoring proxy setting.
- (issue 5271)
+ Deleting an external run did not immediately remove it from build list, leading to errors from log rotation.
+ (issue 19377)
-
- Fixed a bug that induces a NPE during list view column construction.
- (issue 5061)
+ When copying a directory from master to slave fails due to an error on the slave, properly report it.
+ (issue 9540)
-
- Fixed a bug that can cause Hudson to fail to encode non-ASCII characters in URL.
- (issue 5155)
+ Identify user agent for Internet Explorer 11.
+ (issue 19171)
-
- Added "process-test-classes" phase to Maven intercepter.
- (issue 2226)
+ Since 1.518, fingerprint serialization broke when job or file names contained XML special characters like ampersands.
+ (issue 18337)
-
- Fixed a regression in the remote API in 1.341.
- (report)
-
-
- Improved error diagnostics when failing to auto install Maven/Ant.
- (issue 5272)
-
-
- Infer the default e-mail address more smartly with user IDs like "DOMAIN\user" (often seen in Windows)
- (issue 5164)
+ Robustness against truncated fingerprint files.
+ (issue 19515)
-
- The hudson.model.Run.ArtifactList.treeCutoff property should not limit the number
- of artifacts shown by the API.
- (issue 5247)
+ JavaScript error in the checkUrl computation shouldn't break the job configuration page.
+ (issue 19457)
-
- Spanish translation made a great progress.
+ Annotate the Advanced section if some fields are already customized.
+ (issue 3107)
+
-
+ No events fired when project is enable/disable or the description is changed
+ (issue 17108)
-
+
-
- Completed fix started in 1.325 for updating bundled plugins, now working when security is enabled.
- (issue 3662)
+ Send Maven agent JARs to slaves on demand, not unconditionally upon connection.
+ (issue 16261)
-
- TemporarySpaceMonitor and DiskSpaceMonitor fail to instantiate on fresh systems.
- (issue 5162)
+ Occasional race condition during startup.
+ (issue 18775)
+
-
+ Robustness against startup error for users of Global Build Stats plugin.
+ (issue 17248)
+
-
+ 404s from Javadoc and HTML Publisher plugins.
+ (issue 19168)
-
- /tmp space monitoring didn't work if /tmp is filled up completely.
-
-
- Plugins can now control how builds are triggered when they declare downstream jobs.
- (issue 5236)
-
-
- Hudson now detects a cyclic dependencies among plugins and report the error gracefully.
-
-
- Extension points can now contribute multiple actions.
+ Build number symlinks and permalinks not updated for Maven module builds.
+ (issue 18846)
+
+
+
-
- Responses to remote API calls now honor the "Accept-Encoding" header.
- (report)
+ With Apache Maven 3.1 build, logging configuration from the Apache Maven distribution is not used.
-
- Link to project changes summary instead of this build's changes for "still unstable" email.
- (issue 3283)
+ Avoid log duplication with Apache Maven 3.1 builds
+
-
+ Ungraceful handling of empty matrix project axes.
+ (issue 19135)
+
-
+ Updated Groovy to 1.8.9 to avoid GROOVY-4292.
+
-
+ CLI login command broken on Windows since 1.518.
+ (issue 19192)
+
-
+ A malformed JUnit result file should mark that test suite as a failure, but not interrupt archiving of other tests.
+ (issue 19186)
-
- SCM retry count and "Block build when upstream project is building" is now available on matrix projects.
- (report)
+ Build for $username now shows also build scheduled by user
+ (issue 16178)
-
+
+ -
+ Command line now supports "--sessionTimeout" option for controlling session timeout
-
- Non ASCII chars get mangled when a new user is created.
- (issue 2026)
+ Form validation methods weren't getting triggered when one of its dependency controls change.
+ (issue 19124)
-
- Fixed garbled mail text when default encoding is not UTF-8.
- (issue 1811)
+ When POST is required for some HTTP operation but GET was used, the response should have status code 405.
+ (issue 16918)
-
- Fixed a bug in the log rotation setting of RPM packages.
- (report)
-
-
- Added a new CLI command to obtain list of changes by specifying builds.
-
-
- Improved memory/swap monitoring on Solaris systems that doesn't have the 'top' command.
- (report)
-
-
- User IDs in Hudson are now case preserving but case insensitive.
- (issue 4354)
+ Correct help text of Label field in automatic installation of tools in global configuration.
+ (issue 19091)
-
- CVS support is separated into a plugin, although it's still bundled by default for compatibility.
- (issue 3101)
+ Use Guice from Google rather than a fork
+
-
+ Jenkins does not invoke ProcessKillers for Windows
+ (issue 19156)
-
+
-
- slave.jar incorrectly shipped with a version number indicating a private build.
- (issue 5138)
-
-
- Global MAVEN_OPTS weren't saving due to TopLevelItemDescriptors not being configured in global configuration.
- (issue 5142)
-
-
- Make maven project more resilient to exceptions from plugins.
- (issue 3279)
-
-
- Add the ability to configure low-disk space thresholds.
- (issue 2552)
-
-
- Allow BuildWrapper tearDown code to detect when the build has failed.
- (issue 2485)
-
-
- Add help regarding "Auto" repository browser selection and add support
- for this in Subversion plugin.
- (issue 2082)
+ Fixed NoSuchFieldError: triggers with older Maven plugin
+ (issue 18677)
-
- Introduced a mechanism so that writing XSS-free code is easier.
- (discussion)
-
-
-
+ Added bytecode transformation driven compatibility ensurance mechanism
+ (discussion)
-
- Maven projects will now use per-project MAVEN_OPTS if defined first, then global MAVEN_OPTS if defined, and finally
- as fallback, MAVEN_OPTS environment variable on executor.
- (issue 2932)
+ Improve search to locate items inside folders.
+ (pull request 848)
+ (pull request 893)
+
-
+ Windows path separators not correctly escaped in Maven properties configuration.
+ (issue 10539)
-
- Expose upstream cause details via remote API.
- (issue 5074)
+ Improved EnvironmentContributor to support project-level insertion.
+ (issue 19042)
-
+
-
- Matrix parent build shouldn't consume an executor.
- (issue 936)
-
-
- Exceptions in one publisher shouldn't block all other publishers from running.
- (issue 5023)
+ HudsonAuthenticationEntryPoint can break CLI support, because the port isn't exposed properly.
+ (issue 18634)
+
-
+ Report an user friendly error page if a deletion of a build fails.
+ (pull request 827)
-
- Fixed OutOfMemoryError in JNLP slaves that are running for too long.
- (issue 3406)
+ Maven build failure wasn't describing errors like Maven CLI does.
+ (issue 15025)
-
- Auto installer for Maven couldn't be configured after the fact.
+
MavenModuleSetBuild.getResult
is expensive.
+ (issue 18895)
-
- Fixed a bug that the form field validation couldn't handle <select> box.
- (report)
+ Revisited fix to be compatible for plugins.
+ (issue 18119)
-
- Fixed a possible "XYZ is missing its descriptor" storm.
- (issue 5067)
-
-
- Group available plugins in Plugin Manager by category.
- (issue 1836)
+ Ensuring
/log/all
shows only INFO
and above messages, even if custom loggers display FINE
or below.
+ (issue 18959)
-
- Add sorting and link to directory browser for artifact list and tree display.
- (issue 4976)
+ Added a new monitor that detects and fixes out-of-order builds records.
+ (issue 18289)
-
- Make links in build history for a view stay under that view.
- (issue 5021)
+ Added CLI command
create-node
.
+ (issue 18282)
-
- Automatically install dependent plugins.
- (issue 4983)
-
-
- Implemented a proper serialization of multi-classloader object graph.
- (issue 5048)
-
-
-
- -
- Update or remove lastSuccessful/lastStable symlinks on filesystem as appropriate
- when a build is deleted.
- (issue 1986)
-
-
- In-demand strategy could not relaunch slave nodes since 1.302.
- (issue 3890)
-
-
- Actual cause for slave going offline was always masked by channel-terminated cause.
+ Can't build using maven 3.1.0
+ (issue 15935)
-
- Improved display of why a slave is offline (don't incorrectly say "failed to launch").
+ Fixed Winstone+mod_proxy_ajp+SSL combo issue.
+ (issue 5753)
-
- Improved the error diagnostics on the failure to establish connection with JNLP slaves early on.
+
JENKINS_DEBUG_LEVEL
misinterpreted by Winstone, causing excessive logging.
+ (issue 18701)
+ -
+ Since 1.520, Jenkins requires Java 6 or later, breaking Maven builds set to use JDK 5. Now falls back to JVM of slave agent but sets compile/test flags to use defined JDK.
+ (issue 18403)
+
-
+ Since 1.517, Maven projects using Maven 2 could not build projects using extensions depending on Apache Commons Codec.
+ (issue 18178)
-
- Fix so configure-slave permission actually allows configuration of slaves.
+ Test harness was packing copies of Maven into plugin archives under some conditions.
+ (issue 18918)
-
- User pages showed add/edit description link to users without permission to edit,
- and guests were allowed to edit the user profile for anonymous user.
+ Provided maven settings.xml in maven builder is lost.
+ (issue 15976)
-
- Debian package now demands full JRE, not just a headless JRE.
- (issue 4879)
+ Exception when running polling with a Maven installation not defined on master.
+ (issue 18898)
-
- Avoid exception if a plugin provides null for a dynamic node label.
- (issue 4924)
+ Since 1.477 GET on
/view/…/config.xml
included a spurious wrapper element.
+ (issue 17302)
+ -
+ Clearer display of log messages: chronological order, and coloration of repeated vs. fresh metadata (date, log level, log source).
-
- If restart is not supported, explain why.
- (issue 4876)
+ Fixed a regression that broke some plugins' form validation
+ (issue 18776)
-
- Matrix configuration builds should continue even when Hudson is about to shut down.
- (issue 4873)
+ People View does Not Populate if JQuery plugin enabled.
+ (issue 18641)
+
+
+Same as 1.524; botched release.
+
+
-
- Send build status email to valid addresses rather than aborting for one invalid address.
- (issue 4927)
+ Clock Difference broken on Manage Nodes page
+ (issue 18671)
-
- Smart JDK/Maven/Ant auto installers aren't available for existing tool configurations.
+ Fixed another possible cause of an NPE from MatrixConfiguration.newBuild.
+ (issue 17728)
-
- Hudson can now run gracefully (albeit bit slowly) where JNA is not available.
- (issue 4820)
-
-
- Add ability to delete users from Hudson.
- (issue 1867)
-
-
- Gracefully detect the double loading of JNA instead of failing later with NoClassDefFoundError
- (detail)
-
-
- Introduced a structure around the initialization process for better reporting and etc.
+ NPE in MavenFingerprinter.getArtifactRepositoryMaven21.
+ (issue 18441)
-
- Debian packages creates Hudson user with /bin/bash to accomodate some tools that want a valid shell.
- (issue 4830)
+ More reliability improvement in remote slave reconnection.
+
-
+ Do not load disabled plugins as dependencies for other plugins.
+ (issue 18654)
-
+
-
- Space in axis value for matrix type project was lost on reconfiguration.
- (issue 2360)
-
-
- Remember me did not work with unix authentication.
- (issue 3057)
-
-
- Node variables not passed through to Maven jobs.
- (issue 4030)
+ Fixed: claiming of tests doesn't work in Maven jobs (claim-plugin)
+ (issue 14585)
+
+
+
-
- Fix handling of non-ASCII characters in external job submission.
- (issue 4877)
+ Fixed a regression in the config form with some plugins
+ (issue 18585)
-
- Job assigned to label that no longer has any nodes generates exception since 1.330.
- (issue 4878)
+ Fixed a dead lock in the Project class and improved the signature of the persisted XML form a bit.
+ (issue 18589)
-
- Custom workspace on Windows with just a drive letter or using forward slashes in path
- failed to build in 1.334.
- (issue 4894)
+ Improved memory efficiency in parsing test reports with large stdio output files.
+ (issue 15382)
+
-
+ Node monitoring now happens concurrently across all the slaves, so it'll be affected less by problematic slaves.
+ (issue 18438)
-
- Core version number in plugin manager warning message was missing in 1.334.
+ Deadlock during Maven builds Parsing POM step
+ (issue 15846)
-
- Matrix build wasn't showing their full name in the executor list on the left.
-
-
- Hudson's UDP broadcast/discovery now supports IP multicast.
+ If every node is restricted to tied jobs only, Matrix build jobs can never start.
-
+
- -
- Fixed a possible exception in submitting forms and obtaining update center metadata with Winstone in 1.333.
- (issue 4804)
-
-
- Remoting layer was unable to kill remote processes. Prevented Mercurial plugin from implementing poll timeout on slaves.
- (issue 4611)
-
-
- Display of console output as plain text did not work in browsers since 1.323.
- (issue 4557)
-
-
- Show "Latest Test Results" link even when a new build is running.
- (issue 4580)
-
-
- Fix broken links for failed tests on build page for a matrix type project.
- (issue 4765)
-
- "Enable project-based security" always comes up unchecked on configure pages in 1.333,
- so project permissions are lost if not rechecked before clicking Save.
- (issue 4826)
-
-
- Project read permission was not enforced via /jobCaseInsensitive/jobname path.
+ Build with parameters returns empty web page
+ (issue 18425)
-
- Project configuration could be modified via POST to /job/jobname/config.xml with only
- "Extended Read" permission but not configure permission.
+ Access denied error results in ERR_CONTENT_DECODING_FAILED on most browsers, masking the root cause.
+ (issue 15437)
-
- Fixed the over zealous escaping in the inlined unit test failure report.
+ Fixed the master/slave handshake problem when a slave runs on non-ASCII compatible encoding (such as EBCDIC.)
+
-
+ Added a diagnosis for StreamCorruptedException problem
+ (issue 8856)
+
-
+ Matrix project's parent can be now tied to labels/slaves.
+ (issue 7825)
-
- Fixed OutOfMemoryError in Winp
- (issue 4058)
+ Clean up fingerprint records that correspond to the deleted build recods
+ (issue 18417)
-
- Write log message and ignore unrecognized permissions when loading XML.
- (issue 4573)
+ Fixed "Comparison method violates its general contract" error in BuildTrigger.execute
+ (issue 17247)
-
- Fix in stapler so we don't redirect to "." which causes problem in some containers.
- (issue 4787)
+ Edited description wasn't reflected when pressing the "Apply" button.
+ (issue 18436)
-
- List counts for duplicate cause entries for a build rather than listing many times.
- (issue 4831)
-
-
- Plugin manager now shows warning for upgrade/install of plugins into a Hudson that
- is older than the plugin was built for.
- (issue 541)
-
-
- CLI "build" command now supports passing parameters.
-
-
- Job should provide doDescription to allow easy manipulation over http
- (issue 4802)
-
-
- Improvement in the caching of the view templates.
+ Fixed a regression in remoting since 1.519 that caused FindBugs plugins to break.
+ (issue 18349,
+ issue 18405)
-
- Added new SaveableListener to be called when objects implementing Saveable are saved.
+ Revisited the extension point added in 1.519 that adds custom plexus components.
-
+
-
- Fixed a performance problem in the file upload with Winstone.
- (report)
+ Slave launch thread should have the background activity credential.
+ (issue 15578)
-
- Allow non-absolute URLs in sidebar links that do not end with slash character.
- (issue 4720)
+ “Build Now” link did not work for multijobs.
+ (issue 16974)
-
- Build other projects "even when unstable" option was not working with Maven projects.
- (issue 4739)
+ Unix vs. Windows mode not correctly retained for command launchers under some conditions.
+ (issue 18368)
-
- When renaming a log recorder, check new name uses valid characters, remove config file for
- old name and redirect to new name after save.
+ Edit views with non-ASCII names did not work since 1.500.
+ (issue 18373)
+
-
+ Fixed API incompatibility since 1.489.
+ (issue 18356)
-
- Fixed ArrayIndexOutOfBoundsException in my view.
- (report)
+ “Projects tied to slave” shows unrelated Maven module jobs.
+ (issue 17451)
-
- Fixed a race condition in interrupting pending remote calls.
+ Fixed file descriptor leak in fingerprint computation.
+ (issue 18351)
-
- Retry shouldn't kick in if the build is aborted during checkout.
+ Test history was not shown if suite name was part of the test name.
+ (issue 15380)
-
- Hudson now sends "Accept-Ranges" header where it's supported.
- (report)
+ Added a new extension point to monitor the flow of stuff in the queue.
+
-
+ Added a new extension point to monitor the provisioning of nodes from clouds.
+ (pull request 819)
-
- Hudson is internally capable of supporting multiple update sites.
+ Possible to create a custom
AbstractDiskSpaceMonitor
.
-
- Added a new "safe-restart" CLI command, also accessible at "/safeRestart", and used for post-upgrade/plugin install restart.
- (issue 4553)
+ Executors running the builds can be now a subject of access control.
+ (issue 18285)
+
-
+ Core started relying on Java 1.6 as per the agreement in the dev list.
+ If you have a serious objection against it, please let us know
+ before we really start relying on 1.6 features.
+
-
+ Some actions confirmed by dialog were not working when CSRF crumbs were enabled.
+ (issue 17977)
+ (issue 18032)
-
- Added "delete-builds" CLI command for bulk build record deletion.
+ CLI list-jobs command should list all nested jobs.
+ (pull request 793)
-
- Supported a relative path in the custom workspace directory, which resolves from FS root of the slave.
+ Provide a mechanism to differentiate between node properties that are applicable
+ to the master node only and node properties that can be applied to all nodes
+ (issue 18381)
+
-
+ Maven module links in the module list page are broken.
+ (issue 17713)
-
- Fixed another NotExportableException when making a remote API call on a project.
- Broke NetBeans integration and possibly others.
- (issue 4760)
+ 100% CPU pegging in Deflator.deflateBytes
+ (issue 14362)
-
+
- -
- Fixed a regression in 1.331 where previously disabled plugins and their artifacts in build.xml can cause build records to fail to load.
- (issue 4752)
-
- Fixed NotExportableException when making a remote API call on a project.
- (report)
-
-
- Fixed IllegalArgumentException: name
- (report)
+ Log cluttered with irrelevant warnings about build timestamps when running on Windows on Java 6.
+ (issue 15587)
+
-
+ Fingerprint action deserialization problem fixed.
+ (issue 17125)
+
-
+ Updating the master computer's configuration from the slave list UI had no immediate effect.
+ (issue 17276)
+
-
+ Improved the tracking of queued jobs and their eventual builds in the REST API.
+
-
+ Configured log recorders can now pick up messages logged from slaves.
+ (issue 18274)
+
-
+ Added a new extension point to contribute custom plexus components into Maven for the maven project type.
+
-
+ Remoting classloader performance improvement upon reconnection to the same slave.
+ (issue 15120)
-
+
-
- Fixed a memory leak problem with the groovysh Hudson CLI command.
- (issue 4618)
+ NPE in
DefaultMatrixExecutionStrategyImpl.waitForCompletion
.
+ (issue 18024)
-
- CVS changelog reports were incorrect if built from tags.
- (issue 1816)
+ Optimizations in fingerprint recording.
+ (issue 16301)
-
- Upstream projects list was lost when saving matrix type project.
- (issue 3607)
+ Using JNR-POSIX rather than JNA-POSIX for better platform support.
+ (issue 14351)
+
-
+ Errors searching build records when builds were misordered.
+ (issue 15652)
+
-
+ Finding the last failed build for a job (e.g. from a view column) broke lazy loading.
+ (issue 16023)
-
- slave.jar now supports HTTP BASIC auth.
- (issue 4071)
+ Do not fail startup in case
ListView.includeRegex
was syntactically malformed.
-
- Fixed a problem where taglibs defined in plugins cannot be seen from other plugins.
- (report)
+ CSS stylesheets misrendered in Chrome due to caching.
+ (issue 17684)
-
- Improved the UI of taking a node offline.
+ User icon in People broken if Jenkins root URL unconfigured.
+ (issue 18118)
-
- Added improved logging for exceptions encountered when attempting to invoke Maven in Maven projects.
- (issue 3273)
-
-
- Automated tool downloads are made more robust by using HTTP download retries.
-
-
- SCM information is now exposed via the remote API.
-
-
- Added the "install-plugin" command to install plugins from CLI.
- (report)
+ Progress bar sometimes broken in People.
+ (issue 18119)
-
+
- -
- Fixed NoSuchMethodError error during error recovery with Maven 2.1.
- (issue 2373)
-
-
- RemoteClassLoader does not persist retrieved classes with package structure
- (issue 4657)
-
- Update center switched over from https://hudson.dev.java.net/ to http://hudson-ci.org/
-
-
- Use tree view to show 17-40 build artifacts on build/project pages.
- (issue 2280)
+ Enable word breaking in potentially long strings like job names.
+ (issue 17030)
-
- When showing why a build is pending, Hudson now puts hyperlinks to node/label/project names.
+ Allow filtering of the Run parameter build list by result.
+ (issue 7280)
-
- Custom workspace is now subject to the variable expansion.
- (issue 3997)
-
-
-
- -
- Fixed UI selector (hetero-list) to handle nested selectors (resolves conflict between
- Promoted Builds and Parameterized Trigger plugins).
- (issue 4414)
-
-
- Fixed incremental Maven build behavior to properly handle new modules without hitting NPE.
- (issue 4624)
-
-
- Added the "build" CLI command that can not only schedule a new build, but also wait until its completion.
+ Add support for scalatest-maven-plugin.
+ (issue 18086)
-
- Made visibility rules of test result remote API consistent with those for individual test cases.
+ When copying a folder, the display names of contained jobs were gratuitously cleared.
+ (issue 18074)
-
- Fixed a bug in the HTTP Range header handling.
- (report)
+ “Recurse in subfolders” option for list views produced exceptions when used with native Maven projects.
+ (issue 18025)
-
- Fixed a bug in .cvspass form field persistence.
- (issue 4456)
+ Using proper directory separator character for permalinks on Windows.
+ (issue 17681)
+
-
+ Use markup formater to display parameter description.
+ (issue 18427)
+
-
+
-
- Overview of all SCM polling activity was never showing any entries.
- (issue 4609)
+ NPE from
Run.getDynamic
.
+ (issue 17935)
+ -
+ Should be able to collect all log records at a given level using a blank logger name.
+ (issue 17983)
-
- Fixed a bogus IOException in the termination of CLI.
+ Reworked Upload Plugin gesture to work more like installation from an update center, and in particular to support dynamic load.
+ (issue 16652)
-
- Fixed a bug in the form submission logic of the SMTP authentation configuration.
- (report)
-
-
- Hudson shouldn't store SMTP auth password in a clear text.
- (report)
-
-
- Improved the form validation in global e-mail configurations.
- (report)
+ Errors in
init.groovy
halted startup; changed to just log a warning.
+ (issue 17933)
-
+
- -
- Worked around a possible Windows slave hang on start up.
- (details)
-
-
- Inability to access hudson.dev.java.net shouldn't prevent Hudson from working.
- (issue 4590)
-
-
- Added a CLI command install-tool to invoke a tool auto-installation from Hudson CLI.
- (report)
-
-
- Added column on plugin updates page showing currently installed version.
-
-
- Build page now shows where the build was done.
-
- Job-enabling API should reject GET requests
- (issue 3721)
+ Windows services now auto-restart in case of abnormal process termination.
-
- Added an extension point for inserting actions across all projects without configuration.
- (report)
+ <f:dropdownDescriptorSelector> does not allow defaulting to specifig instance
+ (issue 17858)
-
- stdout, stderr, error details and the stack trace can be filtered out of the remote API
- representation of a test case with the depth parameter.
- (discussion)
-
-
-
- -
- Hudson fails to update a plugin due to a bug in the up-to-date check logic.
- (issue 4353)
-
-
-
- -
- Self restart was not working on Solaris 64bit JVM.
-
-
- Fixed a possible NoSuchElementException in Hudson start up.
-
-
- "Redeploy Maven artifacts" GUI causes NPE.
-
-
- Permission check was missing for file mask validators.
-
-
- Fixed a problem regarding SCM plugin evolution and SCM browser settings, as observed in the Mercurial plugin.
- (issue 4514)
-
-
- Update center wasn't capable of updating bundled plugins, such as subversion.
-
-
- Fixed a problem in the up-to-date check of the plugin extraction.
- (issue 4353)
+ mark maven settings / global settings as default for new jobs
+ (issue 17723)
-
- Fixed a bug in the Debian package init script.
- (issue 4304)
+ Display Name is not shown.
+ (issue 17715)
+
-
+ Symlink handling problem with build permalinks on Windows.
+ (issue 17681)
-
- Fixed an NPE in MavenBuild$RunnerImpl.decideWorkspace
- (issue 4226)
+ List views missing a required field were unloadable.
+ (issue 15309)
-
- "Test e-mail" feature in the system configuration page wasn't taking most of the parameters from the current values of the form.
- (issue 3983)
-
-
- If a Maven project is built with "-N" or "--non-recursive" in the goals, it will not attempt to
- load and parse the POMs for any modules defined in the root POM.
- (issue 4491)
-
-
- Update center will create *.bak files to make it easier for manual roll back of botched upgrades.
-
-
- Vastly improved the default MIME type table of the built-in servlet container.
+ Maven module artifacts were not being deleted by the log rotator.
+ (issue 17508)
+
-
+ Properly find parent POMs when fingerprinting a Maven project.
+ (issue 17775)
-
- Javadoc location is now subject to the variable expansions.
- (issue 3942)
+ Allow the combination filter to accept parameter values.
+ (issue 7285)
-
- JNLP clients now report the reason when the connection is rejected by the master.
- (issue 3889)
+ Extension point to transform test names (for use with alternative JVM languages).
+ (issue 17478)
-
+
+ -
+ Added a new set-build-parameter command that can update a build variable from within a build.
+
-
+ Can use
-Dhudson.udp=-1
to disable UDP broadcast without showing an ugly exception.
-
- Added call to MailSender in RunnerImpl.cleanUp so that mail gets sent for top-level Maven project as well as individual modules. This means mail will be sent if there are POM parsing errors, etc.
- (issue 1066)
-
-
- Default value for password parameter in a parameterized project was not saved.
- (issue 4333)
-
-
- Run sequentially option for Matrix project was not visible unless Axes was checked.
- (issue 4366)
-
-
- Fix launching Windows slave for slave name with space or other characters needed encoding.
- (issue 4392)
-
-
- Support authentication when running java -jar hudson-core-*.jar using username/password
- included in HUDSON_HOME URL; also removed dependency on winstone.jar.
- (issue 4400)
-
-
- Fixed links on age values in JUnit test reports.
- (issue 4402)
-
-
- Maven project POM parser now ignores empty modules or modules only containing whitespace,
- matching Maven's behavior.
- (issue 4442)
-
-
- Fixed setting of "blockBuildWhenUpstreamBuilding" for AbstractProject - wasn't being set at all, or displayed.
- (issue 4423)
-
-
- Handling of URLs with encoded character at end of a path component did not work in 1.323.
- (issue 4454)
-
-
- Fixed some field validators to work for values including + character.
+ Third-party license display for core was broken since 1.506.
+ (issue 17724)
+
-
+ Mitigation of exception from fingerprinting in a Maven project when a parent POM could not be located.
+ (issue 17775)
-
- Fixed the charset encoding handling when different encodings are involved between the master and slaves.
- (patch)
+ NPE from
MatrixConfiguration.newBuild
.
+ (issue 17728)
-
- Fixed a bug in the workspace archive support.
- (issue 4039)
+ Identify the short name of an uploaded plugin from the manifest, so it does not matter what the filename was.
+ (issue 4543)
+
-
+ NPE configuring Copy Artifact with Maven jobs.
+ (issue 17402)
-
- Added client-side validator for required fields and used this to replace some AJAX calls.
+
/about
now links to license information for plugins as well.
-
- JNLP clients perform periodic ping to detect terminated connections and recover automatically.
- (report)
+ Updated bundled plugins.
-
+
+ -
+ Slave status monitor page shows when the data is last obtained
+
-
+ Delete button to highlight what it is going to delete.
-
- Creation of symlinks failed (or created in wrong location) since 1.320.
- (issue 4301)
-
-
- Fixed a NoClassDefFoundError problem that happens in remoting+maven+3rd plugin combo.
- report
-
-
- Raw console output was doing XML escaping for '&' and '<' but it shouldn't.
-
-
- Manually wiping out a workspace from GUI can cause NPE with some SCM plugins.
-
-
- Fixed ClassCastException in JavaMail with some application servers.
- (issue 1261)
-
-
- Fixed a bug in the tabular display of matrix projects.
- (issue 4245)
-
-
- Avoid division by zero error in swap space monitor.
- (issue 4284)
+
StringIndexOutOfBoundsException
in PackageResult.findCorrespondingResult
.
+ (issue 17721)
+ -
+ Breadcrumb is reworked to show descendants to provide additional navigational shortcuts.
+ (discussion)
-
- Avoid duplicate My Views links after Reload configuration from disk.
- (issue 4272)
+
hpi:run
did not work for bundled plugins.
+ (issue 18352)
-
- Removed need for hack that lowered build health scores by one, so now 4/5 is reported as 80 instead of 79.
- (issue 4286)
+ Fixed CSRF vulnerabilities
+ (SECURITY-63,SECURITY-69)
-
- Fixed renaming a job to a name that includes a + character.
+ Fixed an XSS vulnerability via stylesheet
+ (SECURITY-67)
-
- Matrix project did not properly handle axis values with some special characters such as slash.
- (issue 2670)
-
-
- Added validation for axis names in Matrix project.
-
-
- Ajax validator for name of a new job now warns about invalid characters.
-
-
- Maven builder in freestyle projects now supports "Use private repository" option.
- (issue 4205)
-
-
- Maven incremental builds now rebuild failed/unstable modules from previous builds, even if they are unchanged.
- (issue 4152)
-
-
- Labels are listed in lexicographic order.
- (report)
-
-
- Labels for nodes are shown in a tag cloud style.
- (patch)
-
-
- Exposing load statistics to the remote API.
- (report)
+ Fixed an XSS vulnerability to copy arbitrary text into clipboard
+ (SECURITY-71/CVE-2013-1808)
+
+
+
-
- Make dynamic labelling of nodes clearer and easier to work with.
+ Views can now include jobs located within folders.
+ (pull 757)
-
- Plugins can mark themselves as incompatible with earlier versions to notify users during upgrade.
- (issue 4056)
+ Added confirmation dialog before reloading configuration from disk.
+ (issue 15340)
-
- Footer now includes a timestamp.
+ Switched confirmation before deleting jobs or wiping out workspace to a dialog.
-
- Advanced option now available for all project types to keep builds in queue while upstream projects are building. Off by default.
- (issue 1938)
+ Different text than “Build Now” for parameterized jobs.
+ (issue 10738)
-
- Fixed a bug in Winstone that hides the root cause of exceptions.
-
-
-
- -
- NPE in Subversion polling problem.
- (issue 4299)
-
-
- Changing credential in Subversion can still result in "svn authentication cancelled"
- (issue 3936)
-
-
- Debian init script now uses "su" to properly initialize the environment.
- (issue 4304)
-
-
-
- -
- "Tag this build" was failing.
- (issue 4018)
-
-
- Build history AJAX update was buggy.
-
-
- Failed Junit tests will display error message and stacktrace even when no
- additional TestDataPublishers are attached to the project.
- (issue 4257)
-
-
- Maven test failures will again properly mark a build as unstable,
- even if later task segments are successful.
- (issue 4177)
-
-
- Matrix permissions with LDAP now properly validates group names using configured
- prefix and case settings; added help text about these settings.
- (issue 3459)
-
-
- Improved the debian package to set USER and HOME.
- (report)
-
-
- Failed to look up an e-mail address for LDAP users shouldn't cause a build to fail.
- (report)
-
-
- Fixed a possible NPE in Hudson.removeNode
- (report)
-
-
- Debian start-up script should inherit LANG and other key environment variables.
-
-
- Dynamic label computation wasn't re-done properly for the master node.
- (issue 4235)
-
-
- Form validation for the remote FS root of slaves was not functioning.
+ Check the view name with ajax.
-
- Privilege escalation on Solaris without username was not working.
+ “Build Now” context menu item broken for parameterized jobs.
+ (issue 17110)
-
- Hudson can make mistakes in binding plugins to their right /plugin/NAME/ URLs.
- (report)
+ Incorrect redirection after delete of job in folder in view.
+ (issue 17575)
-
- Hudson wasn't working on WebLogic on Windows.
- (report)
+ ”My Views" links leads to 404 Not Found.
+ (issue 17317)
-
- Fix New Job and Edit View links when default view is not "All" jobs.
- (issue 4212)
+ Quoting Issue with JDK Installer with Windows Installer.
+ (issue 5408)
-
- Revert logger settings when a log recorder is deleted.
- (issue 4201)
+ Restored compatibility in
ArtifactArchiver
signature; broken in 1.509 and could affect plugins.
+ (issue 17637)
-
- Add xml header on RSS/atom feeds and fix RSS URLs in header for non-default views.
- (issue 4080,
- issue 4081)
-
-
- Plugin installation / Hudson upgrade are made more robust in the face of possible connection abortion.
- (report)
-
-
- Global and per-node environment vars are made available to SCM checkout.
- (issue 4124)
-
-
- You can designate certain combinations in a matrix project as "touchstone builds". These will
- be run first, and the rest of the combinations will run if the touchstone builds are successful.
- (issue 1613)
-
-
- Added BUILD_URL and JOB_URL to the exposed environment variables.
- (request)
-
-
- Added restart CLI command.
+ Fixed a bug in the logic that hides context menu anchor 'v'
+ (issue 13995)
-
+
-
- Fixed an encoding problem in CVS changelog calculation.
- (issue 3979)
-
-
- Environment variables are considered in test paths.
- (issue 3451)
-
-
- A failing test is recorded when JUnit XML is invalid
- (issue 3149)
-
-
- Fixed possible Unable to call getCredential. Invalid object ID race problem.
- (issue 4176)
-
-
- If the timing coincides between polling and build, Hudson ended up creating multiple workspaces for the same job,
- even when concurrent build is off.
- (issue 4202)
-
-
- Fixed a "Releasing unallocated workspace" assertion error.
- (issue 4206)
-
-
- Fixed NPE in various Maven reporters caused by Hudson core problem.
- (issue 4192)
-
-
- Show warning if zero value entered for #builds/#days to save for discarding old builds
- (issue 4110)
-
-
- Added create-job CLI command.
+ JUnit result archiver should only fail builds if there are really no results - i.e. also no skipped tests.
+ (issue 7970)
+
-
+
NullPointerException
related to lazy loading when loading some builds using fingerprinting.
+ (issue 16845)
-
- Hudson now tracks why a slave is put offline.
- (issue 2431)
-
-
- User-settable descriptions for tests.
-
-
- A history page with test count and duration charts.
- (issue 2228)
-
-
- A collapsible panel with test error details on the overview pages.
-
-
- Skipped tests counts are included in tables.
- (issue 1820)
-
-
- New tests are shown in bold.
- (issue 2046)
-
-
- JUnit report improvements: A new extension point for contributing to test reports.
+ Better display of parameters in queue items.
+ (issue 17454)
+
-
+ sort order of plugin list is not working by default.
+ (issue 17039)
-
+
-
- Improved the start up error handling with slave.jar -jnlpUrl option.
- (report)
+ UnsatisfiedLinkError on CreateSymbolicLinkw on Windows XP.
+ (issue 17343)
-
- Made hetero-list's include of descriptor config pages optional, so
- that descriptors without config.jelly files don't break page rendering.
- (See
- here for background.
+ Flyweight tasks should execute on the master if there's no static
+ executors available.
+ (issue 7291)
+
-
+ Download tool installations directly from the slave when possible, since this is much faster than going through the master.
+ (issue 17330)
-
- Moved Maven help files to maven-plugin.
- (issue 3527)
+ Improved UI for implicitly locked builds.
+ (issue 10197)
-
- Hudson shouldn't immediately launch a slave newly created via copy.
- report
-
-
- Added support for optional alternate Maven settings file for use
- in embedded Maven for POM parsing as well as actual Maven
- execution.
- (issue 2575)
-
-
- Added a test button to the PAM configuration to make sure Hudson has read access to
- /etc/shadow
- (report)
-
-
- Users can define their own views
-
-
- Added a /me url that points to the current user
-
-
- Added a new password parameter type to the parameterized builds.
- (report)
+ Incorrect URL computation broke context menu for computers with spaces in their names.
+ (issue 18236)
-
- Matrix projects can now run sequentially
- (issue 3028)
+ Promote the use of 'H' in cron.
+ (issue 17311)
-
- Hudson now allows builds of a single project to execute concurrently.
+ Context menu no longer automatically pops up
+ (issue 13995)
-
+
- -
- Removed a problematic MIME type entry that prevents Hudson from deploying on JOnAS.
- (report)
-
-
- Hudson can't restart itself on Mac, so don't pretend that it can.
- (report)
-
-
- Fixed Maven plugin to properly use private repository (when
- specified) when parsing POMs.
- (issue 4102)
-
-
- Edit Description worked incorrectly when default view is changed from All jobs.
- (issue 4070)
-
-
- Fixed a bug in JDK auto-installation to Windows with directories with whitespaces.
- (issue 4118)
-
-
- Added support for incremental Maven project builds,
- using Maven's
- make-like reactor mode.
-
-
- Script console can now see classes from all the plugins, not just core.
- (issue 4086)
-
-
- slave.jar now has the -auth option to specify the credential for accessing Hudson
- (report)
-
-
- Debian package now depends on java2-runtime-headless instead of java2-runtime
+
-
+ Heavy thread congestion saving fingerprints.
+ (issue 13154)
-
- Actions can now contribute environment variables.
- (report)
+ Option to make the build not fail if there is nothing to archive.
+ (issue 10502)
-
- Modified the reconnection logic for slaves connecting via JNLP so that it works better with protected Hudson.
- (report)
-
-
-
- -
- Fixed a bug in inferring root DN in non-anonymous LDAP environment.
- (report)
-
-
- Fixed a MissingResourceException for "Ajp13Listener.ShortPacket"
- (issue 4053)
-
-
- Fixed 500 error when requesting the zip URL.
- (issue 4039)
-
-
- Debian package now has 750 permission on /var/run/hudson and /var/lib/hudson to make ssh work
- (issue 4047)
+ Better report file deletion failures.
+ (issue 17271)
-
- Fixed LinkageError in PAM authentication on Solaris.
- (issue 3546)
+ "Local to the workspace" repository locator does not work when building one module in isolation.
+ (issue 17331)
-
- Fixed a JDK path separator issue between Windows master and Unix slaves.
+ Master node mode not correctly displayed in
/computer/(master)/configure
.
+ (issue 17263)
+ -
+ Performance improvement in master/slave communication throughput
+ (issue 7813)
-
- Fixed a memory leak in the remoting layer.
- (issue 4045)
+ Quoted label expression can result into dead executors (throwing exception)
+ (issue 17128)
-
- Fixed Maven dependency build order logic.
- (issue 2736)
+ ChangeLog should produce some output even if some (plugin) annotator fails
+ (issue 17084)
-
- Renaming views and jobs, and deleting jobs should use POST instead of GET.
- (discussion)
-
-
- Improved the error diagnosis of "Processing failed due to a bug in the code"
-
-
- Slaves expose more information via the remote API now.
-
-
- Exported BUILD_ID to the remote API.
- (report)
-
-
- Don't let the slave TCP/IP connection port failure to prevent Hudson start up.
- (report)
-
-
- If the user sets up "Hudson's own" security realm, UI now asks the first admin user to be created.
-
-
- Windows service now does log rotation and handles whitespace in path correctly.
- (This is only applicable to newly installed services.)
- (report)
+ View name should not allow "..".
+ (issue 16608)
-
+
+ -
+ Fixing a regression in 1.507 that causes a failure to load matrix jobs.
+ (issue 17337)
+
+
+
+ -
+ Show the reason for a skipped test if the test result contains one
+ (issue 8713)
+
-
- Matrix configuration should show a test trend.
- (issue 840)
-
-
- Fixed a possible NPE in installing Windows service.
- (report)
+ an in-progress build was dropped from JSON API when lazy-loading was introduced.
+ (issue 15583)
-
- Fixed a possible NPE in CrumbFilter.getCrumbIssuer.
- (issue 3986)
+ In-progress builds now survive the "reload from disk" administrator action.
+ (issue 3265)
-
- Login may result in 403 if the user realm is delegated to container.
- (issue 1235)
+ If artifact archiving failed with an I/O error, the build nonetheless was considered to be a success.
+ (issue 2058)
-
- The --logfile option stopped working on Windows.
- (issue 3272)
+ Fixed a bad interaction between Windows symlinks and build record lazy loading.
+ (issue 15587)
+
-
+ Remember the lastStable/Failed/Successful/etc builds to avoid eager loading builds.
+ (issue 16089)
-
- On-demand retention policy almost immediately turns off slaves.
- (issue 3972)
+ Wrong build result in post build steps after failed pre build step in maven projects.
+ (issue 17177)
+
+
+
+ -
+ Saving Global Jenkins Global Config wipes out the crumb issuer settings in the Global Security Config.
+ (issue 17087)
+
-
+ Made
--httpKeepAliveTimeout
option work (that was supposed to have been introduced in 1.503).
+ (issue 16474)
-
- Fixed "incomplete LifecycleExecutor" warning with Maven 2.2
- (issue 2373)
+ Preview function for textareas using Jenkins markup did not work when CSRF protection was enabled.
+ (issue 17085)
-
- Fixed a bug in Winstone that may result in "unable to create new native thread" error
- (report)
+ Permalinks created in the wrong place when using external build directories.
+ (issue 17137)
-
- Fixed a possible NPEs with the slavestatus plugin.
- (report)
+ External build directories not updated by job rename/delete.
+ (issue 17138)
-
- Fixed a possible StringIndexOutOfBoundsException with Windows process execution.
- (issue 4034)
+ JNA-related error from Windows slave monitoring thrown repeatedly.
+ (issue 15796)
-
- Fixed an NPE when environment variables are enabled but no variables are set.
- (issue 4032)
-
-
- Added ibm-web-bnd.xmi to simplify the automated deployment with WebSphere.
- (issue 3270)
-
-
- When deleting the workspace of a matrix project, do so for all configurations.
- (issue 3087)
-
-
- Enclose URLs in angle brackets when sending mail.
- (issue 3647)
-
-
- Plugins can now hide classes in the core so that they can ship their own versions.
- (report)
-
-
- The default view is now configurable.
+ New JSON library corrects problems such as form values starting with
[
.
+ (issue 14827)
-
- Tentatively added additional extension points to control queue behaviors.
- (patch)
+ Improved the request handling performance (where the file lookup is expensive, such as on NFS).
+ (issue 16606)
-
- Added support for proxy authentication on non-NTLM systems
- (issue 1920)
+ Windows symbolic support on Java5/6.
-
- Added MIME type mapping for several well-known file extensions so that it works everywhere.
- (issue 3803)
+ Improved the duration browsers cache static resources.
-
+
+ -
+ Exception in flyweight tasks when checking if an executor is interrupted.
+ (issue 17025)
+
-
+ JNA-related linkage errors on Windows not handled gracefully.
+ (issue 15466)
+
-
+ Builds disappear from build history after completion (revisited).
+ (issue 15156)
+
-
+ Added run display name as an environment variable when RunParameter is used
+ (pull 720)
-
- Hudson failed to notice a build result status change if aborted builds
- were in the middle.
- (report)
+ Fixed "Manage" sub-contextmenu for non-standalone deployments
+ (pull 721)
-
- TCP/IP hostname calculation of slaves may fail due in high latency network.
- (issue 3981)
+ Absolute URLs in console output
+ (issue 16368)
-
- Expose MAVEN_OPTS as env. var, in addition to set it to Maven JVM.
- (issue 3644)
+ Revert ampersand encoding which can cause backward incompatibility issue
+ (pull 683)
-
- Fixed winp.dll load problem on WebSphere
- (report)
+ Fix dependency graph computation when upstream build trigger is involved
+ (issue 13502)
-
- Subversion checkouts created files for symlinks
- (issue 3949)
-
-
- Hudson CLI now tries to connect to Hudson via plain TCP/IP, then fall back to tunneling over HTTP.
-
-
- Added ability to exclude by author and revision property with Subversion polling trigger.
-
-
- CLI slave agents show details of how it failed to connect.
- (report)
+ Disabled Authenticode verification for Windows services.
+ (issue 15596)
-
+
+ -
+ Fixed a regression in the "discard old builds" in 1.503.
+ (issue 16979)
+
-
+ Maven 3.0.5 upgrade.
+ (issue 16965)
-
- Fixed a possible "Cannot create a file when that file already exists" error in managed Windows slave launcher.
- report
+ Not all log messages were being captured at
/log/all
.
+ (issue 16952)
-
- Made Hudson more robust in parsing CVS/Entries
- report
+ Incorrect or missing XML encoding declaration on some REST API pages.
+ (issue 16881)
-
- Fixed a regression in the groovy CLI command
- report
-
-
- Fixed regression in handling of usernames containing
<
, often used by Mercurial.
- (issue 3964)
- -
- Allow Maven projects to have their own artifact archiver settings.
- (issue 3289)
-
-
-
+ Fixed: Human readable file size method returns ",00" for files with byte length 0
+ (issue 16630)
-
- Added copy-job, delete-job, enable-job, and disable-job command.
+ “Build” from job context menu produced a confusing warning page.
+ (issue 16844)
-
- Fixed a bug in the non-ASCII character handling in remote bulk file copy.
- (report)
+ Maven2 builds with non-standard test plugins failed.
+ (issue 16928)
-
- Supported self restart on all containers in Unix
- (report)
+ Started bundling XStream 1.4.4
+ (issue 12542)
-
- Added Retry Logic to SCM Checkout
-
-
- Fix bug in crumb validation when client is coming through a proxy.
- (issue 3854)
-
-
- Replaced "appears to be stuck" with an icon.
- (issue 3891)
-
-
- WebDAV deployment from Maven was failing with VerifyError.
-
-
- Subversion checkout/update gets in an infinite loop when a previously valid password goes invalid.
- (issue 2909)
-
-
-
- -
- 1.311 jars were not properly signed
-
-
- Subversion SCM browsers were not working.
- (report)
+ Significant improvement in Traditional Chinese localizations.
+ (pull 716)
-
+
-
- Gracefully handle IBM JVMs on PowerPC.
- (issue 3875)
+ ${ITEM_FULLNAME} variable was not working for Maven projects on Windows,
+ so introduced ${ITEM_FULL_NAME} instead.
+ (issue 12251)
-
- Fixed NPE with GlassFish v3 when CSRF protection is on.
- (issue 3878)
+ Lock contention issue in build history view.
+ (issue 16831)
-
- Fixed a bug in CLI where the state of command executions may interfere with each other.
+ Fixed the HTTP request thread saturation problem with Winstone.
+ (issue 16474)
-
- CLI should handle the situation gracefully if the server doesn't use crumb.
+ Script evaluation script error on IE.
+ (issue 16561)
-
- Fixed a performance problem in CLI execution.
+ surefire-reports not detected for android-maven-plugin
+ (issue 16776)
-
- Don't populate the default value of the Subversion local directory name.
- (report)
-
-
- Integrated SVNKit 1.3.0
-
-
- Implemented more intelligent polling assisted by commit-hook from SVN repository.
- (details)
-
-
- Subversion support is moved into a plugin to isolate SVNKit that has GPL-like license.
-
-
- Fixed a performance problem in master/slave file copy.
- (issue 3799)
-
-
- Set time out to avoid infinite hang when SMTP servers don't respond in time.
- (report)
-
-
-
+ maven-failsafe-plugin tests not recognized anymore
+ (issue 16696)
-
- Ant/Maven installers weren't setting the file permissions on Unix.
- (issue 3850)
+ UI waiting on a queue lock to display cause of queue blockage.
+ (issue 16833)
-
- Fixed cross-site scripting vulnerabilities, thanks to Steve Milner.
+ UpdateCenter REST API chokes if there was a plugin installation failure.
+ (issue 16836)
-
- Changing number of executors for master node required Hudson restart.
- (issue 3092)
+ Missing build title in /rssAll when build has no test result.
+ (issue 16770)
-
- Improved validation and help text regarding when number of executors setting may be zero.
- (issue 2110)
+ Changed the way matrix axis values are exposed as env variables
+ (issue 11577)
-
- NPE fix in the remote API if @xpath is used without @exclude.
- (patch)
-
-
- Expose the node name as 'NODE_NAME' environment varilable to build.
+ Maven 3 builds ignored quiet (-q) and debug (-X) options
+ (issue 16843)
-
- Added a CLI command to clear the job queue.
- (report)
+ JNLP slave installers can now work transparently with secured Jenkins.
+ (SECURITY-54 / despite the ticket marker, this is not a security vulnerability)
-
- Sundry improvements to automatic tool installation. You no longer need to configure an absolute tool home directory. Also some Unix-specific fixes.
-
-
- Generate nonce values to prevent cross site request forgeries. Extension point to customize the nonce generation algorithm.
-
-
-
- -
- Reimplemented JDK auto installer to reduce Hudson footprint by 5MB. This also fix a failure to run on JBoss.
- (report)
+ "Discard old build records" behavior is now pluggable, allowing plugins to define custom logic.
-
+
+ -
+ Miscellaneous security vulnerability fixes. See the advisory for more details.
+ (SECURITY-13,16,46,47,54,55,59,60,61)
+
-
+ Builds disappear from build history after completion.
+ (issue 15156)
-
- Unit test trend graph was not displayed if there's no successful build.
- (report)
-
-
- init script ($HUDSON_HOME/init.groovy) is now run with uber-classloader.
-
-
- Maven2 projects may fail with "Cannot lookup required component".
- (issue 3706)
+ Plugin Manager’s Filter field did not work. Regression in 1.500.
+ (issue 16651)
-
- Toned down the form validation of JDK, Maven, Ant installations given that we can now auto-install them.
+ DISCOVER-able jobs break the build queue widget
+ (issue 16682)
-
- Ant can now be automatically installed from ant.apache.org.
+ Extension point to provide access to workspace even when node is offline
+ (issue 16454)
-
- Maven can now be automatically installed from maven.apache.org.
+ Extension point to listen BuildStep execution
-
+
+ -
+ Reverted change in 1.500 causing serious regression in HTTPS reverse proxy setups.
+ (issue 16368)
+
-
+ Getting test results from custom test mojos failed build.
+ (issue 16573)
+
-
+ Restored Java 5 compatibility.
+ (issue 16554)
-
- AbstractProject.doWipeOutWorkspace() wasn't calling SCM.processWorkspaceBeforeDeletion.
- (issue 3506)
+ Bogus “Build Record Root Directory” inadequately diagnosed.
+ (issue 16457)
-
- X-Hudson header was sent for all views, not just the top page.
- (report)
+ Plugin icons in the sidebar were not being properly cached.
+ (issue 16530)
+
-
+ Broadly as well as deeply nested build causes overwhelmed the UI after 1.482.
+ (issue 15747)
-
- Remote API served incorrect absolute URLs when Hudson is run behind a reverse proxy.
- (report)
+ API typo
DependecyDeclarer
corrected.
-
- Further improved the JUnit report parsing.
- (report)
+ Avoid eagerly loading builds in Changes in dependency or culprit list.
+ (pull 689)
-
- External job monitoring was ignoring the possible encoding difference between Hudson and the remote machine that executed the job.
- (report)
+ Run parameters do not support folders.
+ (issue 16462)
-
- Slave launch log was doing extra buffering that can prevent error logs (and so on) from showing up instantly.
- (report)
+ Fixed RememberMe cookie signature generation.
+ (issue 16278)
-
- Some failures in Windows batch files didn't cause Hudson to fail the build.
- (report)
+ Fixed NullPointerException when copying from existing Maven job
+ (issue 16499)
+
-
+
-
- Maven 2.1 support was not working on slaves.
- (report)
-
-
-
+ Since 1.494, when signing up as a new user in the private security realm the email address was left unconfigured and a stack trace printed.
+ -
+ Enable transparent log decompression support.
+ (issue 13655)
+
-
+ Display authorities at
/user/*
for convenience.
+ (pull 577)
-
- Fixed a bug that caused Hudson to delete slave workspaces too often.
- (issue 3653)
+ Slow rendering of view pages in large installations due to eager check whether the “People” link would show anything.
+ (issue 16244)
-
- If distributed build isn't enabled, slave selection drop-down shouldn't be displayed in the job config.
+ Reduced size of memory leak in render-on-demand functionality used e.g. in configuration pages.
+ (issue 16341)
-
- Added support for Svent 2.x SCM browsers.
- (issue 3357)
+ Improving responsiveness of People page.
+ (issue 16342)
+ (issue 16397)
-
- Fixed unexpanded rootURL in CLI.
- (report)
+ Exception printed to log while adding Build other projects post-build step.
+ (issue 16444)
-
- Trying to see the generated maven site results in 404.
- (issue 3497)
-
-
- Long lines in console output are now wrapped in most browsers.
-
-
- Hudson can now automatically install JDKs from java.sun.com
-
-
- The native m2 mode now works with Maven 2.1
- (issue 2373)
-
-
-
+ BindException
when using --daemon
with JMX.
+ (issue 14529)
-
- CLI didn't work with "java -jar hudson.war"
- (report)
+ Improved logging and error output from SSHD in Jenkins.
+
-
+ Linking to the
/threadDump
page from /systemInfo
so it is discoverable.
+ -
+ Rekeying operation (from SECURITY-49 fix in 1.498) failed on Windows.
+ (issue 16319)
-
- Link to the jar file in the CLI usage page is made more robust.
- (issue 3621)
+ JNLP slave index page failed to explain how to pass
-jnlpCredentials
.
+ (issue 16273)
-
- "Build after other projects are built" wasn't loading the proper setting.
- (issue 3284)
-
-
- Hudson started as "java -jar hudson.war" can now restart itself on all Unix flavors.
-
-
- When run on GlassFish, Hudson configures GF correctly to handle URI encoding always in UTF-8
-
-
- Added a new extension point to contribute fragment to UDP-based auto discovery.
+ Links should preserve used protocol
+ (issue 16368)
-
- Rolled back changes for JENKINS-3580 - workspace is once again deleted on svn checkout.
- (issue 3580)
+ Don't report the same plugin twice in the update center if the filtering is in effect.
+
-
+ Accept any plugin with a 'test' goal as a test plugin in Maven jobs
+ (issue 8334)
+
-
+ Avoid unnecessary downloads if automatically installed tools are up-to-date
+ (issue 16215)
-
+
- -
- Fixed a binary incompatibility in UpstreamCause that results in NoSuchMethodError. Regression in 1.302.
- (report)
-
-
- The "groovysh" CLI command puts "println" to server stdout, instead of CLI stdout.
+
-
+ Fixed NoClassDefFoundError: Base64 with the -jnlpCredentials option.
+ (issue 9679)
-
+
-
- The elusive 'Not in GZIP format' exception is finally fixed thanks to cristiano_k's great detective work
- (issue 2154)
-
-
- Hudson kept relaunching the slave under the "on-demand" retention strategy.
- (report)
-
-
- Extra slash (/) included in path to workspace copy of svn external.
- (issue 3533)
-
-
- NPE prevents Hudson from starting up on some environments
- (report)
-
-
- Workspace deleted when subversion checkout happens.
- (issue 3580)
-
-
- Hudson now handles unexpected failures in trigger plugins more gracefully.
-
-
- Use 8K buffer to improve remote file copy performance.
- (issue 3524)
-
-
- Hudson now has a CLI
-
-
- Hudson's start up performance is improved by loading data concurrently.
+ The master key that was protecting all the sensitive data in $JENKINS_HOME was vulnerable.
+ (SECURITY-49)
-
+
-
- When a SCM plugin is uninstalled, projects using it should fall back to "No SCM".
-
-
- When polling SCMs, boolean parameter sets default value collectly.
-
-
- Sidebar build descriptions will not have "..." appended unless they have been truncated.
- (issue 3541)
-
-
- Workspace with symlink causes svn exception when updating externals.
- (issue 3532)
-
-
- Hudson now started bundling ssh-slaves plugin out of the box.
-
-
- Added an extension point to programmatically contribute a Subversion authentication credential.
- (report)
-
-
- You can now configure which columns are displayed in a view.
- "Last Stable" was also added as an optional column (not displayed by default).
- (issue 3465)
-
-
- Preventive node monitoring like /tmp size check, swap space size check can be now disabled selectively.
- (issue 2596,
- issue 2552)
-
-
- Per-project read permission support.
- (issue 2324)
+ Delete the oldest build but it still come up on HistoryWidget
+ (issue 16194)
diff --git a/cli/pom.xml b/cli/pom.xml
index b68d1ec4861eba69e4eeee6cb6d0a2d6fb117f24..4b40627511d6a6a72fb5fb4255e574b9c78845de 100644
--- a/cli/pom.xml
+++ b/cli/pom.xml
@@ -5,7 +5,7 @@
pom
org.jenkins-ci.main
- 1.540-SNAPSHOT
+ 1.595-SNAPSHOT
cli
@@ -13,6 +13,16 @@
Jenkins CLI
+
+ org.powermock
+ powermock-module-junit4
+ test
+
+
+ org.powermock
+ powermock-api-mockito
+ test
+
commons-codec
commons-codec
diff --git a/cli/src/main/java/hudson/cli/CLI.java b/cli/src/main/java/hudson/cli/CLI.java
index f8928eeaae995d9c84e9d4c0690803e3d951454f..6a3a05c28773b3bd56e4f93341b9c29df589df0f 100644
--- a/cli/src/main/java/hudson/cli/CLI.java
+++ b/cli/src/main/java/hudson/cli/CLI.java
@@ -23,16 +23,14 @@
*/
package hudson.cli;
-import com.trilead.ssh2.crypto.PEMDecoder;
import hudson.cli.client.Messages;
import hudson.remoting.Channel;
import hudson.remoting.PingThread;
import hudson.remoting.Pipe;
import hudson.remoting.RemoteInputStream;
import hudson.remoting.RemoteOutputStream;
-import hudson.remoting.SocketInputStream;
+import hudson.remoting.SocketChannelStream;
import hudson.remoting.SocketOutputStream;
-import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
@@ -50,7 +48,6 @@ import java.io.Closeable;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
-import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -62,13 +59,10 @@ import java.net.Socket;
import java.net.URL;
import java.net.URLConnection;
import java.security.GeneralSecurityException;
-import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Signature;
-import java.security.spec.DSAPrivateKeySpec;
-import java.security.spec.DSAPublicKeySpec;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -79,8 +73,6 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.logging.Level;
import java.util.logging.Logger;
-import java.io.Console;
-
import static java.util.logging.Level.*;
/**
@@ -209,7 +201,7 @@ public class CLI {
} else {
s = new Socket();
s.connect(clip.endpoint,3000);
- out = new SocketOutputStream(s);
+ out = SocketChannelStream.out(s);
}
closables.add(new Closeable() {
@@ -218,7 +210,7 @@ public class CLI {
}
});
- Connection c = new Connection(new SocketInputStream(s),out);
+ Connection c = new Connection(SocketChannelStream.in(s),out);
switch (clip.version) {
case 1:
@@ -262,7 +254,7 @@ public class CLI {
/**
* If the server advertises CLI endpoint, returns its location.
*/
- private CliPort getCliTcpPort(String url) throws IOException {
+ protected CliPort getCliTcpPort(String url) throws IOException {
URL _url = new URL(url);
if (_url.getHost()==null || _url.getHost().length()==0) {
throw new IOException("Invalid URL: "+url);
@@ -392,7 +384,7 @@ public class CLI {
public static int _main(String[] _args) throws Exception {
List args = Arrays.asList(_args);
- List candidateKeys = new ArrayList();
+ PrivateKeyProvider provider = new PrivateKeyProvider();
boolean sshAuthRequestedExplicitly = false;
String httpProxy=null;
@@ -400,6 +392,8 @@ public class CLI {
if (url==null)
url = System.getenv("HUDSON_URL");
+
+ boolean tryLoadPKey = true;
while(!args.isEmpty()) {
String head = args.get(0);
@@ -426,23 +420,20 @@ public class CLI {
args = args.subList(1,args.size());
continue;
}
+ if (head.equals("-noKeyAuth")) {
+ tryLoadPKey = false;
+ args = args.subList(1,args.size());
+ continue;
+ }
if(head.equals("-i") && args.size()>=2) {
File f = new File(args.get(1));
if (!f.exists()) {
printUsage(Messages.CLI_NoSuchFileExists(f));
return -1;
}
- KeyPair kp;
- try {
- kp = loadKey(f);
- } catch (IOException e) {
- //if the PEM file is encrypted, IOException is thrown
- kp = tryEncryptedFile(f);
- } catch (GeneralSecurityException e) {
- throw new Exception("Failed to load key: "+f,e);
- }
- if(kp != null)
- candidateKeys.add(kp);
+
+ provider.readFrom(f);
+
args = args.subList(2,args.size());
sshAuthRequestedExplicitly = true;
continue;
@@ -463,8 +454,8 @@ public class CLI {
if(args.isEmpty())
args = Arrays.asList("help"); // default to help
- if (candidateKeys.isEmpty())
- addDefaultPrivateKeyLocations(candidateKeys);
+ if (tryLoadPKey && !provider.hasKeys())
+ provider.readFromDefaultLocations();
CLIConnectionFactory factory = new CLIConnectionFactory().url(url).httpsProxyTunnel(httpProxy);
String userInfo = new URL(url).getUserInfo();
@@ -474,10 +465,10 @@ public class CLI {
CLI cli = factory.connect();
try {
- if (!candidateKeys.isEmpty()) {
+ if (provider.hasKeys()) {
try {
// TODO: server verification
- cli.authenticate(candidateKeys);
+ cli.authenticate(provider.getKeys());
} catch (IllegalStateException e) {
if (sshAuthRequestedExplicitly) {
System.err.println("The server doesn't support public key authentication");
@@ -529,103 +520,22 @@ public class CLI {
* Loads RSA/DSA private key in a PEM format into {@link KeyPair}.
*/
public static KeyPair loadKey(File f, String passwd) throws IOException, GeneralSecurityException {
- return loadKey(readPemFile(f), passwd);
+ return PrivateKeyProvider.loadKey(f, passwd);
}
public static KeyPair loadKey(File f) throws IOException, GeneralSecurityException {
- return loadKey(f, null);
- }
-
- private static String readPemFile(File f) throws IOException{
- FileInputStream is = new FileInputStream(f);
- try {
- DataInputStream dis = new DataInputStream(is);
- byte[] bytes = new byte[(int) f.length()];
- dis.readFully(bytes);
- dis.close();
- return new String(bytes);
- } finally {
- is.close();
- }
+ return loadKey(f, null);
}
-
+
/**
* Loads RSA/DSA private key in a PEM format into {@link KeyPair}.
*/
public static KeyPair loadKey(String pemString, String passwd) throws IOException, GeneralSecurityException {
- Object key = PEMDecoder.decode(pemString.toCharArray(), passwd);
- if (key instanceof com.trilead.ssh2.signature.RSAPrivateKey) {
- com.trilead.ssh2.signature.RSAPrivateKey x = (com.trilead.ssh2.signature.RSAPrivateKey)key;
-// System.out.println("ssh-rsa " + new String(Base64.encode(RSASHA1Verify.encodeSSHRSAPublicKey(x.getPublicKey()))));
-
- return x.toJCEKeyPair();
- }
- if (key instanceof com.trilead.ssh2.signature.DSAPrivateKey) {
- com.trilead.ssh2.signature.DSAPrivateKey x = (com.trilead.ssh2.signature.DSAPrivateKey)key;
- KeyFactory kf = KeyFactory.getInstance("DSA");
-// System.out.println("ssh-dsa " + new String(Base64.encode(DSASHA1Verify.encodeSSHDSAPublicKey(x.getPublicKey()))));
-
- return new KeyPair(
- kf.generatePublic(new DSAPublicKeySpec(x.getY(), x.getP(), x.getQ(), x.getG())),
- kf.generatePrivate(new DSAPrivateKeySpec(x.getX(), x.getP(), x.getQ(), x.getG())));
- }
-
- throw new UnsupportedOperationException("Unrecognizable key format: "+key);
+ return PrivateKeyProvider.loadKey(pemString, passwd);
}
public static KeyPair loadKey(String pemString) throws IOException, GeneralSecurityException {
- return loadKey(pemString, null);
- }
-
- private static KeyPair tryEncryptedFile(File f) throws IOException, GeneralSecurityException{
- KeyPair kp = null;
- if(isPemEncrypted(f)){
- String passwd = askForPasswd(f.getCanonicalPath());
- kp = loadKey(f,passwd);
- }
- return kp;
- }
-
- private static boolean isPemEncrypted(File f) throws IOException{
- String pemString = readPemFile(f);
- //simple check if the file is encrypted
- return pemString.contains("4,ENCRYPTED");
- }
-
- @SuppressWarnings("Since15")
- @IgnoreJRERequirement
- private static String askForPasswd(String filePath){
- try {
- Console cons = System.console();
- String passwd = null;
- if (cons != null){
- char[] p = cons.readPassword("%s", "Enter passphrase for "+filePath+":");
- passwd = String.valueOf(p);
- }
- return passwd;
- } catch (LinkageError e) {
- throw new Error("Your private key is encrypted, but we need Java6 to ask you password safely",e);
- }
- }
-
- /**
- * try all the default key locations
- */
- private static void addDefaultPrivateKeyLocations(List keyFileCandidates) {
- File home = new File(System.getProperty("user.home"));
- for (String path : new String[]{".ssh/id_rsa",".ssh/id_dsa",".ssh/identity"}) {
- File key = new File(home,path);
- if (key.exists()) {
- try {
- keyFileCandidates.add(loadKey(key));
- } catch (IOException e) {
- // don't report an error. the user can still see it by using the -i option
- LOGGER.log(FINE, "Failed to load "+key,e);
- } catch (GeneralSecurityException e) {
- LOGGER.log(FINE, "Failed to load " + key, e);
- }
- }
- }
+ return loadKey(pemString, null);
}
/**
diff --git a/cli/src/main/java/hudson/cli/Connection.java b/cli/src/main/java/hudson/cli/Connection.java
index 232970869d95ae3b3206c60cfb3859eb5fd99a87..165a6deb7e6af83adf0ccda8cbe86a474414a65e 100644
--- a/cli/src/main/java/hudson/cli/Connection.java
+++ b/cli/src/main/java/hudson/cli/Connection.java
@@ -23,8 +23,7 @@
*/
package hudson.cli;
-import hudson.remoting.SocketInputStream;
-import hudson.remoting.SocketOutputStream;
+import hudson.remoting.SocketChannelStream;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
@@ -35,7 +34,6 @@ import javax.crypto.SecretKey;
import javax.crypto.interfaces.DHPublicKey;
import javax.crypto.spec.DHParameterSpec;
import javax.crypto.spec.IvParameterSpec;
-import javax.crypto.spec.SecretKeySpec;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
@@ -64,7 +62,7 @@ public class Connection {
public final DataOutputStream dout;
public Connection(Socket socket) throws IOException {
- this(new SocketInputStream(socket),new SocketOutputStream(socket));
+ this(SocketChannelStream.in(socket),SocketChannelStream.out(socket));
}
public Connection(InputStream in, OutputStream out) {
@@ -128,7 +126,11 @@ public class Connection {
}
public byte[] readByteArray() throws IOException {
- byte[] buf = new byte[din.readInt()];
+ int bufSize = din.readInt();
+ if (bufSize < 0) {
+ throw new IOException("DataInputStream unexpectedly returned negative integer");
+ }
+ byte[] buf = new byte[bufSize];
din.readFully(buf);
return buf;
}
diff --git a/cli/src/main/java/hudson/cli/PrivateKeyProvider.java b/cli/src/main/java/hudson/cli/PrivateKeyProvider.java
new file mode 100644
index 0000000000000000000000000000000000000000..834bb7234250d7d7bac2bd424aba5aa670be0fda
--- /dev/null
+++ b/cli/src/main/java/hudson/cli/PrivateKeyProvider.java
@@ -0,0 +1,162 @@
+/*
+ * The MIT License
+ *
+ * Copyright (c) 2014 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package hudson.cli;
+
+import static java.util.logging.Level.FINE;
+
+import java.io.Console;
+import java.io.DataInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.security.KeyFactory;
+import java.security.KeyPair;
+import java.security.spec.DSAPrivateKeySpec;
+import java.security.spec.DSAPublicKeySpec;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.logging.Logger;
+
+import com.trilead.ssh2.crypto.PEMDecoder;
+
+/**
+ * Read DSA or RSA key from file(s) asking for password interactively.
+ *
+ * @author ogondza
+ * @since 1.556
+ */
+public class PrivateKeyProvider {
+
+ private List privateKeys = new ArrayList();
+
+ /**
+ * Get keys read so far.
+ *
+ * @return Possibly empty list. Never null.
+ */
+ public List getKeys() {
+ return Collections.unmodifiableList(privateKeys);
+ }
+
+ public boolean hasKeys() {
+ return !privateKeys.isEmpty();
+ }
+
+ /**
+ * Read keys from default keyFiles
+ *
+ * .ssh/id_rsa, .ssh/id_dsa and .ssh/identity.
+ *
+ * @return true if some key was read successfully.
+ */
+ public boolean readFromDefaultLocations() {
+ final File home = new File(System.getProperty("user.home"));
+
+ boolean read = false;
+ for (String path : new String[] {".ssh/id_rsa", ".ssh/id_dsa", ".ssh/identity"}) {
+ final File key = new File(home, path);
+ if (!key.exists()) continue;
+
+ try {
+
+ readFrom(key);
+ read = true;
+ } catch (IOException e) {
+
+ LOGGER.log(FINE, "Failed to load " + key, e);
+ } catch (GeneralSecurityException e) {
+
+ LOGGER.log(FINE, "Failed to load " + key, e);
+ }
+ }
+
+ return read;
+ }
+
+ /**
+ * Read key from keyFile.
+ */
+ public void readFrom(File keyFile) throws IOException, GeneralSecurityException {
+ final String password = isPemEncrypted(keyFile)
+ ? askForPasswd(keyFile.getCanonicalPath())
+ : null
+ ;
+ privateKeys.add(loadKey(keyFile, password));
+ }
+
+ private static boolean isPemEncrypted(File f) throws IOException{
+ //simple check if the file is encrypted
+ return readPemFile(f).contains("4,ENCRYPTED");
+ }
+
+ private static String askForPasswd(String filePath){
+ Console cons = System.console();
+ String passwd = null;
+ if (cons != null){
+ char[] p = cons.readPassword("%s", "Enter passphrase for " + filePath + ":");
+ passwd = String.valueOf(p);
+ }
+ return passwd;
+ }
+
+ public static KeyPair loadKey(File f, String passwd) throws IOException, GeneralSecurityException {
+ return loadKey(readPemFile(f), passwd);
+ }
+
+ private static String readPemFile(File f) throws IOException{
+ FileInputStream is = new FileInputStream(f);
+ try {
+ DataInputStream dis = new DataInputStream(is);
+ byte[] bytes = new byte[(int) f.length()];
+ dis.readFully(bytes);
+ dis.close();
+ return new String(bytes);
+ } finally {
+ is.close();
+ }
+ }
+
+ public static KeyPair loadKey(String pemString, String passwd) throws IOException, GeneralSecurityException {
+ Object key = PEMDecoder.decode(pemString.toCharArray(), passwd);
+ if (key instanceof com.trilead.ssh2.signature.RSAPrivateKey) {
+ com.trilead.ssh2.signature.RSAPrivateKey x = (com.trilead.ssh2.signature.RSAPrivateKey)key;
+
+ return x.toJCEKeyPair();
+ }
+ if (key instanceof com.trilead.ssh2.signature.DSAPrivateKey) {
+ com.trilead.ssh2.signature.DSAPrivateKey x = (com.trilead.ssh2.signature.DSAPrivateKey)key;
+ KeyFactory kf = KeyFactory.getInstance("DSA");
+
+ return new KeyPair(
+ kf.generatePublic(new DSAPublicKeySpec(x.getY(), x.getP(), x.getQ(), x.getG())),
+ kf.generatePrivate(new DSAPrivateKeySpec(x.getX(), x.getP(), x.getQ(), x.getG())));
+ }
+
+ throw new UnsupportedOperationException("Unrecognizable key format: " + key);
+ }
+
+ private static final Logger LOGGER = Logger.getLogger(PrivateKeyProvider.class.getName());
+}
diff --git a/cli/src/main/resources/hudson/cli/client/Messages.properties b/cli/src/main/resources/hudson/cli/client/Messages.properties
index 567122ab9d49a01f6e0f95debdf0c6dd7a6e466a..699b4c47381227a92f7316331cbdbc3477759213 100644
--- a/cli/src/main/resources/hudson/cli/client/Messages.properties
+++ b/cli/src/main/resources/hudson/cli/client/Messages.properties
@@ -5,6 +5,7 @@ CLI.Usage=Jenkins CLI\n\
-i KEY : SSH private key file used for authentication\n\
-p HOST:PORT : HTTP proxy host and port for HTTPS proxy tunneling. See http://jenkins-ci.org/https-proxy-tunnel\n\
-noCertificateCheck : bypass HTTPS certificate check entirely. Use with caution\n\
+ -noKeyAuth : don't try to load the SSH authentication private key. Conflicts with -i\n\
\n\
The available commands depend on the server. Run the 'help' command to\n\
see the list.
diff --git a/cli/src/main/resources/hudson/cli/client/Messages_pt_BR.properties b/cli/src/main/resources/hudson/cli/client/Messages_pt_BR.properties
index 1131ec8d17d04bacd323a99eaa3669896088d60a..61e1895c4dfb7d5dd96cf0dd4723671fb60c673a 100644
--- a/cli/src/main/resources/hudson/cli/client/Messages_pt_BR.properties
+++ b/cli/src/main/resources/hudson/cli/client/Messages_pt_BR.properties
@@ -1,6 +1,6 @@
# The MIT License
#
-# Copyright (c) 2004-2010, Sun Microsystems, Inc., Reginaldo L. Russinholi, Cleiber Silva
+# Copyright (c) 2004-2010, Sun Microsystems, Inc., Reginaldo L. Russinholi, Cleiber Silva, Fernando Boaglio
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
@@ -20,22 +20,17 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-# Version mismatch. This CLI cannot work with this Hudson server
-CLI.VersionMismatch=A vers\ufffdo n\ufffdo coincide. Esta CLI n\ufffdo pode funcionar com este servidor Hudson
-# Hudson CLI\n\
-# Usage: java -jar jenkins-cli.jar [-s URL] command [opts...] args...\n\
-# Options:\n\
-# \ -s URL : specify the server URL (defaults to the JENKINS_URL env var)\n\
-# \n\
-# The available commands depend on the server. Run the 'help' command to\n\
-# see the list.
+CLI.VersionMismatch=A vers\u00e3o n\u00e3o coincide. Esta CLI n\u00e3o pode funcionar com este servidor Jenkins
CLI.Usage=Jenkins CLI\n\
- Uso: java -jar jenkins-cli.jar [-s URL] comando [op\ufffd\ufffdes...] par\ufffdmetros...\n\
- Op\ufffd\ufffdes:\n\
- \ -s URL : a URL do servidor (por padr\ufffdo a vari\ufffdvel de ambiente JENKINS_URL \ufffd usada)\n\
+ Uso: java -jar jenkins-cli.jar [-s URL] comando [op\u00e7\u00f5es...] par\u00e2metros...\n\
+ Op\u00e7\u00f5es:\n\
+ -s URL : a URL do servidor (por padr\u00e3o a vari\u00e1vel de ambiente JENKINS_URL \u00e9 usada)\n\
+ -i KEY : arquivo contendo a chave SSH privada usada para autentica\u00e7\u00e3o\n\
+ -p HOST:PORT : host e porta do proxy HTTP para tunelamento de proxy HTTPS. Veja http://jenkins-ci.org/https-proxy-tunnel\n\
+ -noCertificateCheck : ignora completamente a valida\u00e7\u00e3o dos certificados HTTPS. Use com cautela\n\
+ -noKeyAuth : n\u00e3o tenta carregar a chave privada para autentica\u00e7\u00e3o SSH. Conflita com -i\n\
\n\
- Os comandos dispon\ufffdveis dependem do servidor. Execute o comando 'help' para\n\
+ Os comandos dispon\u00edveis dependem do servidor. Execute o comando 'help' para\n\
ver a lista.
-
-# Neither -s nor the JENKINS_URL env var is specified.
-CLI.NoURL=N\ufffdo foi especificado nem '-s' e nem a vari\ufffdvel de ambiente JENKINS_URL
+CLI.NoURL=N\u00e3o foi especificado nem '-s' e nem a vari\u00e1vel de ambiente JENKINS_URL
+CLI.NoSuchFileExists=O arquivo n\u00e3o existe: {0}
diff --git a/cli/src/test/java/hudson/cli/ConnectionMockTest.java b/cli/src/test/java/hudson/cli/ConnectionMockTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..77b319a4d249ee6856bdc60b66e5bd217c3829af
--- /dev/null
+++ b/cli/src/test/java/hudson/cli/ConnectionMockTest.java
@@ -0,0 +1,56 @@
+/*
+ * The MIT License
+ *
+ * Copyright (c) 2013 Ericsson
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package hudson.cli;
+
+import hudson.remoting.FastPipedInputStream;
+import hudson.remoting.FastPipedOutputStream;
+
+import java.io.DataInputStream;
+import java.io.IOException;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.powermock.api.mockito.PowerMockito.*;
+
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+/**
+ * @author marco.miller@ericsson.com
+ */
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({Connection.class})
+public class ConnectionMockTest {
+
+ @Test
+ public void shouldTolerateEmptyByteArrayUponStreamZeroValue() throws IOException {
+ DataInputStream din = mock(DataInputStream.class);
+ //when(din.readInt()).thenReturn(0) does not work; mock always return 0 for some TBD reason
+ Connection c = new Connection(din, new FastPipedOutputStream(new FastPipedInputStream()));
+ assertTrue(c.readByteArray().length == 0);
+ }
+}
diff --git a/cli/src/test/java/hudson/cli/ConnectionTest.java b/cli/src/test/java/hudson/cli/ConnectionTest.java
index e9cc086affda83a0987cd65735986ce54553cb40..167198a182368440cb5fa045f2959b891c489ec4 100644
--- a/cli/src/test/java/hudson/cli/ConnectionTest.java
+++ b/cli/src/test/java/hudson/cli/ConnectionTest.java
@@ -28,7 +28,7 @@ public class ConnectionTest extends Assert {
}
@Test
- public void testEncyrpt() throws Throwable {
+ public void testEncrypt() throws Throwable {
final SecretKey sessionKey = new SecretKeySpec(new byte[16],"AES");
Thread t1 = new Thread() {
@@ -56,15 +56,17 @@ public class ConnectionTest extends Assert {
};
t2.start();
- t1.join(3000);
- t2.join(3000);
+ t1.join(9999);
+ t2.join(9999);
+
+ if (e != null) {
+ throw e;
+ }
if (t1.isAlive() || t2.isAlive()) {
t1.interrupt();
t2.interrupt();
throw new Error("thread is still alive");
}
-
- if (e!=null) throw e;
}
}
diff --git a/cli/src/test/java/hudson/cli/PrivateKeyProviderTest.java b/cli/src/test/java/hudson/cli/PrivateKeyProviderTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..376b1fa815f3f62988f741c93a63f2f2d090563a
--- /dev/null
+++ b/cli/src/test/java/hudson/cli/PrivateKeyProviderTest.java
@@ -0,0 +1,140 @@
+/*
+ * The MIT License
+ *
+ * Copyright (c) 2014 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package hudson.cli;
+
+import static org.mockito.Mockito.verify;
+import static org.powermock.api.mockito.PowerMockito.doReturn;
+import static org.powermock.api.mockito.PowerMockito.mock;
+import static org.powermock.api.mockito.PowerMockito.mockStatic;
+import static org.powermock.api.mockito.PowerMockito.whenNew;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.security.GeneralSecurityException;
+import java.security.Key;
+import java.security.KeyPair;
+import java.util.Arrays;
+
+import org.hamcrest.Description;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentMatcher;
+import org.mockito.Mockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest(CLI.class) // When mocking new operator caller has to be @PreparedForTest, not class itself
+public class PrivateKeyProviderTest {
+
+ @Test
+ public void specifyKeysExplicitly() throws Exception {
+ final CLI cli = fakeCLI();
+
+ final File dsaKey = keyFile(".ssh/id_dsa");
+ final File rsaKey = keyFile(".ssh/id_rsa");
+
+ run("-i", dsaKey.getAbsolutePath(), "-i", rsaKey.getAbsolutePath(), "-s", "http://example.com");
+
+ verify(cli).authenticate(withKeyPairs(
+ keyPair(dsaKey),
+ keyPair(rsaKey)
+ ));
+ }
+
+ @Test
+ public void useDefaultKeyLocations() throws Exception {
+ final CLI cli = fakeCLI();
+
+ final File rsaKey = keyFile(".ssh/id_rsa");
+ final File dsaKey = keyFile(".ssh/id_dsa");
+
+ fakeHome();
+ run("-s", "http://example.com");
+
+ verify(cli).authenticate(withKeyPairs(
+ keyPair(rsaKey),
+ keyPair(dsaKey)
+ ));
+ }
+
+ private CLI fakeCLI() throws Exception {
+ final CLI cli = mock(CLI.class);
+
+ final CLIConnectionFactory factory = mock(CLIConnectionFactory.class, Mockito.CALLS_REAL_METHODS);
+ factory.jenkins = new URL("http://example.com");
+ doReturn(cli).when(factory).connect();
+
+ mockStatic(CLIConnectionFactory.class);
+ whenNew(CLIConnectionFactory.class).withNoArguments().thenReturn(factory);
+
+ return cli;
+ }
+
+ private void fakeHome() throws URISyntaxException {
+ final File home = new File(this.getClass().getResource(".ssh").toURI()).getParentFile();
+ System.setProperty("user.home", home.getAbsolutePath());
+ }
+
+ private int run(String... args) throws Exception {
+ return CLI._main(args);
+ }
+
+ private File keyFile(String name) throws URISyntaxException {
+ return new File(this.getClass().getResource(name).toURI());
+ }
+
+ private KeyPair keyPair(File file) throws IOException, GeneralSecurityException {
+ return PrivateKeyProvider.loadKey(file, null);
+ }
+
+ private Iterable withKeyPairs(final KeyPair... expected) {
+ return Mockito.argThat(new ArgumentMatcher>() {
+ @Override public void describeTo(Description description) {
+ description.appendText(Arrays.asList(expected).toString());
+ }
+
+ @Override public boolean matches(Object argument) {
+ if (!(argument instanceof Iterable)) throw new IllegalArgumentException("Not an instance of Iterrable");
+
+ @SuppressWarnings("unchecked")
+ final Iterable actual = (Iterable) argument;
+ int i = 0;
+ for (KeyPair akp: actual) {
+ if (!eq(expected[i].getPublic(), akp.getPublic())) return false;
+ if (!eq(expected[i].getPrivate(), akp.getPrivate())) return false;
+ i++;
+ }
+
+ return i == expected.length;
+ }
+
+ private boolean eq(final Key expected, final Key actual) {
+ return Arrays.equals(expected.getEncoded(), actual.getEncoded());
+ }
+ });
+ }
+}
diff --git a/cli/src/test/resources/hudson/cli/.ssh/id_dsa b/cli/src/test/resources/hudson/cli/.ssh/id_dsa
new file mode 100644
index 0000000000000000000000000000000000000000..be556daa6d02984101686a02939b6777c780db86
--- /dev/null
+++ b/cli/src/test/resources/hudson/cli/.ssh/id_dsa
@@ -0,0 +1,12 @@
+-----BEGIN DSA PRIVATE KEY-----
+MIIBugIBAAKBgQCA9mMzB1O52hpObIyaJXgFJQUmc1HV0NEJXsFFGh8U2l0Tkgv4
+fp3MWadiAMmc5H1ot4KQLXl7SwU7dHCCFcGcfQiOjeD5rWeZuHoPAJSDMilcJGE3
+Xo2C+wlescTByEgRRA16vdSlNaDJXKVxq9Wr59G8P4JC6/5EvpeypgYdTQIVAMTf
+aC0O2EGLnJrNBsUdc1s+iUp9AoGAZA7pZYPMJHJWTanJb2DlWHn/QM63jfh38N6W
+ERzmQQks6QdS7UkFlg9cbVGUtn0Yz2SfX3VKiMXNMkAdGD8loBcJS5w6oMMU7rcj
+lldRQ63+fMgdVZYMF5bchC6RhQeGZQ8Imf2iFF28SsE4bi+K12HYgIO5bFxPFUTH
+WSWsMLcCgYBgHJ90ZLU400axB5P0qw/0s4arPD0g53Vzi/Y2h5TJr3KPF2sEIbAc
+2gpFEzUNY0hvH6REKJ+VPPUvlH6ieaXomW8pSGjv4SdxZhJRrDe+Ac/xQse1QdYx
+uWJzpVm3cIGfqLxmQnrklnutI/1F62VZQlq9vjiZL7ir/00vdUTYHwIUUkttGGgl
+a0rWLzPTPF4X4lZfFhk=
+-----END DSA PRIVATE KEY-----
diff --git a/cli/src/test/resources/hudson/cli/.ssh/id_dsa.pub b/cli/src/test/resources/hudson/cli/.ssh/id_dsa.pub
new file mode 100644
index 0000000000000000000000000000000000000000..4a42a845727297abcfa1c1204d0a270392c5a9a6
--- /dev/null
+++ b/cli/src/test/resources/hudson/cli/.ssh/id_dsa.pub
@@ -0,0 +1 @@
+ssh-dss AAAAB3NzaC1kc3MAAACBAID2YzMHU7naGk5sjJoleAUlBSZzUdXQ0QlewUUaHxTaXROSC/h+ncxZp2IAyZzkfWi3gpAteXtLBTt0cIIVwZx9CI6N4PmtZ5m4eg8AlIMyKVwkYTdejYL7CV6xxMHISBFEDXq91KU1oMlcpXGr1avn0bw/gkLr/kS+l7KmBh1NAAAAFQDE32gtDthBi5yazQbFHXNbPolKfQAAAIBkDullg8wkclZNqclvYOVYef9AzreN+Hfw3pYRHOZBCSzpB1LtSQWWD1xtUZS2fRjPZJ9fdUqIxc0yQB0YPyWgFwlLnDqgwxTutyOWV1FDrf58yB1VlgwXltyELpGFB4ZlDwiZ/aIUXbxKwThuL4rXYdiAg7lsXE8VRMdZJawwtwAAAIBgHJ90ZLU400axB5P0qw/0s4arPD0g53Vzi/Y2h5TJr3KPF2sEIbAc2gpFEzUNY0hvH6REKJ+VPPUvlH6ieaXomW8pSGjv4SdxZhJRrDe+Ac/xQse1QdYxuWJzpVm3cIGfqLxmQnrklnutI/1F62VZQlq9vjiZL7ir/00vdUTYHw== ogondza@localhost.localdomain
diff --git a/cli/src/test/resources/hudson/cli/.ssh/id_rsa b/cli/src/test/resources/hudson/cli/.ssh/id_rsa
new file mode 100644
index 0000000000000000000000000000000000000000..ee2ad6b569a3b5ebbea0d5d1bfcf6ed2bd0dbe27
--- /dev/null
+++ b/cli/src/test/resources/hudson/cli/.ssh/id_rsa
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpAIBAAKCAQEAyTqwFqp5Ww2Tr/52D7hhdOwgzYGBUqxrOFopa+kjNEL1Yqwb
++mApUWZ+D3zN9PurhUcVUfeYVXiYWFJ0kG72HIJawL/0BR5oYxRJfumK8Z/sAzAL
+xdhc5O5twETrr9gU3cxtvF5oJNP0I9HickAOeC+ZNpiDIIblrhvxXl/QwqrR+/Gv
+Nb8TApj+rxXEfNp+N69iGnnxzWn1FeKeOAWpwoBAxZNoqBQAFacF7xfQnoygyekC
+xk+ts2O5Zzv8iJ10sVf+x2Q79rxAtsc0xOGhZbBAzbmFTz0PE4iWuo/Vo1c6mM7u
+/dam+FxB2NqPNw7W+4eiCnEVkiQZlrxmuGvK7wIDAQABAoIBACml1+QZDFzoBnUa
+eVzvkFwesvtVnmp5/QcAwinvarXaVedCL9g2JtcOG3EhJ49YtzsyZxs7329xMja1
+eiKalJ157UaPc/XLQVegT0XRGEzCCJrwSr979F39awGsQgt28XqmYN/nui5FH/Z5
+7iAvWc9OKqu+DQWiZc8PQXmC4zYmvhGQ8vKx44RSqlWCjd9IqBVhpE5gxpI/SmCx
+umUNNtoH0hBWr+MsVHzr6UUrC3a99+7bB4We8XMXXFLzbTUSgiYFmK+NxPs/Fux/
+IAyXAMbDw2HeqZ7g4kTaf4cvmVOwhh4zlvB4p7j301LdO1jmvs9z0fn/QJcTpVM7
+ISMKwAECgYEA/uKVdmOKTk3dKzKRFXtWJjqypOXakoX+25lUcVv2PXYRr8Sln9jC
+A13fbhvwq+FqbdnNlB23ag5niCVLfUpB1DYYP5jd4lU8D6HZQiHlmokB6nLT9NIW
+iTcG88E58Bta/l1Ue5Yn+LqluBC4i289wFbH1kZyxQ565s5dJEv9uAECgYEAyhwF
+ZOqTK2lZe5uuN4owVLQaYFj9fsdFHULzlK/UAtkG1gCJhjBmwSEpZFFMH6WgwHk5
+SHJEom0uB4qRv8gQcxl9OSiDsp56ymr0NBhlPVXWr6IzLotLy5XBC1muqvYYlj7E
+kHgSet/h8RUM/FeEiwOFHDU2DkMb8Qx1hfMdAu8CgYBSEsYL9CuB4WK5WTQMlcV8
+0+PYY0dJbSpOrgXZ5sHYsp8pWQn3+cUnbl/WxdpujkxGCR9AdX0tAmxmE5RGSNX/
+rleKiv/PtKB9bCFYQS/83ecnBkioCcpF7tknPm4YmcZoJ8dfcE94sSlRpti11WEu
+AQOiRNcKCwqaLZMib/HIAQKBgQCdiOffeERMYypfgcJzAiCX9WZV0SeOCS7jFwub
+ys17hsSgS/zl/pYpVXrY+dFXHZfGTvcKdB7xaB6nvCfND9lajfSgd+bndEYLvwAo
+Fxfajizv64LvdZ4XytuUyEuwcHBLtBMs9Jqa8iU/8AOWMXVbkdvQV92RkleWNPrp
+9MyZOwKBgQD9x8MnX5LVBfQKuL9qX6l9Da06EyMkzfz3obKn9AAJ3Xj9+45TNPJu
+HnZyvJWesl1vDjXQTm+PVkdyE0WQgoiVX+wxno0hsoly5Uqb5EYHtTUrZzRpkyLK
+1VmtDxT5D8gorUgn6crzk4PKaxRkPfAimZdlkQm6iOtuR3kqn5BtIQ==
+-----END RSA PRIVATE KEY-----
diff --git a/cli/src/test/resources/hudson/cli/.ssh/id_rsa.pub b/cli/src/test/resources/hudson/cli/.ssh/id_rsa.pub
new file mode 100644
index 0000000000000000000000000000000000000000..91f8ff7180e5f05f989b9aec2104d102372e88a4
--- /dev/null
+++ b/cli/src/test/resources/hudson/cli/.ssh/id_rsa.pub
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJOrAWqnlbDZOv/nYPuGF07CDNgYFSrGs4Wilr6SM0QvVirBv6YClRZn4PfM30+6uFRxVR95hVeJhYUnSQbvYcglrAv/QFHmhjFEl+6Yrxn+wDMAvF2Fzk7m3AROuv2BTdzG28Xmgk0/Qj0eJyQA54L5k2mIMghuWuG/FeX9DCqtH78a81vxMCmP6vFcR82n43r2IaefHNafUV4p44BanCgEDFk2ioFAAVpwXvF9CejKDJ6QLGT62zY7lnO/yInXSxV/7HZDv2vEC2xzTE4aFlsEDNuYVPPQ8TiJa6j9WjVzqYzu791qb4XEHY2o83Dtb7h6IKcRWSJBmWvGa4a8rv your_email@example.com
diff --git a/core/move-l10n.groovy b/core/move-l10n.groovy
new file mode 100644
index 0000000000000000000000000000000000000000..d774ec50d4817573f8d4ba37a33632745a1f63b9
--- /dev/null
+++ b/core/move-l10n.groovy
@@ -0,0 +1,33 @@
+// Usage: groovy move-l10n.groovy hudson/model/OldClass/old-view jenkins/model/NewClass/new-view 'Some\ Translatable\ Text'
+// (The new view may be given as '-' to simply delete the key.)
+
+def oldview = args[0];
+def newview = args[1];
+def key = args[2];
+
+def scriptDir = new File(getClass().protectionDomain.codeSource.location.path).parent;
+def resDir = new File(scriptDir, 'src/main/resources');
+
+def basename = new File(resDir, oldview).name;
+for (p in new File(resDir, oldview).parentFile.listFiles()) {
+ def n = p.name;
+ if (n == "${basename}.properties" || n.startsWith("${basename}_") && n.endsWith(".properties")) {
+ def lines = p.readLines('ISO-8859-1');
+ def matches = lines.findAll({it.startsWith("${key}=")});
+ if (!matches.isEmpty()) {
+ lines.removeAll(matches);
+ p.withWriter('ISO-8859-1') {out ->
+ lines.each {line -> out.writeLine(line)}
+ }
+ if (newview == '-') {
+ println("deleting ${matches.size()} matches from ${n}");
+ } else {
+ def nue = new File(resDir, newview + n.substring(basename.length()));
+ println("moving ${matches.size()} matches from ${n} to ${nue.name}");
+ nue.withWriterAppend('ISO-8859-1') {out ->
+ matches.each {line -> out.writeLine(line)}
+ }
+ }
+ }
+ }
+}
diff --git a/core/pom.xml b/core/pom.xml
index dbd734511cb04d17e1bb8841d731df175e75b100..87c29d78a71e960a5625838114f5953acf91a87f 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -29,7 +29,7 @@ THE SOFTWARE.
org.jenkins-ci.main
pom
- 1.540-SNAPSHOT
+ 1.595-SNAPSHOT
../pom.xml
@@ -42,12 +42,17 @@ THE SOFTWARE.
true
- 1.222
+ 1.233
2.5.6.SEC03
1.8.9
+
+ org.jenkins-ci.plugins.icon-shim
+ icon-set
+ 1.0.3
+
${project.groupId}
remoting
@@ -97,7 +102,7 @@ THE SOFTWARE.
org.jruby.ext.posix
jna-posix
- 1.0.3
+ 1.0.3-jenkins-1
com.github.jnr
@@ -112,7 +117,7 @@ THE SOFTWARE.
org.jenkins-ci
trilead-ssh2
- build217-jenkins-3
+ build217-jenkins-8
org.kohsuke.stapler
@@ -151,7 +156,7 @@ THE SOFTWARE.
org.kohsuke.stapler
stapler-adjunct-zeroclipboard
- 1.1.7-1
+ 1.3.5-1
org.kohsuke.stapler
@@ -161,7 +166,7 @@ THE SOFTWARE.
org.kohsuke.stapler
stapler-adjunct-codemirror
- 1.2
+ 1.3
org.kohsuke.stapler
@@ -174,7 +179,7 @@ THE SOFTWARE.
com.infradna.tool
bridge-method-annotation
- 1.9
+ 1.13
@@ -186,7 +191,7 @@ THE SOFTWARE.
commons-httpclient
commons-httpclient
-
+
args4j
args4j
2.0.23
@@ -194,17 +199,17 @@ THE SOFTWARE.
org.jenkins-ci
annotation-indexer
- 1.6
+ 1.7
org.jenkins-ci
bytecode-compatibility-transformer
- 1.4
+ 1.5
- org.jvnet.hudson
+ org.jenkins-ci
task-reactor
- 1.2
+ 1.4
org.jvnet.localizer
@@ -219,7 +224,17 @@ THE SOFTWARE.
org.jvnet.hudson
xstream
- 1.4.4-jenkins-4
+ 1.4.7-jenkins-1
+
+
+ xmlpull
+ xmlpull
+
+
+ xpp3
+ xpp3_min
+
+
jfree
@@ -469,12 +484,12 @@ THE SOFTWARE.
org.jvnet.winp
winp
- 1.16
+ 1.22
org.jenkins-ci
memory-monitor
- 1.7
+ 1.9
org.codehaus.woodstox
@@ -489,7 +504,7 @@ THE SOFTWARE.
net.java.dev.jna
jna
- 3.3.0-jenkins-3
+ 4.1.0
org.kohsuke
@@ -499,7 +514,7 @@ THE SOFTWARE.
org.kohsuke
libpam4j
- 1.6
+ 1.8
org.jvnet.libzfs
@@ -517,14 +532,9 @@ THE SOFTWARE.
1.9
- org.jenkins-ci
- jinterop-wmi
- 1.1
-
-
- org.jenkins-ci
- windows-remote-command
- 1.4
+ org.kohsuke.jinterop
+ j-interop
+ 2.0.6-kohsuke-1
org.kohsuke.metainf-services
@@ -559,9 +569,9 @@ THE SOFTWARE.
- org.kohsuke
- owasp-html-sanitizer
- r88
+ commons-fileupload
+ commons-fileupload
+ 1.3.1-jenkins-1
@@ -583,11 +593,11 @@ THE SOFTWARE.
com.google.guava
guava
-
+
com.jcraft
jzlib
- 1.1.3
+ 1.1.3-kohsuke-1
@@ -640,7 +650,6 @@ THE SOFTWARE.
com.infradna.tool
bridge-method-injector
- 1.9
@@ -728,7 +737,7 @@ THE SOFTWARE.
com.sun.winsw
winsw
- 1.13
+ 1.16
bin
exe
${project.build.outputDirectory}/windows-service
@@ -787,7 +796,7 @@ THE SOFTWARE.
org.kohsuke.stapler
maven-stapler-plugin
- 1.16
+ ${maven-stapler-plugin.version}
/lib/.*
diff --git a/core/src/main/groovy/hudson/util/LoadMonitor.groovy b/core/src/main/groovy/hudson/util/LoadMonitor.groovy
index 804094d2a4560aacbb2f186f42b42bd3aa309bc1..97d701816199c011e67c6fcc39e539563442f225 100644
--- a/core/src/main/groovy/hudson/util/LoadMonitor.groovy
+++ b/core/src/main/groovy/hudson/util/LoadMonitor.groovy
@@ -24,6 +24,7 @@
package hudson.util
import hudson.model.Computer
+import jenkins.util.Timer
import jenkins.model.Jenkins
import hudson.model.Label
import hudson.model.Queue.BlockedItem
@@ -31,7 +32,7 @@ import hudson.model.Queue.BuildableItem
import hudson.model.Queue.WaitingItem
import hudson.triggers.SafeTimerTask
import java.text.DateFormat
-import hudson.triggers.Trigger;
+import java.util.concurrent.TimeUnit
/**
* Spits out the load information.
@@ -51,7 +52,7 @@ public class LoadMonitorImpl extends SafeTimerTask {
this.dataFile = dataFile;
labels = Jenkins.getInstance().labels*.name;
printHeaders();
- Trigger.timer.scheduleAtFixedRate(this,0,10*1000);
+ Timer.get().scheduleAtFixedRate(this,0,10*1000, TimeUnit.MILLISECONDS);
}
private String quote(Object s) { "\"${s}\""; }
diff --git a/core/src/main/java/hudson/ClassicPluginStrategy.java b/core/src/main/java/hudson/ClassicPluginStrategy.java
index 481fa468712fc9e6fbe919c87727145a76750118..75d1414acc7273d3b032a2dc048bb56f40df3263 100644
--- a/core/src/main/java/hudson/ClassicPluginStrategy.java
+++ b/core/src/main/java/hudson/ClassicPluginStrategy.java
@@ -27,16 +27,15 @@ import com.google.common.collect.Lists;
import hudson.Plugin.DummyImpl;
import hudson.PluginWrapper.Dependency;
import hudson.model.Hudson;
+import jenkins.util.AntClassLoader;
import hudson.util.CyclicGraphDetector;
import hudson.util.CyclicGraphDetector.CycleDetectedException;
-import hudson.util.IOException2;
import hudson.util.IOUtils;
import hudson.util.MaskingClassLoader;
import hudson.util.VersionNumber;
import jenkins.ClassLoaderReflectionToolkit;
import jenkins.ExtensionFilter;
import org.apache.commons.io.output.NullOutputStream;
-import org.apache.tools.ant.AntClassLoader;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Expand;
@@ -57,7 +56,6 @@ import java.io.FileInputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
@@ -68,12 +66,15 @@ import java.util.HashSet;
import java.util.List;
import java.util.Vector;
import java.util.jar.Attributes;
+import java.util.jar.JarFile;
import java.util.jar.Manifest;
import java.util.logging.Level;
import java.util.logging.Logger;
+import org.jenkinsci.bytecode.Transformer;
+
+import static org.apache.commons.io.FilenameUtils.getBaseName;
public class ClassicPluginStrategy implements PluginStrategy {
- private final ClassLoaderReflectionToolkit clt = new ClassLoaderReflectionToolkit();
/**
* Filter for jar files.
@@ -95,41 +96,74 @@ public class ClassicPluginStrategy implements PluginStrategy {
this.pluginManager = pluginManager;
}
- public PluginWrapper createPluginWrapper(File archive) throws IOException {
+ @Override public String getShortName(File archive) throws IOException {
+ Manifest manifest;
+ if (isLinked(archive)) {
+ manifest = loadLinkedManifest(archive);
+ } else {
+ JarFile jf = new JarFile(archive, false);
+ try {
+ manifest = jf.getManifest();
+ } finally {
+ jf.close();
+ }
+ }
+ return PluginWrapper.computeShortName(manifest, archive.getName());
+ }
+
+ private static boolean isLinked(File archive) {
+ return archive.getName().endsWith(".hpl") || archive.getName().endsWith(".jpl");
+ }
+
+ private static Manifest loadLinkedManifest(File archive) throws IOException {
+ // resolve the .hpl file to the location of the manifest file
+ try {
+ // Locate the manifest
+ String firstLine;
+ FileInputStream manifestHeaderInput = new FileInputStream(archive);
+ try {
+ firstLine = IOUtils.readFirstLine(manifestHeaderInput, "UTF-8");
+ } finally {
+ manifestHeaderInput.close();
+ }
+ if (firstLine.startsWith("Manifest-Version:")) {
+ // this is the manifest already
+ } else {
+ // indirection
+ archive = resolve(archive, firstLine);
+ }
+
+ // Read the manifest
+ FileInputStream manifestInput = new FileInputStream(archive);
+ try {
+ return new Manifest(manifestInput);
+ } finally {
+ manifestInput.close();
+ }
+ } catch (IOException e) {
+ throw new IOException("Failed to load " + archive, e);
+ }
+ }
+
+ @Override public PluginWrapper createPluginWrapper(File archive) throws IOException {
final Manifest manifest;
URL baseResourceURL;
File expandDir = null;
// if .hpi, this is the directory where war is expanded
- boolean isLinked = archive.getName().endsWith(".hpl") || archive.getName().endsWith(".jpl");
+ boolean isLinked = isLinked(archive);
if (isLinked) {
- // resolve the .hpl file to the location of the manifest file
- final String firstLine = IOUtils.readFirstLine(new FileInputStream(archive), "UTF-8");
- if (firstLine.startsWith("Manifest-Version:")) {
- // this is the manifest already
- } else {
- // indirection
- archive = resolve(archive, firstLine);
- }
- // then parse manifest
- FileInputStream in = new FileInputStream(archive);
- try {
- manifest = new Manifest(in);
- } catch (IOException e) {
- throw new IOException2("Failed to load " + archive, e);
- } finally {
- in.close();
- }
+ manifest = loadLinkedManifest(archive);
} else {
if (archive.isDirectory()) {// already expanded
expandDir = archive;
} else {
- expandDir = new File(archive.getParentFile(), PluginWrapper.getBaseName(archive));
+ expandDir = new File(archive.getParentFile(), getBaseName(archive.getName()));
explode(archive, expandDir);
}
- File manifestFile = new File(expandDir, "META-INF/MANIFEST.MF");
+ File manifestFile = new File(expandDir, PluginWrapper.MANIFEST_FILENAME);
if (!manifestFile.exists()) {
throw new IOException(
"Plugin installation failed. No manifest at "
@@ -273,7 +307,11 @@ public class ClassicPluginStrategy implements PluginStrategy {
new DetachedPlugin("ldap","1.467.*","1.0"),
new DetachedPlugin("pam-auth","1.467.*","1.0"),
new DetachedPlugin("mailer","1.493.*","1.2"),
- new DetachedPlugin("matrix-auth","1.535.*","1.0.2")
+ new DetachedPlugin("matrix-auth","1.535.*","1.0.2"),
+ new DetachedPlugin("windows-slaves","1.547.*","1.0"),
+ new DetachedPlugin("antisamy-markup-formatter","1.553.*","1.0"),
+ new DetachedPlugin("matrix-project","1.561.*","1.0"),
+ new DetachedPlugin("junit","1.577.*","1.0")
);
/**
@@ -314,7 +352,7 @@ public class ClassicPluginStrategy implements PluginStrategy {
List> r = Lists.newArrayList();
for (ExtensionFinder finder : finders) {
try {
- r.addAll(finder._find(type, hudson));
+ r.addAll(finder.find(type, hudson));
} catch (AbstractMethodError e) {
// backward compatibility
for (T t : finder.findExtensions(type, hudson))
@@ -350,13 +388,13 @@ public class ClassicPluginStrategy implements PluginStrategy {
}
wrapper.setPlugin((Plugin) o);
} catch (LinkageError e) {
- throw new IOException2("Unable to load " + className + " from " + wrapper.getShortName(),e);
+ throw new IOException("Unable to load " + className + " from " + wrapper.getShortName(),e);
} catch (ClassNotFoundException e) {
- throw new IOException2("Unable to load " + className + " from " + wrapper.getShortName(),e);
+ throw new IOException("Unable to load " + className + " from " + wrapper.getShortName(),e);
} catch (IllegalAccessException e) {
- throw new IOException2("Unable to create instance of " + className + " from " + wrapper.getShortName(),e);
+ throw new IOException("Unable to create instance of " + className + " from " + wrapper.getShortName(),e);
} catch (InstantiationException e) {
- throw new IOException2("Unable to create instance of " + className + " from " + wrapper.getShortName(),e);
+ throw new IOException("Unable to create instance of " + className + " from " + wrapper.getShortName(),e);
}
}
@@ -367,7 +405,7 @@ public class ClassicPluginStrategy implements PluginStrategy {
startPlugin(wrapper);
} catch(Throwable t) {
// gracefully handle any error in plugin.
- throw new IOException2("Failed to initialize",t);
+ throw new IOException("Failed to initialize",t);
}
} finally {
Thread.currentThread().setContextClassLoader(old);
@@ -378,6 +416,36 @@ public class ClassicPluginStrategy implements PluginStrategy {
plugin.getPlugin().start();
}
+ @Override
+ public void updateDependency(PluginWrapper depender, PluginWrapper dependee) {
+ DependencyClassLoader classLoader = findAncestorDependencyClassLoader(depender.classLoader);
+ if (classLoader != null) {
+ classLoader.updateTransientDependencies();
+ LOGGER.log(Level.INFO, "Updated dependency of {0}", depender.getShortName());
+ }
+ }
+
+ private DependencyClassLoader findAncestorDependencyClassLoader(ClassLoader classLoader)
+ {
+ for (; classLoader != null; classLoader = classLoader.getParent()) {
+ if (classLoader instanceof DependencyClassLoader) {
+ return (DependencyClassLoader)classLoader;
+ }
+
+ if (classLoader instanceof AntClassLoader) {
+ // AntClassLoaders hold parents not only as AntClassLoader#getParent()
+ // but also as AntClassLoader#getConfiguredParent()
+ DependencyClassLoader ret = findAncestorDependencyClassLoader(
+ ((AntClassLoader)classLoader).getConfiguredParent()
+ );
+ if (ret != null) {
+ return ret;
+ }
+ }
+ }
+ return null;
+ }
+
private static File resolve(File base, String relative) {
File rel = new File(relative);
if(rel.isAbsolute())
@@ -427,7 +495,7 @@ public class ClassicPluginStrategy implements PluginStrategy {
unzipExceptClasses(archive, destDir, prj);
createClassJarFromWebInfClasses(archive, destDir, prj);
} catch (BuildException x) {
- throw new IOException2("Failed to expand " + archive,x);
+ throw new IOException("Failed to expand " + archive,x);
}
try {
@@ -524,6 +592,11 @@ public class ClassicPluginStrategy implements PluginStrategy {
this.dependencies = dependencies;
}
+ private void updateTransientDependencies() {
+ // This will be recalculated at the next time.
+ transientDependencies = null;
+ }
+
private List getTransitiveDependencies() {
if (transientDependencies==null) {
CyclicGraphDetector cgd = new CyclicGraphDetector() {
@@ -568,10 +641,10 @@ public class ClassicPluginStrategy implements PluginStrategy {
if (PluginManager.FAST_LOOKUP) {
for (PluginWrapper pw : getTransitiveDependencies()) {
try {
- Class c = clt.findLoadedClass(pw.classLoader,name);
+ Class> c = ClassLoaderReflectionToolkit._findLoadedClass(pw.classLoader, name);
if (c!=null) return c;
- return clt.findClass(pw.classLoader,name);
- } catch (InvocationTargetException e) {
+ return ClassLoaderReflectionToolkit._findClass(pw.classLoader, name);
+ } catch (ClassNotFoundException e) {
//not found. try next
}
}
@@ -595,15 +668,11 @@ public class ClassicPluginStrategy implements PluginStrategy {
HashSet result = new HashSet();
if (PluginManager.FAST_LOOKUP) {
- try {
for (PluginWrapper pw : getTransitiveDependencies()) {
- Enumeration urls = clt.findResources(pw.classLoader, name);
+ Enumeration urls = ClassLoaderReflectionToolkit._findResources(pw.classLoader, name);
while (urls != null && urls.hasMoreElements())
result.add(urls.nextElement());
}
- } catch (InvocationTargetException e) {
- throw new Error(e);
- }
} else {
for (Dependency dep : dependencies) {
PluginWrapper p = pluginManager.getPlugin(dep.shortName);
@@ -621,14 +690,10 @@ public class ClassicPluginStrategy implements PluginStrategy {
@Override
protected URL findResource(String name) {
if (PluginManager.FAST_LOOKUP) {
- try {
for (PluginWrapper pw : getTransitiveDependencies()) {
- URL url = clt.findResource(pw.classLoader,name);
+ URL url = ClassLoaderReflectionToolkit._findResource(pw.classLoader, name);
if (url!=null) return url;
}
- } catch (InvocationTargetException e) {
- throw new Error(e);
- }
} else {
for (Dependency dep : dependencies) {
PluginWrapper p = pluginManager.getPlugin(dep.shortName);
@@ -645,8 +710,7 @@ public class ClassicPluginStrategy implements PluginStrategy {
}
/**
- * {@link AntClassLoader} with a few methods exposed and {@link Closeable} support.
- * Deprecated as of Java 7, retained only for Java 5/6.
+ * {@link AntClassLoader} with a few methods exposed, {@link Closeable} support, and {@link Transformer} support.
*/
private final class AntClassLoader2 extends AntClassLoader implements Closeable {
private final Vector pathComponents;
diff --git a/core/src/main/java/hudson/EnvVars.java b/core/src/main/java/hudson/EnvVars.java
index b8600a5ddfc6b1f15c2925f0747f7739c656de52..b2d61ead561da8fdabe82bb65a6c8aee46ff630e 100644
--- a/core/src/main/java/hudson/EnvVars.java
+++ b/core/src/main/java/hudson/EnvVars.java
@@ -23,12 +23,12 @@
*/
package hudson;
-import hudson.remoting.Callable;
import hudson.remoting.VirtualChannel;
import hudson.util.CaseInsensitiveComparator;
import hudson.util.CyclicGraphDetector;
import hudson.util.CyclicGraphDetector.CycleDetectedException;
import hudson.util.VariableResolver;
+import jenkins.security.MasterToSlaveCallable;
import java.io.File;
import java.io.IOException;
@@ -356,6 +356,14 @@ public class EnvVars extends TreeMap {
if (value==null) throw new IllegalArgumentException("Null value not allowed as an environment variable: "+key);
return super.put(key,value);
}
+
+ /**
+ * Add a key/value but only if the value is not-null. Otherwise no-op.
+ */
+ public void putIfNotNull(String key, String value) {
+ if (value!=null)
+ put(key,value);
+ }
/**
* Takes a string that looks like "a=b" and adds that to this map.
@@ -396,7 +404,7 @@ public class EnvVars extends TreeMap {
return channel.call(new GetEnvVars());
}
- private static final class GetEnvVars implements Callable {
+ private static final class GetEnvVars extends MasterToSlaveCallable {
public EnvVars call() {
return new EnvVars(EnvVars.masterEnvVars);
}
diff --git a/core/src/main/java/hudson/ExtensionFinder.java b/core/src/main/java/hudson/ExtensionFinder.java
index c63c9488987e71630d242e657dd4a154ea11bf14..d4dc1ef31bc7ebe0b20ea152a53275044e94f25f 100644
--- a/core/src/main/java/hudson/ExtensionFinder.java
+++ b/core/src/main/java/hudson/ExtensionFinder.java
@@ -143,10 +143,7 @@ public abstract class ExtensionFinder implements ExtensionPoint {
*/
public abstract Collection> find(Class type, Hudson jenkins);
- /**
- * A pointless function to work around what appears to be a HotSpot problem. See JENKINS-5756 and bug 6933067
- * on BugParade for more details.
- */
+ @Deprecated
public Collection> _find(Class type, Hudson hudson) {
return find(type, hudson);
}
@@ -284,6 +281,7 @@ public abstract class ExtensionFinder implements ExtensionPoint {
LOGGER.log(Level.SEVERE, "Failed to create Guice container from all the plugins",e);
// failing to load all bindings are disastrous, so recover by creating minimum that works
// by just including the core
+ // TODO this recovery is pretty much useless; startup crashes anyway
container = Guice.createInjector(new SezpozModule(loadSezpozIndices(Jenkins.class.getClassLoader())));
}
@@ -358,7 +356,7 @@ public abstract class ExtensionFinder implements ExtensionPoint {
// which results in a LinkageError
LOGGER.log(isOptional(item.annotation()) ? Level.FINE : Level.WARNING,
"Failed to load "+item.className(), e);
- } catch (InstantiationException e) {
+ } catch (Exception e) {
LOGGER.log(isOptional(item.annotation()) ? Level.FINE : Level.WARNING,
"Failed to load "+item.className(), e);
}
@@ -481,8 +479,10 @@ public abstract class ExtensionFinder implements ExtensionPoint {
Method m = ClassLoader.class.getDeclaredMethod("resolveClass", Class.class);
m.setAccessible(true);
m.invoke(ecl, c);
+ c.getConstructors();
c.getMethods();
- c.getFields();
+ c.getFields();
+ LOGGER.log(Level.FINER, "{0} looks OK", c);
while (c != Object.class) {
c.getGenericSuperclass();
c = c.getSuperclass();
@@ -537,7 +537,7 @@ public abstract class ExtensionFinder implements ExtensionPoint {
// which results in a LinkageError
LOGGER.log(optional ? Level.FINE : Level.WARNING,
"Failed to load "+item.className(), e);
- } catch (InstantiationException e) {
+ } catch (Exception e) {
LOGGER.log(optional ? Level.FINE : Level.WARNING,
"Failed to load "+item.className(), e);
}
@@ -647,7 +647,7 @@ public abstract class ExtensionFinder implements ExtensionPoint {
// sometimes the instantiation fails in an indirect classloading failure,
// which results in a LinkageError
LOGGER.log(logLevel(item), "Failed to load "+item.className(), e);
- } catch (InstantiationException e) {
+ } catch (Exception e) {
LOGGER.log(logLevel(item), "Failed to load "+item.className(), e);
}
}
@@ -678,9 +678,7 @@ public abstract class ExtensionFinder implements ExtensionPoint {
// according to http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6459208
// this appears to be the only way to force a class initialization
Class.forName(extType.getName(),true,extType.getClassLoader());
- } catch (InstantiationException e) {
- LOGGER.log(logLevel(item), "Failed to scout "+item.className(), e);
- } catch (ClassNotFoundException e) {
+ } catch (Exception e) {
LOGGER.log(logLevel(item), "Failed to scout "+item.className(), e);
} catch (LinkageError e) {
LOGGER.log(logLevel(item), "Failed to scout "+item.className(), e);
diff --git a/core/src/main/java/hudson/ExtensionList.java b/core/src/main/java/hudson/ExtensionList.java
index 0d1d8f2d7f386df3c7e97ab6c0b69bad5ce53abc..7861de26c2a5b39bc006b922b92476d36cef46c0 100644
--- a/core/src/main/java/hudson/ExtensionList.java
+++ b/core/src/main/java/hudson/ExtensionList.java
@@ -44,6 +44,8 @@ import java.util.Vector;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
/**
* Retains the known extension instances for the given type 'T'.
@@ -72,7 +74,7 @@ public class ExtensionList extends AbstractList {
* Use {@link #jenkins}
*/
public final Hudson hudson;
- public final Jenkins jenkins;
+ public final @CheckForNull Jenkins jenkins;
public final Class extensionType;
/**
@@ -119,6 +121,9 @@ public class ExtensionList extends AbstractList {
this.jenkins = jenkins;
this.extensionType = extensionType;
this.legacyInstances = legacyStore;
+ if (jenkins == null) {
+ extensions = Collections.emptyList();
+ }
}
/**
@@ -240,7 +245,7 @@ public class ExtensionList extends AbstractList {
private List> ensureLoaded() {
if(extensions!=null)
return extensions; // already loaded
- if(Jenkins.getInstance().getInitLevel().compareTo(InitMilestone.PLUGINS_PREPARED)<0)
+ if (jenkins.getInitLevel().compareTo(InitMilestone.PLUGINS_PREPARED)<0)
return legacyInstances; // can't perform the auto discovery until all plugins are loaded, so just make the legacy instances visible
synchronized (getLoadLock()) {
@@ -332,6 +337,20 @@ public class ExtensionList extends AbstractList {
}
}
+ /**
+ * Gets the extension list for a given type.
+ * Normally calls {@link Jenkins#getExtensionList(Class)} but falls back to an empty list
+ * in case {@link Jenkins#getInstance} is null.
+ * Thus it is useful to call from {@code all()} methods which need to behave gracefully during startup or shutdown.
+ * @param type the extension point type
+ * @return some list
+ * @since 1.572
+ */
+ public static @Nonnull ExtensionList lookup(Class type) {
+ Jenkins j = Jenkins.getInstance();
+ return j == null ? create((Jenkins) null, type) : j.getExtensionList(type);
+ }
+
/**
* Places to store static-scope legacy instances.
*/
diff --git a/core/src/main/java/hudson/FilePath.java b/core/src/main/java/hudson/FilePath.java
index b2564edc70afb7de07ef5e418dd62ce1ee16e256..74760a428837196561c45e208655dbba31d6448b 100644
--- a/core/src/main/java/hudson/FilePath.java
+++ b/core/src/main/java/hudson/FilePath.java
@@ -25,42 +25,57 @@
*/
package hudson;
+import com.jcraft.jzlib.GZIPInputStream;
+import com.jcraft.jzlib.GZIPOutputStream;
import hudson.Launcher.LocalLauncher;
import hudson.Launcher.RemoteLauncher;
-import hudson.os.PosixAPI;
-import jenkins.model.Jenkins;
-import hudson.model.TaskListener;
import hudson.model.AbstractProject;
+import hudson.model.Computer;
import hudson.model.Item;
+import hudson.model.TaskListener;
+import hudson.org.apache.tools.tar.TarInputStream;
+import hudson.os.PosixAPI;
+import hudson.os.PosixException;
import hudson.remoting.Callable;
import hudson.remoting.Channel;
import hudson.remoting.DelegatingCallable;
import hudson.remoting.Future;
+import hudson.remoting.LocalChannel;
import hudson.remoting.Pipe;
+import hudson.remoting.RemoteInputStream;
+import hudson.remoting.RemoteInputStream.Flag;
import hudson.remoting.RemoteOutputStream;
import hudson.remoting.VirtualChannel;
-import hudson.remoting.RemoteInputStream;
import hudson.remoting.Which;
import hudson.security.AccessControlled;
+import hudson.util.DaemonThreadFactory;
import hudson.util.DirScanner;
-import hudson.util.IOException2;
-import hudson.util.HeadBufferingStream;
+import hudson.util.ExceptionCatchingThreadFactory;
+import hudson.util.FileVisitor;
import hudson.util.FormValidation;
+import hudson.util.HeadBufferingStream;
import hudson.util.IOUtils;
-
-import static hudson.Util.*;
-import static hudson.FilePath.TarCompression.GZIP;
-import hudson.org.apache.tools.tar.TarInputStream;
+import hudson.util.NamingThreadFactory;
import hudson.util.io.Archiver;
import hudson.util.io.ArchiverFactory;
+import jenkins.FilePathFilter;
+import jenkins.MasterToSlaveFileCallable;
+import jenkins.SlaveToMasterFileCallable;
+import jenkins.SoloFilePathFilter;
+import jenkins.model.Jenkins;
+import jenkins.util.ContextResettingExecutorService;
import jenkins.util.VirtualFile;
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.io.input.CountingInputStream;
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.FileSet;
import org.apache.tools.tar.TarEntry;
-import org.apache.commons.io.input.CountingInputStream;
-import org.apache.commons.fileupload.FileItem;
+import org.apache.tools.zip.ZipEntry;
+import org.apache.tools.zip.ZipFile;
import org.kohsuke.stapler.Stapler;
+
+import javax.annotation.CheckForNull;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileFilter;
@@ -73,39 +88,40 @@ import java.io.InterruptedIOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.RandomAccessFile;
import java.io.Serializable;
import java.io.Writer;
-import java.io.OutputStreamWriter;
import java.lang.reflect.Field;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
-import java.util.List;
-import java.util.StringTokenizer;
import java.util.Arrays;
import java.util.Comparator;
-import java.util.logging.Level;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Map;
+import java.util.StringTokenizer;
import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
-import com.jcraft.jzlib.GZIPInputStream;
-import com.jcraft.jzlib.GZIPOutputStream;
-
-import com.sun.jna.Native;
-import hudson.os.PosixException;
-import hudson.util.FileVisitor;
-import java.util.Enumeration;
-import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.logging.Level;
import java.util.logging.Logger;
-import org.apache.tools.ant.taskdefs.Chmod;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
-import org.apache.tools.zip.ZipFile;
-import org.apache.tools.zip.ZipEntry;
+import static hudson.FilePath.TarCompression.*;
+import static hudson.Util.*;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import jenkins.security.MasterToSlaveCallable;
+import org.jenkinsci.remoting.RoleChecker;
+import org.jenkinsci.remoting.RoleSensitive;
/**
* {@link File} like object with remoting support.
@@ -191,6 +207,18 @@ public final class FilePath implements Serializable {
// since the platform of the slave might be different, can't use java.io.File
private final String remote;
+ /**
+ * If this {@link FilePath} is deserialized to handle file access request from a remote computer,
+ * this field is set to the filter that performs access control.
+ *
+ *
+ * If null, no access control is needed.
+ *
+ * @see #filterNonNull()
+ */
+ private transient @Nullable
+ SoloFilePathFilter filter;
+
/**
* Creates a {@link FilePath} that represents a path on the given node.
*
@@ -199,7 +227,7 @@ public final class FilePath implements Serializable {
* that's connected to that machine. If null, that means the local file path.
*/
public FilePath(VirtualChannel channel, String remote) {
- this.channel = channel == Jenkins.MasterComputer.localChannel ? null : channel;
+ this.channel = channel instanceof LocalChannel ? null : channel;
this.remote = normalize(remote);
}
@@ -417,11 +445,11 @@ public final class FilePath implements Serializable {
*/
public int archive(final ArchiverFactory factory, OutputStream os, final DirScanner scanner) throws IOException, InterruptedException {
final OutputStream out = (channel!=null)?new RemoteOutputStream(os):os;
- return act(new FileCallable() {
+ return act(new SecureFileCallable() {
public Integer invoke(File f, VirtualChannel channel) throws IOException {
Archiver a = factory.create(out);
try {
- scanner.scan(f,a);
+ scanner.scan(f,reading(a));
} finally {
a.close();
}
@@ -449,17 +477,29 @@ public final class FilePath implements Serializable {
* @see #unzipFrom(InputStream)
*/
public void unzip(final FilePath target) throws IOException, InterruptedException {
- target.act(new FileCallable() {
+ // TODO: post release, re-unite two branches by introducing FileStreamCallable that resolves InputStream
+ if (this.channel!=target.channel) {// local -> remote or remote->local
+ final RemoteInputStream in = new RemoteInputStream(read(), Flag.GREEDY);
+ target.act(new SecureFileCallable() {
+ public Void invoke(File dir, VirtualChannel channel) throws IOException, InterruptedException {
+ unzip(dir, in);
+ return null;
+ }
- public Void invoke(File dir, VirtualChannel channel) throws IOException {
- if (FilePath.this.isRemote())
- unzip(dir, FilePath.this.read()); // use streams
- else
- unzip(dir, new File(FilePath.this.getRemote())); // shortcut to local file
- return null;
- }
- private static final long serialVersionUID = 1L;
- });
+ private static final long serialVersionUID = 1L;
+ });
+ } else {// local -> local or remote->remote
+ target.act(new SecureFileCallable() {
+
+ public Void invoke(File dir, VirtualChannel channel) throws IOException, InterruptedException {
+ assert !FilePath.this.isRemote(); // this.channel==target.channel above
+ unzip(dir, reading(new File(FilePath.this.getRemote()))); // shortcut to local file
+ return null;
+ }
+
+ private static final long serialVersionUID = 1L;
+ });
+ }
}
/**
@@ -473,13 +513,26 @@ public final class FilePath implements Serializable {
* @see #untarFrom(InputStream, TarCompression)
*/
public void untar(final FilePath target, final TarCompression compression) throws IOException, InterruptedException {
- target.act(new FileCallable() {
- public Void invoke(File dir, VirtualChannel channel) throws IOException {
- readFromTar(FilePath.this.getName(),dir,compression.extract(FilePath.this.read()));
- return null;
- }
- private static final long serialVersionUID = 1L;
- });
+ // TODO: post release, re-unite two branches by introducing FileStreamCallable that resolves InputStream
+ if (this.channel!=target.channel) {// local -> remote or remote->local
+ final RemoteInputStream in = new RemoteInputStream(read(), Flag.GREEDY);
+ target.act(new SecureFileCallable() {
+ public Void invoke(File dir, VirtualChannel channel) throws IOException, InterruptedException {
+ readFromTar(FilePath.this.getName(),dir,compression.extract(in));
+ return null;
+ }
+
+ private static final long serialVersionUID = 1L;
+ });
+ } else {// local -> local or remote->remote
+ target.act(new SecureFileCallable() {
+ public Void invoke(File dir, VirtualChannel channel) throws IOException, InterruptedException {
+ readFromTar(FilePath.this.getName(),dir,compression.extract(FilePath.this.read()));
+ return null;
+ }
+ private static final long serialVersionUID = 1L;
+ });
+ }
}
/**
@@ -492,7 +545,7 @@ public final class FilePath implements Serializable {
*/
public void unzipFrom(InputStream _in) throws IOException, InterruptedException {
final InputStream in = new RemoteInputStream(_in);
- act(new FileCallable() {
+ act(new SecureFileCallable() {
public Void invoke(File dir, VirtualChannel channel) throws IOException {
unzip(dir, in);
return null;
@@ -501,7 +554,7 @@ public final class FilePath implements Serializable {
});
}
- private static void unzip(File dir, InputStream in) throws IOException {
+ private void unzip(File dir, InputStream in) throws IOException {
File tmpFile = File.createTempFile("tmpzip", null); // uses java.io.tmpdir
try {
// TODO why does this not simply use ZipInputStream?
@@ -513,7 +566,7 @@ public final class FilePath implements Serializable {
}
}
- static private void unzip(File dir, File zipFile) throws IOException {
+ private void unzip(File dir, File zipFile) throws IOException {
dir = dir.getAbsoluteFile(); // without absolutization, getParentFile below seems to fail
ZipFile zip = new ZipFile(zipFile);
@SuppressWarnings("unchecked")
@@ -524,15 +577,15 @@ public final class FilePath implements Serializable {
ZipEntry e = entries.nextElement();
File f = new File(dir, e.getName());
if (e.isDirectory()) {
- f.mkdirs();
+ mkdirs(f);
} else {
File p = f.getParentFile();
if (p != null) {
- p.mkdirs();
+ mkdirs(p);
}
InputStream input = zip.getInputStream(e);
try {
- IOUtils.copy(input, f);
+ IOUtils.copy(input, writing(f));
} finally {
input.close();
}
@@ -556,7 +609,7 @@ 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() {
+ return new FilePath(channel,act(new SecureFileCallable() {
private static final long serialVersionUID = 1L;
public String invoke(File f, VirtualChannel channel) throws IOException {
return f.getAbsolutePath();
@@ -574,9 +627,10 @@ public final class FilePath implements Serializable {
* @since 1.456
*/
public void symlinkTo(final String target, final TaskListener listener) throws IOException, InterruptedException {
- act(new FileCallable() {
+ act(new SecureFileCallable() {
private static final long serialVersionUID = 1L;
public Void invoke(File f, VirtualChannel channel) throws IOException, InterruptedException {
+ symlinking(f);
Util.createSymlink(f.getParentFile(),target,f.getName(),listener);
return null;
}
@@ -591,10 +645,10 @@ public final class FilePath implements Serializable {
* @since 1.456
*/
public String readLink() throws IOException, InterruptedException {
- return act(new FileCallable() {
+ return act(new SecureFileCallable() {
private static final long serialVersionUID = 1L;
public String invoke(File f, VirtualChannel channel) throws IOException, InterruptedException {
- return Util.resolveSymlink(f);
+ return Util.resolveSymlink(reading(f));
}
});
}
@@ -636,7 +690,7 @@ public final class FilePath implements Serializable {
} catch (IOException e) {
// various people reported "java.io.IOException: Not in GZIP format" here, so diagnose this problem better
in.fillSide();
- throw new IOException2(e.getMessage()+"\nstream="+Util.toHexString(in.getSideBuffer()),e);
+ throw new IOException(e.getMessage()+"\nstream="+Util.toHexString(in.getSideBuffer()),e);
}
}
public OutputStream compress(OutputStream out) throws IOException {
@@ -660,7 +714,7 @@ public final class FilePath implements Serializable {
public void untarFrom(InputStream _in, final TarCompression compression) throws IOException, InterruptedException {
try {
final InputStream in = new RemoteInputStream(_in);
- act(new FileCallable() {
+ act(new SecureFileCallable() {
public Void invoke(File dir, VirtualChannel channel) throws IOException {
readFromTar("input stream",dir, compression.extract(in));
return null;
@@ -668,7 +722,7 @@ public final class FilePath implements Serializable {
private static final long serialVersionUID = 1L;
});
} finally {
- IOUtils.closeQuietly(_in);
+ org.apache.commons.io.IOUtils.closeQuietly(_in);
}
}
@@ -760,17 +814,18 @@ public final class FilePath implements Serializable {
else
untarFrom(cis,GZIP);
} catch (IOException e) {
- throw new IOException2(String.format("Failed to unpack %s (%d bytes read of total %d)",
+ throw new IOException(String.format("Failed to unpack %s (%d bytes read of total %d)",
archive,cis.getByteCount(),con.getContentLength()),e);
}
timestamp.touch(sourceTimestamp);
return true;
} catch (IOException e) {
- throw new IOException2("Failed to install "+archive+" to "+remote,e);
+ throw new IOException("Failed to install "+archive+" to "+remote,e);
}
}
- private static final class Unpack implements FileCallable {
+ // this reads from arbitrary URL
+ private final class Unpack extends MasterToSlaveFileCallable {
private final URL archive;
Unpack(URL archive) {
this.archive = archive;
@@ -786,7 +841,7 @@ public final class FilePath implements Serializable {
readFromTar("input stream", dir, GZIP.extract(cis));
}
} catch (IOException x) {
- throw new IOException2(String.format("Failed to unpack %s (%d bytes read)", archive, cis.getByteCount()), x);
+ throw new IOException(String.format("Failed to unpack %s (%d bytes read)", archive, cis.getByteCount()), x);
}
} finally {
in.close();
@@ -818,7 +873,7 @@ public final class FilePath implements Serializable {
public void copyFrom(InputStream in) throws IOException, InterruptedException {
OutputStream os = write();
try {
- IOUtils.copy(in, os);
+ org.apache.commons.io.IOUtils.copy(in, os);
} finally {
os.close();
}
@@ -839,17 +894,17 @@ public final class FilePath implements Serializable {
public void copyFrom(FileItem file) throws IOException, InterruptedException {
if(channel==null) {
try {
- file.write(new File(remote));
+ file.write(writing(new File(remote)));
} catch (IOException e) {
throw e;
} catch (Exception e) {
- throw new IOException2(e);
+ throw new IOException(e);
}
} else {
InputStream i = file.getInputStream();
OutputStream o = write();
try {
- IOUtils.copy(i,o);
+ org.apache.commons.io.IOUtils.copy(i,o);
} finally {
try {
o.close();
@@ -864,9 +919,14 @@ public final class FilePath implements Serializable {
* Code that gets executed on the machine where the {@link FilePath} is local.
* Used to act on {@link FilePath}.
* Warning: implementations must be serializable, so prefer a static nested class to an inner class.
+ *
+ *
+ * Subtypes would likely want to extend from either {@link MasterToSlaveCallable}
+ * or {@link SlaveToMasterFileCallable}.
+ *
* @see FilePath#act(FileCallable)
*/
- public interface FileCallable extends Serializable {
+ public interface FileCallable extends Serializable, RoleSensitive {
/**
* Performs the computational task on the node where the data is located.
*
@@ -882,6 +942,15 @@ public final class FilePath implements Serializable {
T invoke(File f, VirtualChannel channel) throws IOException, InterruptedException;
}
+ /**
+ * {@link FileCallable}s that can be executed anywhere, including the master.
+ *
+ * The code is the same as {@link SlaveToMasterFileCallable}, but used as a marker to
+ * designate those impls that use {@link FilePathFilter}.
+ */
+ /*package*/ static abstract class SecureFileCallable extends SlaveToMasterFileCallable {
+ }
+
/**
* Executes some program on the machine that this {@link FilePath} exists,
* so that one can perform local file operations.
@@ -895,14 +964,9 @@ public final class FilePath implements Serializable {
// run this on a remote system
try {
DelegatingCallable wrapper = new FileCallableWrapper(callable, cl);
- Jenkins instance = Jenkins.getInstance();
- if (instance != null) { // this happens during unit tests
- ExtensionList factories = instance.getExtensionList(FileCallableWrapperFactory.class);
- for (FileCallableWrapperFactory factory : factories) {
- wrapper = factory.wrap(wrapper);
- }
+ for (FileCallableWrapperFactory factory : ExtensionList.lookup(FileCallableWrapperFactory.class)) {
+ wrapper = factory.wrap(wrapper);
}
-
return channel.call(wrapper);
} catch (TunneledInterruptedException e) {
throw (InterruptedException)new InterruptedException(e.getMessage()).initCause(e);
@@ -910,11 +974,11 @@ public final class FilePath implements Serializable {
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: "+remote+" at "+channel,e);
+ throw new IOException("remote file operation failed: " + remote + " at " + channel + ": " + e, e);
}
} else {
// the file is on the local machine.
- return callable.invoke(new File(remote), Jenkins.MasterComputer.localChannel);
+ return callable.invoke(new File(remote), localChannel);
}
}
@@ -980,19 +1044,14 @@ public final class FilePath implements Serializable {
public Future actAsync(final FileCallable callable) throws IOException, InterruptedException {
try {
DelegatingCallable wrapper = new FileCallableWrapper(callable);
- Jenkins instance = Jenkins.getInstance();
- if (instance != null) { // this happens during unit tests
- ExtensionList factories = instance.getExtensionList(FileCallableWrapperFactory.class);
- for (FileCallableWrapperFactory factory : factories) {
- wrapper = factory.wrap(wrapper);
- }
+ for (FileCallableWrapperFactory factory : ExtensionList.lookup(FileCallableWrapperFactory.class)) {
+ wrapper = factory.wrap(wrapper);
}
-
- return (channel!=null ? channel : Jenkins.MasterComputer.localChannel)
+ return (channel!=null ? channel : localChannel)
.callAsync(wrapper);
} 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);
+ throw new IOException("remote file operation failed",e);
}
}
@@ -1027,6 +1086,12 @@ public final class FilePath implements Serializable {
throw (IOException)new InterruptedIOException().initCause(e);
}
}
+
+ @Override
+ public void checkRoles(RoleChecker checker) throws SecurityException {
+ task.checkRoles(checker);
+ }
+
private static final long serialVersionUID = 1L;
};
}
@@ -1036,7 +1101,7 @@ public final class FilePath implements Serializable {
* on which this file is available.
*/
public URI toURI() throws IOException, InterruptedException {
- return act(new FileCallable() {
+ return act(new SecureFileCallable() {
private static final long serialVersionUID = 1L;
public URI invoke(File f, VirtualChannel channel) {
return f.toURI();
@@ -1053,14 +1118,31 @@ public final class FilePath implements Serializable {
return VirtualFile.forFilePath(this);
}
+ /**
+ * If this {@link FilePath} represents a file on a particular {@link Computer}, return it.
+ * Otherwise null.
+ * @since 1.571
+ */
+ public @CheckForNull Computer toComputer() {
+ Jenkins j = Jenkins.getInstance();
+ if (j != null) {
+ for (Computer c : j.getComputers()) {
+ if (getChannel()==c.getChannel()) {
+ return c;
+ }
+ }
+ }
+ return null;
+ }
+
/**
* Creates this directory.
*/
public void mkdirs() throws IOException, InterruptedException {
- if(!act(new FileCallable() {
+ if(!act(new SecureFileCallable() {
private static final long serialVersionUID = 1L;
public Boolean invoke(File f, VirtualChannel channel) throws IOException, InterruptedException {
- if(f.mkdirs() || f.exists())
+ if(mkdirs(f) || f.exists())
return true; // OK
// following Ant task to avoid possible race condition.
@@ -1076,10 +1158,10 @@ public final class FilePath implements Serializable {
* Deletes this directory, including all its contents recursively.
*/
public void deleteRecursive() throws IOException, InterruptedException {
- act(new FileCallable() {
+ act(new SecureFileCallable() {
private static final long serialVersionUID = 1L;
public Void invoke(File f, VirtualChannel channel) throws IOException {
- Util.deleteRecursive(f);
+ deleteRecursive(deleting(f));
return null;
}
});
@@ -1089,15 +1171,38 @@ public final class FilePath implements Serializable {
* Deletes all the contents of this directory, but not the directory itself
*/
public void deleteContents() throws IOException, InterruptedException {
- act(new FileCallable() {
+ act(new SecureFileCallable() {
private static final long serialVersionUID = 1L;
public Void invoke(File f, VirtualChannel channel) throws IOException {
- Util.deleteContentsRecursive(f);
+ deleteContentsRecursive(f);
return null;
}
});
}
+ private void deleteRecursive(File dir) throws IOException {
+ if(!isSymlink(dir))
+ deleteContentsRecursive(dir);
+ try {
+ deleteFile(deleting(dir));
+ } catch (IOException e) {
+ // if some of the child directories are big, it might take long enough to delete that
+ // it allows others to create new files, causing problemsl ike JENKINS-10113
+ // so give it one more attempt before we give up.
+ if(!isSymlink(dir))
+ deleteContentsRecursive(dir);
+ deleteFile(deleting(dir));
+ }
+ }
+
+ private void deleteContentsRecursive(File file) throws IOException {
+ File[] files = file.listFiles();
+ if(files==null)
+ return; // the directory didn't exist in the first place
+ for (File child : files)
+ deleteRecursive(child);
+ }
+
/**
* Gets the file name portion except the extension.
*
@@ -1149,7 +1254,7 @@ public final class FilePath implements Serializable {
* @param relOrAbsolute a relative or absolute path
* @return a file on the same channel
*/
- public FilePath child(String relOrAbsolute) {
+ public @Nonnull FilePath child(String relOrAbsolute) {
return new FilePath(this,relOrAbsolute);
}
@@ -1183,15 +1288,15 @@ public final class FilePath implements Serializable {
*/
public FilePath createTempFile(final String prefix, final String suffix) throws IOException, InterruptedException {
try {
- return new FilePath(this,act(new FileCallable() {
+ return new FilePath(this,act(new SecureFileCallable() {
private static final long serialVersionUID = 1L;
public String invoke(File dir, VirtualChannel channel) throws IOException {
- File f = File.createTempFile(prefix, suffix, dir);
+ File f = writing(File.createTempFile(prefix, suffix, dir));
return f.getName();
}
}));
} catch (IOException e) {
- throw new IOException2("Failed to create a temp file on "+remote,e);
+ throw new IOException("Failed to create a temp file on "+remote,e);
}
}
@@ -1239,22 +1344,22 @@ public final class FilePath implements Serializable {
*/
public FilePath createTextTempFile(final String prefix, final String suffix, final String contents, final boolean inThisDirectory) throws IOException, InterruptedException {
try {
- return new FilePath(channel,act(new FileCallable() {
+ return new FilePath(channel,act(new SecureFileCallable() {
private static final long serialVersionUID = 1L;
public String invoke(File dir, VirtualChannel channel) throws IOException {
if(!inThisDirectory)
dir = new File(System.getProperty("java.io.tmpdir"));
else
- dir.mkdirs();
+ mkdirs(dir);
File f;
try {
- f = File.createTempFile(prefix, suffix, dir);
+ f = creating(File.createTempFile(prefix, suffix, dir));
} catch (IOException e) {
- throw new IOException2("Failed to create a temporary directory in "+dir,e);
+ throw new IOException("Failed to create a temporary directory in "+dir,e);
}
- Writer w = new FileWriter(f);
+ Writer w = new FileWriter(writing(f));
try {
w.write(contents);
} finally {
@@ -1265,7 +1370,7 @@ public final class FilePath implements Serializable {
}
}));
} catch (IOException e) {
- throw new IOException2("Failed to create a temp file on "+remote,e);
+ throw new IOException("Failed to create a temp file on "+remote,e);
}
}
@@ -1285,7 +1390,7 @@ public final class FilePath implements Serializable {
*/
public FilePath createTempDir(final String prefix, final String suffix) throws IOException, InterruptedException {
try {
- return new FilePath(this,act(new FileCallable() {
+ return new FilePath(this,act(new SecureFileCallable() {
private static final long serialVersionUID = 1L;
public String invoke(File dir, VirtualChannel channel) throws IOException {
File f = File.createTempFile(prefix, suffix, dir);
@@ -1295,7 +1400,7 @@ public final class FilePath implements Serializable {
}
}));
} catch (IOException e) {
- throw new IOException2("Failed to create a temp directory on "+remote,e);
+ throw new IOException("Failed to create a temp directory on "+remote,e);
}
}
@@ -1305,10 +1410,10 @@ public final class FilePath implements Serializable {
* @return true, for a modicum of compatibility
*/
public boolean delete() throws IOException, InterruptedException {
- act(new FileCallable() {
+ act(new SecureFileCallable() {
private static final long serialVersionUID = 1L;
public Void invoke(File f, VirtualChannel channel) throws IOException {
- Util.deleteFile(f);
+ Util.deleteFile(deleting(f));
return null;
}
});
@@ -1319,10 +1424,10 @@ public final class FilePath implements Serializable {
* Checks if the file exists.
*/
public boolean exists() throws IOException, InterruptedException {
- return act(new FileCallable() {
+ return act(new SecureFileCallable() {
private static final long serialVersionUID = 1L;
public Boolean invoke(File f, VirtualChannel channel) throws IOException {
- return f.exists();
+ return stating(f).exists();
}
});
}
@@ -1335,10 +1440,10 @@ public final class FilePath implements Serializable {
* @see #touch(long)
*/
public long lastModified() throws IOException, InterruptedException {
- return act(new FileCallable() {
+ return act(new SecureFileCallable() {
private static final long serialVersionUID = 1L;
public Long invoke(File f, VirtualChannel channel) throws IOException {
- return f.lastModified();
+ return stating(f).lastModified();
}
});
}
@@ -1349,12 +1454,12 @@ public final class FilePath implements Serializable {
* @since 1.299
*/
public void touch(final long timestamp) throws IOException, InterruptedException {
- act(new FileCallable() {
+ act(new SecureFileCallable() {
private static final long serialVersionUID = -5094638816500738429L;
public Void invoke(File f, VirtualChannel channel) throws IOException {
if(!f.exists())
- new FileOutputStream(f).close();
- if(!f.setLastModified(timestamp))
+ new FileOutputStream(creating(f)).close();
+ if(!stating(f).setLastModified(timestamp))
throw new IOException("Failed to set the timestamp of "+f+" to "+timestamp);
return null;
}
@@ -1362,10 +1467,10 @@ public final class FilePath implements Serializable {
}
private void setLastModifiedIfPossible(final long timestamp) throws IOException, InterruptedException {
- String message = act(new FileCallable() {
+ String message = act(new SecureFileCallable() {
private static final long serialVersionUID = -828220335793641630L;
public String invoke(File f, VirtualChannel channel) throws IOException {
- if(!f.setLastModified(timestamp)) {
+ if(!writing(f).setLastModified(timestamp)) {
if (Functions.isWindows()) {
// On Windows this seems to fail often. See JENKINS-11073
// Therefore don't fail, but just log a warning
@@ -1387,10 +1492,10 @@ public final class FilePath implements Serializable {
* Checks if the file is a directory.
*/
public boolean isDirectory() throws IOException, InterruptedException {
- return act(new FileCallable() {
+ return act(new SecureFileCallable() {
private static final long serialVersionUID = 1L;
public Boolean invoke(File f, VirtualChannel channel) throws IOException {
- return f.isDirectory();
+ return stating(f).isDirectory();
}
});
}
@@ -1401,10 +1506,49 @@ public final class FilePath implements Serializable {
* @since 1.129
*/
public long length() throws IOException, InterruptedException {
- return act(new FileCallable() {
+ return act(new SecureFileCallable() {
private static final long serialVersionUID = 1L;
public Long invoke(File f, VirtualChannel channel) throws IOException {
- return f.length();
+ return stating(f).length();
+ }
+ });
+ }
+
+ /**
+ * Returns the number of unallocated bytes in the partition of that file.
+ * @since 1.542
+ */
+ public long getFreeDiskSpace() throws IOException, InterruptedException {
+ return act(new SecureFileCallable() {
+ private static final long serialVersionUID = 1L;
+ @Override public Long invoke(File f, VirtualChannel channel) throws IOException {
+ return f.getFreeSpace();
+ }
+ });
+ }
+
+ /**
+ * Returns the total number of bytes in the partition of that file.
+ * @since 1.542
+ */
+ public long getTotalDiskSpace() throws IOException, InterruptedException {
+ return act(new SecureFileCallable() {
+ private static final long serialVersionUID = 1L;
+ @Override public Long invoke(File f, VirtualChannel channel) throws IOException {
+ return f.getTotalSpace();
+ }
+ });
+ }
+
+ /**
+ * Returns the number of usable bytes in the partition of that file.
+ * @since 1.542
+ */
+ public long getUsableDiskSpace() throws IOException, InterruptedException {
+ return act(new SecureFileCallable() {
+ private static final long serialVersionUID = 1L;
+ @Override public Long invoke(File f, VirtualChannel channel) throws IOException {
+ return f.getUsableSpace();
}
});
}
@@ -1426,10 +1570,10 @@ public final class FilePath implements Serializable {
*/
public void chmod(final int mask) throws IOException, InterruptedException {
if(!isUnix() || mask==-1) return;
- act(new FileCallable() {
+ act(new SecureFileCallable() {
private static final long serialVersionUID = 1L;
public Void invoke(File f, VirtualChannel channel) throws IOException {
- _chmod(f, mask);
+ _chmod(writing(f), mask);
return null;
}
@@ -1457,10 +1601,10 @@ public final class FilePath implements Serializable {
*/
public int mode() throws IOException, InterruptedException, PosixException {
if(!isUnix()) return -1;
- return act(new FileCallable() {
+ return act(new SecureFileCallable() {
private static final long serialVersionUID = 1L;
public Integer invoke(File f, VirtualChannel channel) throws IOException {
- return IOUtils.mode(f);
+ return IOUtils.mode(stating(f));
}
});
}
@@ -1504,10 +1648,10 @@ public final class FilePath implements Serializable {
if (filter != null && !(filter instanceof Serializable)) {
throw new IllegalArgumentException("Non-serializable filter of " + filter.getClass());
}
- return act(new FileCallable>() {
+ return act(new SecureFileCallable>() {
private static final long serialVersionUID = 1L;
public List invoke(File f, VirtualChannel channel) throws IOException {
- File[] children = f.listFiles(filter);
+ File[] children = reading(f).listFiles(filter);
if(children ==null) return null;
ArrayList r = new ArrayList(children.length);
@@ -1557,10 +1701,10 @@ public final class FilePath implements Serializable {
* @since 1.465
*/
public FilePath[] list(final String includes, final String excludes, final boolean defaultExcludes) throws IOException, InterruptedException {
- return act(new FileCallable() {
+ return act(new SecureFileCallable() {
private static final long serialVersionUID = 1L;
public FilePath[] invoke(File f, VirtualChannel channel) throws IOException {
- String[] files = glob(f, includes, excludes, defaultExcludes);
+ String[] files = glob(reading(f), includes, excludes, defaultExcludes);
FilePath[] r = new FilePath[files.length];
for( int i=0; i() {
+ actAsync(new SecureFileCallable() {
private static final long serialVersionUID = 1L;
- public Void call() throws IOException {
- FileInputStream fis=null;
+
+ @Override
+ public Void invoke(File f, VirtualChannel channel) throws IOException, InterruptedException {
+ FileInputStream fis = null;
try {
- fis = new FileInputStream(new File(remote));
- Util.copyStream(fis,p.getOut());
- return null;
+ fis = new FileInputStream(reading(f));
+ Util.copyStream(fis, p.getOut());
+ } catch (Exception x) {
+ p.error(x);
} finally {
- IOUtils.closeQuietly(fis);
- IOUtils.closeQuietly(p.getOut());
+ org.apache.commons.io.IOUtils.closeQuietly(fis);
+ org.apache.commons.io.IOUtils.closeQuietly(p.getOut());
}
+ return null;
}
});
return p.getIn();
}
+ /**
+ * Reads this file from the specific offset.
+ * @since 1.586
+ */
+ public InputStream readFromOffset(final long offset) throws IOException, InterruptedException {
+ if(channel ==null) {
+ final RandomAccessFile raf = new RandomAccessFile(new File(remote), "r");
+ try {
+ raf.seek(offset);
+ } catch (IOException e) {
+ try {
+ raf.close();
+ } catch (IOException e1) {
+ // ignore
+ }
+ throw e;
+ }
+ return new InputStream() {
+ @Override
+ public int read() throws IOException {
+ return raf.read();
+ }
+
+ @Override
+ public void close() throws IOException {
+ raf.close();
+ }
+
+ @Override
+ public int read(byte[] b, int off, int len) throws IOException {
+ return raf.read(b, off, len);
+ }
+
+ @Override
+ public int read(byte[] b) throws IOException {
+ return raf.read(b);
+ }
+ };
+ }
+
+ final Pipe p = Pipe.createRemoteToLocal();
+ actAsync(new SecureFileCallable() {
+ private static final long serialVersionUID = 1L;
+
+ public Void invoke(File f, VirtualChannel channel) throws IOException {
+ final OutputStream out = new java.util.zip.GZIPOutputStream(p.getOut(), 8192);
+ RandomAccessFile raf = null;
+ try {
+ raf = new RandomAccessFile(reading(f), "r");
+ raf.seek(offset);
+ byte[] buf = new byte[8192];
+ int len;
+ while ((len = raf.read(buf)) >= 0) {
+ out.write(buf, 0, len);
+ }
+ return null;
+ } finally {
+ IOUtils.closeQuietly(out);
+ if (raf != null) {
+ try {
+ raf.close();
+ } catch (IOException e) {
+ // ignore
+ }
+ }
+ }
+ }
+ });
+
+ return new java.util.zip.GZIPInputStream(p.getIn());
+ }
+
/**
* Reads this file into a string, by using the current system encoding.
*/
- public String readToString() throws IOException {
+ public String readToString() throws IOException, InterruptedException {
InputStream in = read();
try {
- return IOUtils.toString(in);
+ return org.apache.commons.io.IOUtils.toString(in);
} finally {
in.close();
}
@@ -1643,16 +1863,16 @@ public final class FilePath implements Serializable {
public OutputStream write() throws IOException, InterruptedException {
if(channel==null) {
File f = new File(remote).getAbsoluteFile();
- f.getParentFile().mkdirs();
- return new FileOutputStream(f);
+ mkdirs(f.getParentFile());
+ return new FileOutputStream(writing(f));
}
- return channel.call(new Callable() {
+ return act(new SecureFileCallable() {
private static final long serialVersionUID = 1L;
- public OutputStream call() throws IOException {
- File f = new File(remote).getAbsoluteFile();
- f.getParentFile().mkdirs();
- FileOutputStream fos = new FileOutputStream(f);
+ public OutputStream invoke(File f, VirtualChannel channel) throws IOException, InterruptedException {
+ f = f.getAbsoluteFile();
+ mkdirs(f.getParentFile());
+ FileOutputStream fos = new FileOutputStream(writing(f));
return new RemoteOutputStream(fos);
}
});
@@ -1666,11 +1886,11 @@ public final class FilePath implements Serializable {
* @since 1.105
*/
public void write(final String content, final String encoding) throws IOException, InterruptedException {
- act(new FileCallable() {
+ act(new SecureFileCallable() {
private static final long serialVersionUID = 1L;
public Void invoke(File f, VirtualChannel channel) throws IOException {
- f.getParentFile().mkdirs();
- FileOutputStream fos = new FileOutputStream(f);
+ mkdirs(f.getParentFile());
+ FileOutputStream fos = new FileOutputStream(writing(f));
Writer w = encoding != null ? new OutputStreamWriter(fos, encoding) : new OutputStreamWriter(fos);
try {
w.write(content);
@@ -1687,10 +1907,10 @@ public final class FilePath implements Serializable {
* @see Util#getDigestOf(File)
*/
public String digest() throws IOException, InterruptedException {
- return act(new FileCallable() {
+ return act(new SecureFileCallable() {
private static final long serialVersionUID = 1L;
public String invoke(File f, VirtualChannel channel) throws IOException {
- return Util.getDigestOf(f);
+ return Util.getDigestOf(reading(f));
}
});
}
@@ -1703,10 +1923,10 @@ public final class FilePath implements Serializable {
if(this.channel != target.channel) {
throw new IOException("renameTo target must be on the same host");
}
- act(new FileCallable() {
+ act(new SecureFileCallable() {
private static final long serialVersionUID = 1L;
public Void invoke(File f, VirtualChannel channel) throws IOException {
- f.renameTo(new File(target.remote));
+ reading(f).renameTo(creating(new File(target.remote)));
return null;
}
});
@@ -1721,17 +1941,23 @@ public final class FilePath implements Serializable {
if(this.channel != target.channel) {
throw new IOException("pullUpTo target must be on the same host");
}
- act(new FileCallable() {
+ act(new SecureFileCallable() {
private static final long serialVersionUID = 1L;
public Void invoke(File f, VirtualChannel channel) throws IOException {
+ // JENKINS-16846: if f.getName() is the same as one of the files/directories in f,
+ // then the rename op will fail
+ File tmp = new File(f.getAbsolutePath()+".__rename");
+ if (!f.renameTo(tmp))
+ throw new IOException("Failed to rename "+f+" to "+tmp);
+
File t = new File(target.getRemote());
- for(File child : f.listFiles()) {
+ for(File child : reading(tmp).listFiles()) {
File target = new File(t, child.getName());
- if(!child.renameTo(target))
+ if(!stating(child).renameTo(creating(target)))
throw new IOException("Failed to rename "+child+" to "+target);
}
- f.delete();
+ deleting(tmp).delete();
return null;
}
});
@@ -1749,7 +1975,7 @@ public final class FilePath implements Serializable {
out.close();
}
} catch (IOException e) {
- throw new IOException2("Failed to copy "+this+" to "+target,e);
+ throw new IOException("Failed to copy "+this+" to "+target,e);
}
}
@@ -1770,17 +1996,17 @@ public final class FilePath implements Serializable {
public void copyTo(OutputStream os) throws IOException, InterruptedException {
final OutputStream out = new RemoteOutputStream(os);
- act(new FileCallable() {
+ act(new SecureFileCallable() {
private static final long serialVersionUID = 4088559042349254141L;
public Void invoke(File f, VirtualChannel channel) throws IOException {
FileInputStream fis = null;
try {
- fis = new FileInputStream(f);
+ fis = new FileInputStream(reading(f));
Util.copyStream(fis,out);
return null;
} finally {
- IOUtils.closeQuietly(fis);
- IOUtils.closeQuietly(out);
+ org.apache.commons.io.IOUtils.closeQuietly(fis);
+ org.apache.commons.io.IOUtils.closeQuietly(out);
}
}
});
@@ -1798,7 +2024,7 @@ public final class FilePath implements Serializable {
private void syncIO() throws InterruptedException {
try {
if (channel!=null)
- _syncIO();
+ channel.syncLocalIO();
} catch (AbstractMethodError e) {
// legacy slave.jar. Handle this gracefully
try {
@@ -1886,34 +2112,41 @@ public final class FilePath implements Serializable {
public int copyRecursiveTo(final DirScanner scanner, final FilePath target, final String description) throws IOException, InterruptedException {
if(this.channel==target.channel) {
// local to local copy.
- return act(new FileCallable() {
+ return act(new SecureFileCallable() {
private static final long serialVersionUID = 1L;
public Integer invoke(File base, VirtualChannel channel) throws IOException {
if(!base.exists()) return 0;
assert target.channel==null;
final File dest = new File(target.remote);
final AtomicInteger count = new AtomicInteger();
- scanner.scan(base, new FileVisitor() {
- @Override public void visit(File f, String relativePath) throws IOException {
+ scanner.scan(base, reading(new FileVisitor() {
+ @Override
+ public void visit(File f, String relativePath) throws IOException {
if (f.isFile()) {
File target = new File(dest, relativePath);
- target.getParentFile().mkdirs();
- Util.copyFile(f, target);
+ mkdirsE(target.getParentFile());
+ Util.copyFile(f, writing(target));
count.incrementAndGet();
}
}
- @Override public boolean understandsSymlink() {
+
+ @Override
+ public boolean understandsSymlink() {
return true;
}
- @Override public void visitSymlink(File link, String target, String relativePath) throws IOException {
+
+ @Override
+ public void visitSymlink(File link, String target, String relativePath) throws IOException {
try {
+ mkdirsE(new File(dest, relativePath).getParentFile());
+ writing(new File(dest, target));
Util.createSymlink(dest, target, relativePath, TaskListener.NULL);
} catch (InterruptedException x) {
throw (IOException) new IOException(x.toString()).initCause(x);
}
count.incrementAndGet();
}
- });
+ }));
return count.get();
}
});
@@ -1922,7 +2155,7 @@ public final class FilePath implements Serializable {
// local -> remote copy
final Pipe pipe = Pipe.createLocalToRemote();
- Future future = target.actAsync(new FileCallable() {
+ Future future = target.actAsync(new SecureFileCallable() {
private static final long serialVersionUID = 1L;
public Void invoke(File f, VirtualChannel channel) throws IOException {
try {
@@ -1933,7 +2166,7 @@ public final class FilePath implements Serializable {
}
}
});
- Future future2 = actAsync(new FileCallable() {
+ Future future2 = actAsync(new SecureFileCallable() {
private static final long serialVersionUID = 1L;
@Override public Integer invoke(File f, VirtualChannel channel) throws IOException, InterruptedException {
return writeToTar(new File(remote), scanner, TarCompression.GZIP.compress(pipe.getOut()));
@@ -1944,13 +2177,13 @@ public final class FilePath implements Serializable {
future.get();
return future2.get();
} catch (ExecutionException e) {
- throw new IOException2(e);
+ throw new IOException(e);
}
} else {
// remote -> local copy
final Pipe pipe = Pipe.createRemoteToLocal();
- Future future = actAsync(new FileCallable() {
+ Future future = actAsync(new SecureFileCallable() {
private static final long serialVersionUID = 1L;
public Integer invoke(File f, VirtualChannel channel) throws IOException {
try {
@@ -1968,7 +2201,7 @@ public final class FilePath implements Serializable {
throw e; // the remote side completed successfully, so the error must be local
} catch (ExecutionException x) {
// report both errors
- throw new IOException2(Functions.printThrowable(e),x);
+ throw new IOException(Functions.printThrowable(e),x);
} catch (TimeoutException _) {
// remote is hanging
throw e;
@@ -1977,7 +2210,7 @@ public final class FilePath implements Serializable {
try {
return future.get();
} catch (ExecutionException e) {
- throw new IOException2(e);
+ throw new IOException(e);
}
}
}
@@ -2010,10 +2243,10 @@ public final class FilePath implements Serializable {
* @return
* number of files/directories that are written.
*/
- private static Integer writeToTar(File baseDir, DirScanner scanner, OutputStream out) throws IOException {
+ private Integer writeToTar(File baseDir, DirScanner scanner, OutputStream out) throws IOException {
Archiver tw = ArchiverFactory.TAR.create(out);
try {
- scanner.scan(baseDir,tw);
+ scanner.scan(baseDir,reading(tw));
} finally {
tw.close();
}
@@ -2023,17 +2256,18 @@ public final class FilePath implements Serializable {
/**
* Reads from a tar stream and stores obtained files to the base dir.
*/
- private static void readFromTar(String name, File baseDir, InputStream in) throws IOException {
+ private void readFromTar(String name, File baseDir, InputStream in) throws IOException {
TarInputStream t = new TarInputStream(in);
try {
TarEntry te;
while ((te = t.getNextEntry()) != null) {
File f = new File(baseDir,te.getName());
if(te.isDirectory()) {
- f.mkdirs();
+ mkdirs(f);
} else {
File parent = f.getParentFile();
- if (parent != null) parent.mkdirs();
+ if (parent != null) mkdirs(parent);
+ writing(f);
byte linkFlag = (Byte) LINKFLAG_FIELD.get(te);
if (linkFlag==TarEntry.LF_SYMLINK) {
@@ -2049,12 +2283,12 @@ public final class FilePath implements Serializable {
}
}
} catch(IOException e) {
- throw new IOException2("Failed to extract "+name,e);
+ throw new IOException("Failed to extract "+name,e);
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // process this later
- throw new IOException2("Failed to extract "+name,e);
+ throw new IOException("Failed to extract "+name,e);
} catch (IllegalAccessException e) {
- throw new IOException2("Failed to extract "+name,e);
+ throw new IOException("Failed to extract "+name,e);
} finally {
t.close();
}
@@ -2072,7 +2306,7 @@ public final class FilePath implements Serializable {
return new RemoteLauncher(listener,channel,channel.call(new IsUnix()));
}
- private static final class IsUnix implements Callable {
+ private static final class IsUnix extends MasterToSlaveCallable {
public Boolean call() throws IOException {
return File.pathSeparatorChar==':';
}
@@ -2090,11 +2324,18 @@ public final class FilePath implements Serializable {
* null if no error was found. Otherwise returns a human readable error message.
* @since 1.90
* @see #validateFileMask(FilePath, String)
+ * @deprecated use {@link #validateAntFileMask(String, int)} instead
*/
public String validateAntFileMask(final String fileMasks) throws IOException, InterruptedException {
return validateAntFileMask(fileMasks, Integer.MAX_VALUE);
}
+ /**
+ * Default bound for {@link #validateAntFileMask(String, int)}.
+ * @since 1.592
+ */
+ public static int VALIDATE_ANT_FILE_MASK_BOUND = Integer.getInteger(FilePath.class.getName() + ".VALIDATE_ANT_FILE_MASK_BOUND", 10000);
+
/**
* Like {@link #validateAntFileMask(String)} but performing only a bounded number of operations.
* Whereas the unbounded overload is appropriate for calling from cancelable, long-running tasks such as build steps,
@@ -2104,12 +2345,12 @@ public final class FilePath implements Serializable {
* A message is returned in case the file pattern can definitely be determined to not match anything in the directory within the alloted time.
* If the time runs out without finding a match but without ruling out the possibility that there might be one, {@link InterruptedException} is thrown,
* in which case the calling code should give the user the benefit of the doubt and use {@link hudson.util.FormValidation.Kind#OK} (with or without a message).
- * @param bound a maximum number of negative operations (deliberately left vague) to perform before giving up on a precise answer; 10_000 is a reasonable pick
+ * @param bound a maximum number of negative operations (deliberately left vague) to perform before giving up on a precise answer; try {@link #VALIDATE_ANT_FILE_MASK_BOUND}
* @throws InterruptedException not only in case of a channel failure, but also if too many operations were performed without finding any matches
* @since 1.484
*/
public String validateAntFileMask(final String fileMasks, final int bound) throws IOException, InterruptedException {
- return act(new FileCallable() {
+ return act(new MasterToSlaveFileCallable() {
private static final long serialVersionUID = 1;
public String invoke(File dir, VirtualChannel channel) throws IOException, InterruptedException {
if(fileMasks.startsWith("~"))
@@ -2150,7 +2391,7 @@ public final class FilePath implements Serializable {
{// check the (2) above next as this is more expensive.
// Try prepending "**/" to see if that results in a match
- FileSet fs = Util.createFileSet(dir,"**/"+fileMask);
+ FileSet fs = Util.createFileSet(reading(dir),"**/"+fileMask);
DirectoryScanner ds = fs.getDirectoryScanner(new Project());
if(ds.getIncludedFilesCount()!=0) {
// try shorter name first so that the suggestion results in least amount of changes
@@ -2212,14 +2453,19 @@ public final class FilePath implements Serializable {
class Cancel extends RuntimeException {}
DirectoryScanner ds = bound == Integer.MAX_VALUE ? new DirectoryScanner() : new DirectoryScanner() {
int ticks;
+ long start = System.currentTimeMillis();
@Override public synchronized boolean isCaseSensitive() {
- if (!filesIncluded.isEmpty() || !dirsIncluded.isEmpty() || ticks++ > bound) {
+ if (!filesIncluded.isEmpty() || !dirsIncluded.isEmpty() || ticks++ > bound || System.currentTimeMillis() - start > 5000) {
throw new Cancel();
}
+ filesNotIncluded.clear();
+ dirsNotIncluded.clear();
+ // notFollowedSymlinks might be large, but probably unusual
+ // scannedDirs will typically be largish, but seems to be needed
return super.isCaseSensitive();
}
};
- ds.setBasedir(dir);
+ ds.setBasedir(reading(dir));
ds.setIncludes(new String[] {pattern});
try {
ds.scan();
@@ -2249,9 +2495,9 @@ public final class FilePath implements Serializable {
/**
* Shortcut for {@link #validateFileMask(String)} in case the left-hand side can be null.
*/
- public static FormValidation validateFileMask(FilePath pathOrNull, String value) throws IOException {
- if(pathOrNull==null) return FormValidation.ok();
- return pathOrNull.validateFileMask(value);
+ public static FormValidation validateFileMask(@CheckForNull FilePath path, String value) throws IOException {
+ if(path==null) return FormValidation.ok();
+ return path.validateFileMask(value);
}
/**
@@ -2278,7 +2524,7 @@ public final class FilePath implements Serializable {
if(!exists()) // no workspace. can't check
return FormValidation.ok();
- String msg = validateAntFileMask(value, 10000);
+ String msg = validateAntFileMask(value, VALIDATE_ANT_FILE_MASK_BOUND);
if(errorIfNotExist) return FormValidation.error(msg);
else return FormValidation.warning(msg);
} catch (InterruptedException e) {
@@ -2365,7 +2611,7 @@ public final class FilePath implements Serializable {
public VirtualChannel getChannel() {
if(channel!=null) return channel;
- else return Jenkins.MasterComputer.localChannel;
+ else return localChannel;
}
/**
@@ -2392,8 +2638,14 @@ public final class FilePath implements Serializable {
ois.defaultReadObject();
if(ois.readBoolean()) {
this.channel = channel;
+ this.filter = null;
} else {
this.channel = null;
+ // If the remote channel wants us to create a FilePath that points to a local file,
+ // we need to make sure the access control takes place.
+ // This covers the immediate case of FileCallables taking FilePath into reference closure implicitly,
+ // but it also covers more general case of FilePath sent as a return value or argument.
+ this.filter = SoloFilePathFilter.wrap(FilePathFilter.current());
}
}
@@ -2428,6 +2680,14 @@ public final class FilePath implements Serializable {
}
}
+ /**
+ * Role check comes from {@link FileCallable}s.
+ */
+ @Override
+ public void checkRoles(RoleChecker checker) throws SecurityException {
+ callable.checkRoles(checker);
+ }
+
public ClassLoader getClassLoader() {
return classLoader;
}
@@ -2438,7 +2698,7 @@ public final class FilePath implements Serializable {
/**
* Used to tunnel {@link InterruptedException} over a Java signature that only allows {@link IOException}
*/
- private static class TunneledInterruptedException extends IOException2 {
+ private static class TunneledInterruptedException extends IOException {
private TunneledInterruptedException(InterruptedException cause) {
super(cause);
}
@@ -2470,7 +2730,7 @@ public final class FilePath implements Serializable {
* (User's home directory in the Unix sense) of the given channel.
*/
public static FilePath getHomeDirectory(VirtualChannel ch) throws InterruptedException, IOException {
- return ch.call(new Callable() {
+ return ch.call(new MasterToSlaveCallable() {
public FilePath call() throws IOException {
return new FilePath(new File(System.getProperty("user.home")));
}
@@ -2504,7 +2764,115 @@ public final class FilePath implements Serializable {
scanSingle(new File(dir, workspacePath), archivedPath, visitor);
}
}
+ }
+
+ private static final ExecutorService threadPoolForRemoting = new ContextResettingExecutorService(
+ Executors.newCachedThreadPool(
+ new ExceptionCatchingThreadFactory(
+ new NamingThreadFactory(new DaemonThreadFactory(), "FilePath.localPool"))
+ ));
+
+ public static final LocalChannel localChannel = new LocalChannel(threadPoolForRemoting);
+
+ private @Nonnull SoloFilePathFilter filterNonNull() {
+ return filter!=null ? filter : UNRESTRICTED;
+ }
+
+ /**
+ * Wraps {@link FileVisitor} to notify read access to {@link FilePathFilter}.
+ */
+ private FileVisitor reading(final FileVisitor v) {
+ final FilePathFilter filter = FilePathFilter.current();
+ if (filter==null) return v;
+
+ return new FileVisitor() {
+ @Override
+ public void visit(File f, String relativePath) throws IOException {
+ filter.read(f);
+ v.visit(f,relativePath);
+ }
+
+ @Override
+ public void visitSymlink(File link, String target, String relativePath) throws IOException {
+ filter.read(link);
+ v.visitSymlink(link, target, relativePath);
+ }
+
+ @Override
+ public boolean understandsSymlink() {
+ return v.understandsSymlink();
+ }
+ };
+ }
+
+ /**
+ * Pass through 'f' after ensuring that we can read that file.
+ */
+ private File reading(File f) {
+ filterNonNull().read(f);
+ return f;
+ }
+
+ /**
+ * Pass through 'f' after ensuring that we can access the file attributes.
+ */
+ private File stating(File f) {
+ filterNonNull().stat(f);
+ return f;
+ }
+
+ /**
+ * Pass through 'f' after ensuring that we can create that file/dir.
+ */
+ private File creating(File f) {
+ filterNonNull().create(f);
+ return f;
+ }
+
+ /**
+ * Pass through 'f' after ensuring that we can write to that file.
+ */
+ private File writing(File f) {
+ FilePathFilter filter = filterNonNull();
+ if (!f.exists())
+ filter.create(f);
+ filter.write(f);
+ return f;
+ }
+
+ /**
+ * Pass through 'f' after ensuring that we can create that symlink.
+ */
+ private File symlinking(File f) {
+ FilePathFilter filter = filterNonNull();
+ if (!f.exists())
+ filter.create(f);
+ filter.symlink(f);
+ return f;
+ }
+ /**
+ * Pass through 'f' after ensuring that we can delete that file.
+ */
+ private File deleting(File f) {
+ filterNonNull().delete(f);
+ return f;
+ }
+
+ private boolean mkdirs(File dir) {
+ if (dir.exists()) return false;
+
+ filterNonNull().mkdirs(dir);
+ return dir.mkdirs();
+ }
+
+ private File mkdirsE(File dir) throws IOException {
+ if (dir.exists()) {
+ return dir;
+ }
+ filterNonNull().mkdirs(dir);
+ return IOUtils.mkdirs(dir);
}
+ private static final SoloFilePathFilter UNRESTRICTED = SoloFilePathFilter.wrap(FilePathFilter.UNRESTRICTED);
}
diff --git a/core/src/main/java/hudson/FileSystemProvisioner.java b/core/src/main/java/hudson/FileSystemProvisioner.java
index 0ab7e44a1eb791749d64ffaa9fe57d98790e0c76..58680eb88847035b1d00790d2c453e5edb82537e 100644
--- a/core/src/main/java/hudson/FileSystemProvisioner.java
+++ b/core/src/main/java/hudson/FileSystemProvisioner.java
@@ -24,14 +24,12 @@
package hudson;
import hudson.FilePath.TarCompression;
-import hudson.matrix.MatrixBuild;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
import hudson.model.Computer;
import hudson.model.Describable;
import hudson.model.Job;
import hudson.model.TaskListener;
-import hudson.util.DirScanner.Glob;
import hudson.util.io.ArchiverFactory;
import jenkins.model.Jenkins;
import hudson.model.listeners.RunListener;
@@ -158,7 +156,7 @@ public abstract class FileSystemProvisioner implements ExtensionPoint, Describab
*
* The state of the build when this method is invoked depends on
* the project type. Most would call this at the end of the build,
- * but for example {@link MatrixBuild} would call this after
+ * but for example {@code MatrixBuild} would call this after
* SCM check out so that the state of the fresh workspace
* can be then propagated to elsewhere.
*
diff --git a/core/src/main/java/hudson/Functions.java b/core/src/main/java/hudson/Functions.java
index 53f53f2c52e92b99fa7f4106fbe6fd9380ebb3ac..b3fd046b105896514fc236c5a21da258305bf8d9 100644
--- a/core/src/main/java/hudson/Functions.java
+++ b/core/src/main/java/hudson/Functions.java
@@ -28,7 +28,6 @@ package hudson;
import hudson.cli.CLICommand;
import hudson.console.ConsoleAnnotationDescriptor;
import hudson.console.ConsoleAnnotatorFactory;
-import hudson.matrix.MatrixProject;
import hudson.model.AbstractProject;
import hudson.model.Action;
import hudson.model.Describable;
@@ -44,9 +43,9 @@ import hudson.model.JobPropertyDescriptor;
import hudson.model.ModelObject;
import hudson.model.Node;
import hudson.model.PageDecorator;
+import hudson.model.PaneStatusProperties;
import hudson.model.ParameterDefinition;
import hudson.model.ParameterDefinition.ParameterDescriptor;
-import hudson.model.Project;
import hudson.model.Run;
import hudson.model.TopLevelItem;
import hudson.model.User;
@@ -139,7 +138,7 @@ import org.apache.commons.jelly.XMLOutput;
import org.apache.commons.jexl.parser.ASTSizeFunction;
import org.apache.commons.jexl.util.Introspector;
import org.apache.commons.lang.StringUtils;
-import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement;
+import org.jenkins.ui.icon.IconSet;
import org.jvnet.tiger_types.Types;
import org.kohsuke.stapler.Ancestor;
import org.kohsuke.stapler.Stapler;
@@ -149,9 +148,9 @@ import org.kohsuke.stapler.jelly.InternationalizedStringExpression.RawHtmlArgume
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
+import hudson.util.RunList;
import java.util.concurrent.atomic.AtomicLong;
import org.kohsuke.accmod.Restricted;
-import org.kohsuke.accmod.restrictions.DoNotUse;
import org.kohsuke.accmod.restrictions.NoExternalUse;
/**
@@ -189,11 +188,9 @@ public class Functions {
return o instanceof ModelObjectWithChildren;
}
- /**
- * @since 1.524
- */
+ @Deprecated
public static boolean isMatrixProject(Object o) {
- return o instanceof MatrixProject;
+ return o != null && o.getClass().getName().equals("hudson.matrix.MatrixProject");
}
public static String xsDate(Calendar cal) {
@@ -205,7 +202,8 @@ public class Functions {
}
public static void initPageVariables(JellyContext context) {
- String rootURL = Stapler.getCurrentRequest().getContextPath();
+ StaplerRequest currentRequest = Stapler.getCurrentRequest();
+ String rootURL = currentRequest.getContextPath();
Functions h = new Functions();
context.setVariable("h", h);
@@ -225,6 +223,9 @@ public class Functions {
*/
context.setVariable("resURL",rootURL+getResourcePath());
context.setVariable("imagesURL",rootURL+getResourcePath()+"/images");
+
+ context.setVariable("userAgent", currentRequest.getHeader("User-Agent"));
+ IconSet.initPageVariables(context);
}
/**
@@ -408,7 +409,7 @@ public class Functions {
return Node.Mode.values();
}
- public static String getProjectListString(List projects) {
+ public static String getProjectListString(List projects) {
return Items.toNameList(projects);
}
@@ -445,13 +446,14 @@ public class Functions {
return formatter.format(r);
}
- @Restricted(DoNotUse.class)
+ @Restricted(NoExternalUse.class)
public static String[] printLogRecordHtml(LogRecord r, LogRecord prior) {
String[] oldParts = prior == null ? new String[4] : logRecordPreformat(prior);
String[] newParts = logRecordPreformat(r);
for (int i = 0; i < /* not 4 */3; i++) {
newParts[i] = "" + newParts[i] + "";
}
+ newParts[3] = Util.xmlEscape(newParts[3]);
return newParts;
}
/**
@@ -508,6 +510,15 @@ public class Functions {
return c.getValue();
}
+ private static final Pattern ICON_SIZE = Pattern.compile("\\d+x\\d+");
+ @Restricted(NoExternalUse.class)
+ public static String validateIconSize(String iconSize) throws SecurityException {
+ if (!ICON_SIZE.matcher(iconSize).matches()) {
+ throw new SecurityException("invalid iconSize");
+ }
+ return iconSize;
+ }
+
/**
* Gets the suffix to use for YUI JavaScript.
*/
@@ -533,6 +544,20 @@ public class Functions {
return map.subMap(Integer.parseInt(to),Integer.parseInt(from)-1);
}
+ /**
+ * Creates a sub map by using the given range (upper end inclusive).
+ */
+ @Restricted(NoExternalUse.class)
+ public static SortedMap filterExcludingFrom(SortedMap map, String from, String to) {
+ if(from==null && to==null) return map;
+ if(to==null)
+ return map.headMap(Integer.parseInt(from));
+ if(from==null)
+ return map.tailMap(Integer.parseInt(to));
+
+ return map.subMap(Integer.parseInt(to),Integer.parseInt(from));
+ }
+
private static final SimpleFormatter formatter = new SimpleFormatter();
/**
@@ -580,6 +605,10 @@ public class Functions {
return false;
}
+ public static boolean isCollapsed(String paneId) {
+ return PaneStatusProperties.forCurrentUser().isCollapsed(paneId);
+ }
+
/**
* Finds the given object in the ancestor list and returns its URL.
* This is used to determine the "current" URL assigned to the given object,
@@ -883,7 +912,7 @@ public class Functions {
* @since 1.494
*/
public static Collection getSortedDescriptorsForGlobalConfig(Predicate predicate) {
- ExtensionList exts = Jenkins.getInstance().getExtensionList(Descriptor.class);
+ ExtensionList exts = ExtensionList.lookup(Descriptor.class);
List r = new ArrayList(exts.size());
for (ExtensionComponent c : exts.getComponents()) {
@@ -999,20 +1028,15 @@ public class Functions {
Item i=p;
String url = "";
- Collection viewItems;
- if (view != null) {
- viewItems = view.getItems();
- } else {
- viewItems = Collections.emptyList();
- }
while(true) {
ItemGroup ig = i.getParent();
url = i.getShortUrl()+url;
if(ig== Jenkins.getInstance() || (view != null && ig == view.getOwnerItemGroup())) {
assert i instanceof TopLevelItem;
- if(viewItems.contains((TopLevelItem)i)) {
- // if p and the current page belongs to the same view, then return a relative path
+ if (view != null) {
+ // assume p and the current page belong to the same view, so return a relative path
+ // (even if they did not, View.getItem does not by default verify ownership)
return normalizeURI(ancestors.get(view)+'/'+url);
} else {
// otherwise return a path from the root Hudson
@@ -1125,7 +1149,6 @@ public class Functions {
return sorted;
}
- @IgnoreJRERequirement
public static ThreadInfo[] getThreadInfos() {
ThreadMXBean mbean = ManagementFactory.getThreadMXBean();
return mbean.dumpAllThreads(mbean.isObjectMonitorUsageSupported(),mbean.isSynchronizerUsageSupported());
@@ -1189,20 +1212,14 @@ public class Functions {
}
/**
- * Are we running on JRE6 or above?
+ * @deprecated Now always true.
*/
- @IgnoreJRERequirement
+ @Deprecated
public static boolean isMustangOrAbove() {
- try {
- System.console();
- return true;
- } catch(LinkageError e) {
- return false;
- }
+ return true;
}
// ThreadInfo.toString() truncates the stack trace by first 8, so needed my own version
- @IgnoreJRERequirement
public static String dumpThreadInfo(ThreadInfo ti, ThreadGroupMap map) {
String grp = map.getThreadGroup(ti);
StringBuilder sb = new StringBuilder("\"" + ti.getThreadName() + "\"" +
@@ -1465,7 +1482,8 @@ public class Functions {
}
/**
- * Returns a sub-list if the given list is bigger than the specified 'maxSize'
+ * Returns a sub-list if the given list is bigger than the specified {@code maxSize}.
+ * Warning: do not call this with a {@link RunList}, or you will break lazy loading!
*/
public static List subList(List base, int maxSize) {
if(maxSize$1")
- .replaceAll("(\\w{10})(?=\\w{3})", "$1")
+ if (plain == null) {
+ return null;
+ }
+ return plain.replaceAll("([\\p{Punct}&&[^;]]+\\w)", "$1")
+ .replaceAll("([^\\p{Punct}\\s-]{20})(?=[^\\p{Punct}\\s-]{10})", "$1")
;
}
diff --git a/core/src/main/java/hudson/Launcher.java b/core/src/main/java/hudson/Launcher.java
index ba599e1753515becf9d52872405c0949558bcdd6..be003dfb648a76a3463bdae92151d9f812e37e0f 100644
--- a/core/src/main/java/hudson/Launcher.java
+++ b/core/src/main/java/hudson/Launcher.java
@@ -38,7 +38,10 @@ import hudson.remoting.VirtualChannel;
import hudson.util.StreamCopyThread;
import hudson.util.ArgumentListBuilder;
import hudson.util.ProcessTree;
+import jenkins.security.MasterToSlaveCallable;
import org.apache.commons.io.input.NullInputStream;
+import org.kohsuke.accmod.Restricted;
+import org.kohsuke.accmod.restrictions.NoExternalUse;
import java.io.BufferedOutputStream;
import java.io.File;
@@ -144,6 +147,7 @@ public abstract class Launcher {
public final class ProcStarter {
protected List commands;
protected boolean[] masks;
+ private boolean quiet;
protected FilePath pwd;
protected OutputStream stdout = NULL_OUTPUT_STREAM, stderr;
protected InputStream stdin = NULL_INPUT_STREAM;
@@ -210,6 +214,25 @@ public abstract class Launcher {
return masks;
}
+ /**
+ * Allows {@link #maskedPrintCommandLine(List, boolean[], FilePath)} to be suppressed from {@link hudson.Launcher.LocalLauncher#launch(hudson.Launcher.ProcStarter)}.
+ * Useful when the actual command being printed is noisy and unreadable and the caller would rather print diagnostic information in a customized way.
+ * @param quiet to suppress printing the command line when starting the process; false to keep default behavior of printing
+ * @return this
+ * @since 1.576
+ */
+ public ProcStarter quiet(boolean quiet) {
+ this.quiet = quiet;
+ return this;
+ }
+
+ /**
+ * @since 1.576
+ */
+ public boolean quiet() {
+ return quiet;
+ }
+
public ProcStarter pwd(FilePath workDir) {
this.pwd = workDir;
return this;
@@ -298,8 +321,13 @@ public abstract class Launcher {
return this;
}
+ /**
+ * Gets a list of environment variables to be set.
+ * Returns an empty array if envs field has not been initialized.
+ * @return If initialized, returns a copy of internal envs array. Otherwise - a new empty array.
+ */
public String[] envs() {
- return envs.clone();
+ return envs != null ? envs.clone() : new String[0];
}
/**
@@ -364,7 +392,7 @@ public abstract class Launcher {
* Copies a {@link ProcStarter}.
*/
public ProcStarter copy() {
- ProcStarter rhs = new ProcStarter().cmds(commands).pwd(pwd).masks(masks).stdin(stdin).stdout(stdout).stderr(stderr).envs(envs);
+ ProcStarter rhs = new ProcStarter().cmds(commands).pwd(pwd).masks(masks).stdin(stdin).stdout(stdout).stderr(stderr).envs(envs).quiet(quiet);
rhs.reverseStdin = this.reverseStdin;
rhs.reverseStderr = this.reverseStderr;
rhs.reverseStdout = this.reverseStdout;
@@ -752,7 +780,7 @@ public abstract class Launcher {
*/
public static class LocalLauncher extends Launcher {
public LocalLauncher(TaskListener listener) {
- this(listener, Jenkins.MasterComputer.localChannel);
+ this(listener, FilePath.localChannel);
}
public LocalLauncher(TaskListener listener, VirtualChannel channel) {
@@ -761,7 +789,9 @@ public abstract class Launcher {
@Override
public Proc launch(ProcStarter ps) throws IOException {
- maskedPrintCommandLine(ps.commands, ps.masks, ps.pwd);
+ if (!ps.quiet) {
+ maskedPrintCommandLine(ps.commands, ps.masks, ps.pwd);
+ }
EnvVars jobEnv = inherit(ps.envs);
@@ -816,7 +846,7 @@ public abstract class Launcher {
* Kill the process when the channel is severed.
*/
@Override
- protected synchronized void terminate(IOException e) {
+ public synchronized void terminate(IOException e) {
super.terminate(e);
ProcessTree pt = ProcessTree.get();
try {
@@ -841,6 +871,30 @@ public abstract class Launcher {
}
}
+ @Restricted(NoExternalUse.class)
+ public static class DummyLauncher extends Launcher {
+
+ public DummyLauncher(TaskListener listener) {
+ super(listener, null);
+ }
+
+ @Override
+ public Proc launch(ProcStarter starter) throws IOException {
+ throw new IOException("Can not call launch on a dummy launcher.");
+ }
+
+ @Override
+ public Channel launchChannel(String[] cmd, OutputStream out, FilePath workDir, Map envVars) throws IOException, InterruptedException {
+ throw new IOException("Can not call launchChannel on a dummy launcher.");
+ }
+
+ @Override
+ public void kill(Map modelEnvVars) throws IOException, InterruptedException {
+ // Kill method should do nothing.
+ }
+ }
+
+
/**
* Launches processes remotely by using the given channel.
*/
@@ -859,7 +913,7 @@ public abstract class Launcher {
final String workDir = ps.pwd==null ? null : ps.pwd.getRemote();
try {
- return new ProcImpl(getChannel().call(new RemoteLaunchCallable(ps.commands, ps.masks, ps.envs, in, ps.reverseStdin, out, ps.reverseStdout, err, ps.reverseStderr, workDir, listener)));
+ return new ProcImpl(getChannel().call(new RemoteLaunchCallable(ps.commands, ps.masks, ps.envs, in, ps.reverseStdin, out, ps.reverseStdout, err, ps.reverseStderr, ps.quiet, workDir, listener)));
} catch (InterruptedException e) {
throw (IOException)new InterruptedIOException().initCause(e);
}
@@ -887,7 +941,7 @@ public abstract class Launcher {
getChannel().call(new KillTask(modelEnvVars));
}
- private static final class KillTask implements Callable {
+ private static final class KillTask extends MasterToSlaveCallable {
private final Map modelEnvVars;
public KillTask(Map modelEnvVars) {
@@ -946,6 +1000,88 @@ public abstract class Launcher {
}
}
}
+
+ /**
+ * A launcher which delegates to a provided inner launcher.
+ * Allows subclasses to only implement methods they want to override.
+ * Originally, this launcher has been implemented in
+ *
+ * Custom Tools Plugin.
+ *
+ * @author rcampbell
+ * @author Oleg Nenashev, Synopsys Inc.
+ * @since 1.568
+ */
+ public static class DecoratedLauncher extends Launcher {
+
+ private Launcher inner = null;
+
+ public DecoratedLauncher(Launcher inner) {
+ super(inner);
+ this.inner = inner;
+ }
+
+ @Override
+ public Proc launch(ProcStarter starter) throws IOException {
+ return inner.launch(starter);
+ }
+
+ @Override
+ public Channel launchChannel(String[] cmd, OutputStream out,
+ FilePath workDir, Map envVars) throws IOException,
+ InterruptedException {
+ return inner.launchChannel(cmd, out, workDir, envVars);
+ }
+
+ @Override
+ public void kill(Map modelEnvVars) throws IOException,
+ InterruptedException {
+ inner.kill(modelEnvVars);
+ }
+
+ @Override
+ public boolean isUnix() {
+ return inner.isUnix();
+ }
+
+ @Override
+ public Proc launch(String[] cmd, boolean[] mask, String[] env, InputStream in, OutputStream out, FilePath workDir) throws IOException {
+ return inner.launch(cmd, mask, env, in, out, workDir);
+ }
+
+ @Override
+ public Computer getComputer() {
+ return inner.getComputer();
+ }
+
+ @Override
+ public TaskListener getListener() {
+ return inner.getListener();
+ }
+
+ @Override
+ public String toString() {
+ return super.toString() + "; decorates " + inner.toString();
+ }
+
+ @Override
+ public VirtualChannel getChannel() {
+ return inner.getChannel();
+ }
+
+ @Override
+ public Proc launch(String[] cmd, String[] env, InputStream in, OutputStream out, FilePath workDir) throws IOException {
+ return inner.launch(cmd, env, in, out, workDir);
+ }
+
+ /**
+ * Gets nested launcher.
+ * @return Inner launcher
+ */
+ public Launcher getInner() {
+ return inner;
+ }
+ }
public static class IOTriplet implements Serializable {
InputStream stdout,stderr;
@@ -962,7 +1098,7 @@ public abstract class Launcher {
IOTriplet getIOtriplet();
}
- private static class RemoteLaunchCallable implements Callable {
+ private static class RemoteLaunchCallable extends MasterToSlaveCallable {
private final List cmd;
private final boolean[] masks;
private final String[] env;
@@ -972,8 +1108,9 @@ public abstract class Launcher {
private final String workDir;
private final TaskListener listener;
private final boolean reverseStdin, reverseStdout, reverseStderr;
+ private final boolean quiet;
- RemoteLaunchCallable(List cmd, boolean[] masks, String[] env, InputStream in, boolean reverseStdin, OutputStream out, boolean reverseStdout, OutputStream err, boolean reverseStderr, String workDir, TaskListener listener) {
+ RemoteLaunchCallable(List cmd, boolean[] masks, String[] env, InputStream in, boolean reverseStdin, OutputStream out, boolean reverseStdout, OutputStream err, boolean reverseStderr, boolean quiet, String workDir, TaskListener listener) {
this.cmd = new ArrayList(cmd);
this.masks = masks;
this.env = env;
@@ -985,11 +1122,12 @@ public abstract class Launcher {
this.reverseStdin = reverseStdin;
this.reverseStdout = reverseStdout;
this.reverseStderr = reverseStderr;
+ this.quiet = quiet;
}
public RemoteProcess call() throws IOException {
Launcher.ProcStarter ps = new LocalLauncher(listener).launch();
- ps.cmds(cmd).masks(masks).envs(env).stdin(in).stdout(out).stderr(err);
+ ps.cmds(cmd).masks(masks).envs(env).stdin(in).stdout(out).stderr(err).quiet(quiet);
if(workDir!=null) ps.pwd(workDir);
if (reverseStdin) ps.writeStdin();
if (reverseStdout) ps.readStdout();
@@ -1032,7 +1170,7 @@ public abstract class Launcher {
private static final long serialVersionUID = 1L;
}
- private static class RemoteChannelLaunchCallable implements Callable {
+ private static class RemoteChannelLaunchCallable extends MasterToSlaveCallable {
private final String[] cmd;
private final Pipe out;
private final String workDir;
diff --git a/core/src/main/java/hudson/LauncherDecorator.java b/core/src/main/java/hudson/LauncherDecorator.java
index 0abfca30e2a9eb7da98fccab621ada8e5f5d2244..3bd5f7d0212b56bb87be7ebe56d1e5bda08c96c7 100644
--- a/core/src/main/java/hudson/LauncherDecorator.java
+++ b/core/src/main/java/hudson/LauncherDecorator.java
@@ -45,6 +45,6 @@ public abstract class LauncherDecorator implements ExtensionPoint {
* Returns all the registered {@link LauncherDecorator}s.
*/
public static ExtensionList all() {
- return Jenkins.getInstance().getExtensionList(LauncherDecorator.class);
+ return ExtensionList.lookup(LauncherDecorator.class);
}
}
diff --git a/core/src/main/java/hudson/Main.java b/core/src/main/java/hudson/Main.java
index 45067f932baf92499c5e3b1018fe381c19e8326a..cf8a168ba115549ba3e6be45cbdf70423198311d 100644
--- a/core/src/main/java/hudson/Main.java
+++ b/core/src/main/java/hudson/Main.java
@@ -37,7 +37,6 @@ import java.io.Writer;
import java.net.HttpRetryException;
import java.net.HttpURLConnection;
import java.net.URL;
-import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.nio.charset.Charset;
@@ -104,14 +103,14 @@ public class Main {
}
}
- String projectNameEnc = URLEncoder.encode(projectName,"UTF-8").replaceAll("\\+","%20");
+ URL jobURL = new URL(home + "job/" + Util.encode(projectName).replace("/", "/job/") + "/");
{// check if the job name is correct
- HttpURLConnection con = open(new URL(home+"job/"+projectNameEnc+"/acceptBuildResult"));
+ HttpURLConnection con = open(new URL(jobURL, "acceptBuildResult"));
if (auth != null) con.setRequestProperty("Authorization", auth);
con.connect();
if(con.getResponseCode()!=200) {
- System.err.println(projectName+" is not a valid job name on "+home+" ("+con.getResponseMessage()+")");
+ System.err.println(jobURL + " is not a valid external job (" + con.getResponseCode() + " " + con.getResponseMessage() + ")");
return -1;
}
}
@@ -138,29 +137,33 @@ public class Main {
FileOutputStream os = new FileOutputStream(tmpFile);
Writer w = new OutputStreamWriter(os,"UTF-8");
- w.write("");
- w.write("");
- w.flush();
-
- // run the command
- long start = System.currentTimeMillis();
-
- List cmd = new ArrayList();
- for( int i=1; i"+ret+""+(System.currentTimeMillis()-start)+"");
- w.close();
+ int ret;
+ try {
+ w.write("");
+ w.write("");
+ w.flush();
+
+ // run the command
+ long start = System.currentTimeMillis();
+
+ List cmd = new ArrayList();
+ for( int i=1; i"+ret+""+(System.currentTimeMillis()-start)+"");
+ } finally {
+ IOUtils.closeQuietly(w);
+ }
- String location = home+"job/"+projectNameEnc+"/postBuildResult";
+ URL location = new URL(jobURL, "postBuildResult");
while(true) {
try {
// start a remote connection
- HttpURLConnection con = open(new URL(location));
+ HttpURLConnection con = open(location);
if (auth != null) con.setRequestProperty("Authorization", auth);
if (crumbField != null && crumbValue != null) {
con.setRequestProperty(crumbField, crumbValue);
@@ -171,8 +174,11 @@ public class Main {
con.connect();
// send the data
FileInputStream in = new FileInputStream(tmpFile);
- Util.copyStream(in,con.getOutputStream());
- in.close();
+ try {
+ Util.copyStream(in,con.getOutputStream());
+ } finally {
+ IOUtils.closeQuietly(in);
+ }
if(con.getResponseCode()!=200) {
Util.copyStream(con.getErrorStream(),System.err);
@@ -182,7 +188,7 @@ public class Main {
} catch (HttpRetryException e) {
if(e.getLocation()!=null) {
// retry with the new location
- location = e.getLocation();
+ location = new URL(e.getLocation());
continue;
}
// otherwise failed for reasons beyond us.
diff --git a/core/src/main/java/hudson/Plugin.java b/core/src/main/java/hudson/Plugin.java
index 20f671e8dcc7e100c25cf0d0e67549691db0b30d..1e11d23bcd848cc1625542e564cbc7833228fa05 100644
--- a/core/src/main/java/hudson/Plugin.java
+++ b/core/src/main/java/hudson/Plugin.java
@@ -30,25 +30,28 @@ import hudson.model.Saveable;
import hudson.model.listeners.ItemListener;
import hudson.model.listeners.SaveableListener;
import hudson.model.Descriptor.FormException;
-import org.kohsuke.stapler.MetaClass;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.File;
-import java.net.URL;
import net.sf.json.JSONObject;
import com.thoughtworks.xstream.XStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import org.kohsuke.stapler.HttpResponses;
/**
* Base class of Hudson plugin.
*
*
- * A plugin needs to derive from this class.
+ * A plugin may derive from this class, or it may directly define extension
+ * points annotated with {@link hudson.Extension}. For a list of extension
+ * points, see
+ * https://wiki.jenkins-ci.org/display/JENKINS/Extension+points.
*
*
* One instance of a plugin is created by Hudson, and used as the entry point
@@ -201,15 +204,13 @@ public abstract class Plugin implements Saveable {
public void doDynamic(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
String path = req.getRestOfPath();
+ if (path.startsWith("/META-INF/") || path.startsWith("/WEB-INF/")) {
+ throw HttpResponses.notFound();
+ }
+
if(path.length()==0)
path = "/";
- if(path.indexOf("..")!=-1 || path.length()<1) {
- // don't serve anything other than files in the sub directory.
- rsp.sendError(HttpServletResponse.SC_BAD_REQUEST);
- return;
- }
-
// Stapler routes requests like the "/static/.../foo/bar/zot" to be treated like "/foo/bar/zot"
// and this is used to serve long expiration header, by using Jenkins.VERSION_HASH as "..."
// to create unique URLs. Recognize that and set a long expiration header.
@@ -219,7 +220,11 @@ public abstract class Plugin implements Saveable {
long expires = staticLink ? TimeUnit2.DAYS.toMillis(365) : -1;
// use serveLocalizedFile to support automatic locale selection
- rsp.serveLocalizedFile(req, new URL(wrapper.baseResourceURL,'.'+path),expires);
+ try {
+ rsp.serveLocalizedFile(req, wrapper.baseResourceURL.toURI().resolve(new URI(null, '.' + path, null)).toURL(), expires);
+ } catch (URISyntaxException x) {
+ throw new IOException(x);
+ }
}
//
diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java
index 7ce9dea6d3456fbbab2306b7ad951265ae0215c8..d2918a7aa4b1c6c5ed307492bb2a41ce1eef6dd9 100644
--- a/core/src/main/java/hudson/PluginManager.java
+++ b/core/src/main/java/hudson/PluginManager.java
@@ -40,7 +40,7 @@ import hudson.security.Permission;
import hudson.security.PermissionScope;
import hudson.util.CyclicGraphDetector;
import hudson.util.CyclicGraphDetector.CycleDetectedException;
-import hudson.util.IOException2;
+import hudson.util.IOUtils;
import hudson.util.PersistedList;
import hudson.util.Service;
import hudson.util.VersionNumber;
@@ -75,17 +75,19 @@ import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;
import org.kohsuke.stapler.interceptor.RequirePOST;
+import javax.annotation.CheckForNull;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
+import java.io.Closeable;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.WeakReference;
-import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
+import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -103,6 +105,7 @@ import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Future;
import java.util.jar.JarFile;
+import java.util.jar.Manifest;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.xml.sax.Attributes;
@@ -110,7 +113,11 @@ import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import static hudson.init.InitMilestone.*;
+import hudson.model.DownloadService;
+import hudson.util.FormValidation;
import static java.util.logging.Level.WARNING;
+import org.kohsuke.accmod.Restricted;
+import org.kohsuke.accmod.restrictions.NoExternalUse;
/**
* Manages {@link PluginWrapper}s.
@@ -174,6 +181,11 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
*/
private final PluginStrategy strategy;
+ /**
+ * Manifest of the plugin binaries that are bundled with core.
+ */
+ private final Map bundledPluginManifests = new HashMap();
+
public PluginManager(ServletContext context, File rootDir) {
this.context = context;
@@ -301,7 +313,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
cgd.run(getPlugins());
// obtain topologically sorted list and overwrite the list
- ListIterator litr = plugins.listIterator();
+ ListIterator litr = getPlugins().listIterator();
for (PluginWrapper p : cgd.getSorted()) {
litr.next();
litr.set(p);
@@ -405,16 +417,33 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
|| bundledPlugins.contains(name.replaceAll("\\.jpi",".hpi"));
}
+ /**
+ * Returns the manifest of a bundled but not-extracted plugin.
+ */
+ public @CheckForNull Manifest getBundledPluginManifest(String shortName) {
+ return bundledPluginManifests.get(shortName);
+ }
+
/**
* TODO: revisit where/how to expose this. This is an experiment.
*/
public void dynamicLoad(File arc) throws IOException, InterruptedException, RestartRequiredException {
LOGGER.info("Attempting to dynamic load "+arc);
- final PluginWrapper p = strategy.createPluginWrapper(arc);
- String sn = p.getShortName();
+ PluginWrapper p = null;
+ String sn;
+ try {
+ sn = strategy.getShortName(arc);
+ } catch (AbstractMethodError x) {
+ LOGGER.log(WARNING, "JENKINS-12753 fix not active: {0}", x.getMessage());
+ p = strategy.createPluginWrapper(arc);
+ sn = p.getShortName();
+ }
if (getPlugin(sn)!=null)
throw new RestartRequiredException(Messages._PluginManager_PluginIsAlreadyInstalled_RestartRequired(sn));
+ if (p == null) {
+ p = strategy.createPluginWrapper(arc);
+ }
if (p.supportsDynamicLoad()== YesNoMaybe.NO)
throw new RestartRequiredException(Messages._PluginManager_PluginDoesntSupportDynamicLoad_RestartRequired(sn));
@@ -423,6 +452,9 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
plugins.add(p);
activePlugins.add(p);
+ synchronized (((UberClassLoader) uberClassLoader).loaded) {
+ ((UberClassLoader) uberClassLoader).loaded.clear();
+ }
try {
p.resolvePluginDependencies();
@@ -435,22 +467,44 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
failedPlugins.add(new FailedPlugin(sn, e));
activePlugins.remove(p);
plugins.remove(p);
- throw new IOException2("Failed to install "+ sn +" plugin",e);
+ throw new IOException("Failed to install "+ sn +" plugin",e);
}
// run initializers in the added plugin
Reactor r = new Reactor(InitMilestone.ordering());
- r.addAll(new InitializerFinder(p.classLoader) {
+ final ClassLoader loader = p.classLoader;
+ r.addAll(new InitializerFinder(loader) {
@Override
protected boolean filter(Method e) {
- return e.getDeclaringClass().getClassLoader()!=p.classLoader || super.filter(e);
+ return e.getDeclaringClass().getClassLoader() != loader || super.filter(e);
}
}.discoverTasks(r));
try {
new InitReactorRunner().run(r);
} catch (ReactorException e) {
- throw new IOException2("Failed to initialize "+ sn +" plugin",e);
+ throw new IOException("Failed to initialize "+ sn +" plugin",e);
}
+
+ // recalculate dependencies of plugins optionally depending the newly deployed one.
+ for (PluginWrapper depender: plugins) {
+ if (depender.equals(p)) {
+ // skip itself.
+ continue;
+ }
+ for (Dependency d: depender.getOptionalDependencies()) {
+ if (d.shortName.equals(p.getShortName())) {
+ // this plugin depends on the newly loaded one!
+ // recalculate dependencies!
+ try {
+ getPluginStrategy().updateDependency(depender, p);
+ } catch (AbstractMethodError x) {
+ LOGGER.log(WARNING, "{0} does not yet implement updateDependency", getPluginStrategy().getClass());
+ }
+ break;
+ }
+ }
+ }
+
LOGGER.info("Plugin " + sn + " dynamically installed");
}
@@ -490,6 +544,34 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
// - to make sure the value is not changed after each restart, so we can avoid
// unpacking the plugin itself in ClassicPluginStrategy.explode
}
+ if (pinFile.exists())
+ parsePinnedBundledPluginManifest(src);
+ }
+
+ /**
+ * When a pin file prevented a bundled plugin from getting extracted, check if the one we currently have
+ * is older than we bundled.
+ */
+ private void parsePinnedBundledPluginManifest(URL bundledJpi) {
+ try {
+ URLClassLoader cl = new URLClassLoader(new URL[]{bundledJpi});
+ InputStream in=null;
+ try {
+ URL res = cl.findResource(PluginWrapper.MANIFEST_FILENAME);
+ if (res!=null) {
+ in = res.openStream();
+ Manifest manifest = new Manifest(in);
+ String shortName = PluginWrapper.computeShortName(manifest, FilenameUtils.getName(bundledJpi.getPath()));
+ bundledPluginManifests.put(shortName, manifest);
+ }
+ } finally {
+ IOUtils.closeQuietly(in);
+ if (cl instanceof Closeable)
+ ((Closeable)cl).close();
+ }
+ } catch (IOException e) {
+ LOGGER.log(WARNING, "Failed to parse manifest of "+bundledJpi, e);
+ }
}
/**
@@ -553,7 +635,9 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
*/
@Exported
public List getPlugins() {
- return plugins;
+ List out = new ArrayList(plugins.size());
+ out.addAll(plugins);
+ return out;
}
public List getFailedPlugins() {
@@ -566,7 +650,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
* @return The plugin singleton or null
if a plugin with the given short name does not exist.
*/
public PluginWrapper getPlugin(String shortName) {
- for (PluginWrapper p : plugins) {
+ for (PluginWrapper p : getPlugins()) {
if(p.getShortName().equals(shortName))
return p;
}
@@ -580,7 +664,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
* @return The plugin singleton or null
if for some reason the plugin is not loaded.
*/
public PluginWrapper getPlugin(Class extends Plugin> pluginClazz) {
- for (PluginWrapper p : plugins) {
+ for (PluginWrapper p : getPlugins()) {
if(pluginClazz.isInstance(p.getPlugin()))
return p;
}
@@ -595,7 +679,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
*/
public List getPlugins(Class extends Plugin> pluginSuperclass) {
List result = new ArrayList();
- for (PluginWrapper p : plugins) {
+ for (PluginWrapper p : getPlugins()) {
if(pluginSuperclass.isInstance(p.getPlugin()))
result.add(p);
}
@@ -686,13 +770,33 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
String n = en.nextElement();
if(n.startsWith("plugin.")) {
n = n.substring(7);
- if (n.indexOf(".") > 0) {
- String[] pluginInfo = n.split("\\.");
- UpdateSite.Plugin p = Jenkins.getInstance().getUpdateCenter().getById(pluginInfo[1]).getPlugin(pluginInfo[0]);
- if(p==null)
- throw new Failure("No such plugin: "+n);
- p.deploy(dynamicLoad);
+ // JENKINS-22080 plugin names can contain '.' as could (according to rumour) update sites
+ int index = n.indexOf('.');
+ UpdateSite.Plugin p = null;
+ while (index != -1) {
+ if (index + 1 >= n.length()) {
+ break;
+ }
+ String pluginName = n.substring(0, index);
+ String siteName = n.substring(index + 1);
+ UpdateSite updateSite = Jenkins.getInstance().getUpdateCenter().getById(siteName);
+ if (updateSite == null) {
+ throw new Failure("No such update center: " + siteName);
+ } else {
+ UpdateSite.Plugin plugin = updateSite.getPlugin(pluginName);
+ if (plugin != null) {
+ if (p != null) {
+ throw new Failure("Ambiguous plugin: " + n);
+ }
+ p = plugin;
+ }
+ }
+ index = n.indexOf('.', index + 1);
}
+ if (p == null) {
+ throw new Failure("No such plugin: " + n);
+ }
+ p.deploy(dynamicLoad);
}
}
rsp.sendRedirect("../updateCenter/");
@@ -777,6 +881,24 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
}
}
+ @Restricted(NoExternalUse.class)
+ @RequirePOST public HttpResponse doCheckUpdatesServer() throws IOException {
+ for (UpdateSite site : Jenkins.getInstance().getUpdateCenter().getSites()) {
+ FormValidation v = site.updateDirectlyNow(DownloadService.signatureCheck);
+ if (v.kind != FormValidation.Kind.OK) {
+ // TODO crude but enough for now
+ return v;
+ }
+ }
+ for (DownloadService.Downloadable d : DownloadService.Downloadable.all()) {
+ FormValidation v = d.updateNow();
+ if (v.kind != FormValidation.Kind.OK) {
+ return v;
+ }
+ }
+ return HttpResponses.forwardToPreviousPage();
+ }
+
protected String identifyPluginShortName(File t) {
try {
JarFile j = new JarFile(t);
@@ -925,7 +1047,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
}
});
} catch (SAXException x) {
- throw new IOException2("Failed to parse XML",x);
+ throw new IOException("Failed to parse XML",x);
} catch (ParserConfigurationException e) {
throw new AssertionError(e); // impossible since we don't tweak XMLParser
}
@@ -941,8 +1063,8 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
* Keyed by the generated class name.
*/
private ConcurrentMap> generatedClasses = new ConcurrentHashMap>();
-
- private ClassLoaderReflectionToolkit clt = new ClassLoaderReflectionToolkit();
+ /** Cache of loaded, or known to be unloadable, classes. */
+ private final Map> loaded = new HashMap>();
public UberClassLoader() {
super(PluginManager.class.getClassLoader());
@@ -961,14 +1083,36 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
else generatedClasses.remove(name,wc);
}
+ if (name.startsWith("SimpleTemplateScript")) { // cf. groovy.text.SimpleTemplateEngine
+ throw new ClassNotFoundException("ignoring " + name);
+ }
+ synchronized (loaded) {
+ if (loaded.containsKey(name)) {
+ Class> c = loaded.get(name);
+ if (c != null) {
+ return c;
+ } else {
+ throw new ClassNotFoundException("cached miss for " + name);
+ }
+ }
+ }
if (FAST_LOOKUP) {
for (PluginWrapper p : activePlugins) {
try {
- Class c = clt.findLoadedClass(p.classLoader,name);
- if (c!=null) return c;
+ Class> c = ClassLoaderReflectionToolkit._findLoadedClass(p.classLoader, name);
+ if (c != null) {
+ synchronized (loaded) {
+ loaded.put(name, c);
+ }
+ return c;
+ }
// calling findClass twice appears to cause LinkageError: duplicate class def
- return clt.findClass(p.classLoader,name);
- } catch (InvocationTargetException e) {
+ c = ClassLoaderReflectionToolkit._findClass(p.classLoader, name);
+ synchronized (loaded) {
+ loaded.put(name, c);
+ }
+ return c;
+ } catch (ClassNotFoundException e) {
//not found. try next
}
}
@@ -981,6 +1125,9 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
}
}
}
+ synchronized (loaded) {
+ loaded.put(name, null);
+ }
// not found in any of the classloader. delegate.
throw new ClassNotFoundException(name);
}
@@ -988,15 +1135,11 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
@Override
protected URL findResource(String name) {
if (FAST_LOOKUP) {
- try {
for (PluginWrapper p : activePlugins) {
- URL url = clt.findResource(p.classLoader,name);
+ URL url = ClassLoaderReflectionToolkit._findResource(p.classLoader, name);
if(url!=null)
return url;
}
- } catch (InvocationTargetException e) {
- throw new Error(e);
- }
} else {
for (PluginWrapper p : activePlugins) {
URL url = p.classLoader.getResource(name);
@@ -1011,13 +1154,9 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
protected Enumeration findResources(String name) throws IOException {
List resources = new ArrayList();
if (FAST_LOOKUP) {
- try {
for (PluginWrapper p : activePlugins) {
- resources.addAll(Collections.list(clt.findResources(p.classLoader, name)));
+ resources.addAll(Collections.list(ClassLoaderReflectionToolkit._findResources(p.classLoader, name)));
}
- } catch (InvocationTargetException e) {
- throw new Error(e);
- }
} else {
for (PluginWrapper p : activePlugins) {
resources.addAll(Collections.list(p.classLoader.getResources(name)));
@@ -1106,7 +1245,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
* @return this monitor.
*/
public static final PluginUpdateMonitor getInstance() {
- return Jenkins.getInstance().getExtensionList(PluginUpdateMonitor.class).get(0);
+ return ExtensionList.lookup(PluginUpdateMonitor.class).get(0);
}
/**
diff --git a/core/src/main/java/hudson/PluginStrategy.java b/core/src/main/java/hudson/PluginStrategy.java
index 6024c3571f4cb382b5cebeedc2e3e4acce028095..2acb1f706555ac5fed9f4ed2d2c0bd2c4ffef26a 100644
--- a/core/src/main/java/hudson/PluginStrategy.java
+++ b/core/src/main/java/hudson/PluginStrategy.java
@@ -24,11 +24,10 @@
package hudson;
import hudson.model.Hudson;
-import jenkins.model.Jenkins;
-
import java.io.File;
import java.io.IOException;
import java.util.List;
+import javax.annotation.Nonnull;
/**
* Pluggability point for how to create {@link PluginWrapper}.
@@ -50,6 +49,13 @@ public interface PluginStrategy extends ExtensionPoint {
PluginWrapper createPluginWrapper(File archive)
throws IOException;
+ /**
+ * Finds the plugin name without actually unpacking anything {@link #createPluginWrapper} would.
+ * Needed by {@link PluginManager#dynamicLoad} to decide whether such a plugin is already installed.
+ * @return the {@link PluginWrapper#getShortName}
+ */
+ @Nonnull String getShortName(File archive) throws IOException;
+
/**
* Loads the plugin and starts it.
*
@@ -77,4 +83,14 @@ public interface PluginStrategy extends ExtensionPoint {
* @since 1.400
*/
List> findComponents(Class type, Hudson hudson);
+
+ /**
+ * Called when a plugin is installed, but there was already a plugin installed which optionally depended on that plugin.
+ * The class loader of the existing depending plugin should be updated
+ * to load classes from the newly installed plugin.
+ * @param depender plugin depending on dependee.
+ * @param dependee newly loaded plugin.
+ * @since 1.557
+ */
+ void updateDependency(PluginWrapper depender, PluginWrapper dependee);
}
diff --git a/core/src/main/java/hudson/PluginWrapper.java b/core/src/main/java/hudson/PluginWrapper.java
index dc8fd6659db1d6e2678b09a01cce4d36b5c1aa13..aa683e630f7af7ca0306d86ad3474c2269584f1b 100644
--- a/core/src/main/java/hudson/PluginWrapper.java
+++ b/core/src/main/java/hudson/PluginWrapper.java
@@ -44,7 +44,8 @@ import java.util.List;
import java.util.jar.Manifest;
import java.util.logging.Logger;
import static java.util.logging.Level.WARNING;
-
+import static org.apache.commons.io.FilenameUtils.getBaseName;
+import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.LogFactory;
import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.HttpResponses;
@@ -54,6 +55,8 @@ import org.kohsuke.stapler.interceptor.RequirePOST;
import java.util.Enumeration;
import java.util.jar.JarFile;
+import java.util.logging.Level;
+import javax.annotation.CheckForNull;
/**
* Represents a Jenkins plug-in and associated control information
@@ -199,7 +202,7 @@ public class PluginWrapper implements Comparable, ModelObject {
List dependencies, List optionalDependencies) {
this.parent = parent;
this.manifest = manifest;
- this.shortName = computeShortName(manifest, archive);
+ this.shortName = computeShortName(manifest, archive.getName());
this.baseResourceURL = baseResourceURL;
this.classLoader = classLoader;
this.disableFile = disableFile;
@@ -211,7 +214,7 @@ public class PluginWrapper implements Comparable, ModelObject {
}
public String getDisplayName() {
- return getLongName();
+ return StringUtils.removeStart(getLongName(), "Jenkins ");
}
public Api getApi() {
@@ -235,7 +238,7 @@ public class PluginWrapper implements Comparable, ModelObject {
return idx != null && idx.toString().contains(shortName) ? idx : null;
}
- private String computeShortName(Manifest manifest, File archive) {
+ static String computeShortName(Manifest manifest, String fileName) {
// use the name captured in the manifest, as often plugins
// depend on the specific short name in its URLs.
String n = manifest.getMainAttributes().getValue("Short-Name");
@@ -247,19 +250,7 @@ public class PluginWrapper implements Comparable, ModelObject {
// otherwise infer from the file name, since older plugins don't have
// this entry.
- return getBaseName(archive);
- }
-
-
- /**
- * Gets the "abc" portion from "abc.ext".
- */
- static String getBaseName(File archive) {
- String n = archive.getName();
- int idx = n.lastIndexOf('.');
- if(idx>=0)
- n = n.substring(0,idx);
- return n;
+ return getBaseName(fileName);
}
@Exported
@@ -283,8 +274,9 @@ public class PluginWrapper implements Comparable, ModelObject {
/**
* Gets the instance of {@link Plugin} contributed by this plugin.
*/
- public Plugin getPlugin() {
- return Jenkins.lookup(PluginInstanceStore.class).store.get(this);
+ public @CheckForNull Plugin getPlugin() {
+ PluginInstanceStore pis = Jenkins.lookup(PluginInstanceStore.class);
+ return pis != null ? pis.store.get(this) : null;
}
/**
@@ -338,6 +330,10 @@ public class PluginWrapper implements Comparable, ModelObject {
*/
@Exported
public String getVersion() {
+ return getVersionOf(manifest);
+ }
+
+ private String getVersionOf(Manifest manifest) {
String v = manifest.getMainAttributes().getValue("Plugin-Version");
if(v!=null) return v;
@@ -372,11 +368,16 @@ public class PluginWrapper implements Comparable, ModelObject {
* Terminates the plugin.
*/
public void stop() {
- LOGGER.info("Stopping "+shortName);
- try {
- getPlugin().stop();
- } catch(Throwable t) {
- LOGGER.log(WARNING, "Failed to shut down "+shortName, t);
+ Plugin plugin = getPlugin();
+ if (plugin != null) {
+ try {
+ LOGGER.log(Level.FINE, "Stopping {0}", shortName);
+ plugin.stop();
+ } catch (Throwable t) {
+ LOGGER.log(WARNING, "Failed to shut down " + shortName, t);
+ }
+ } else {
+ LOGGER.log(Level.FINE, "Could not find Plugin instance to stop for {0}", shortName);
}
// Work around a bug in commons-logging.
// See http://www.szegedi.org/articles/memleak.html
@@ -573,13 +574,29 @@ public class PluginWrapper implements Comparable, ModelObject {
backupPlugin.close();
}
} catch (IOException e) {
- LOGGER.log(WARNING, "Failed to get backup version ", e);
+ LOGGER.log(WARNING, "Failed to get backup version from " + backup, e);
return null;
}
} else {
return null;
}
}
+
+ /**
+ * Checks if this plugin is pinned and that's forcing us to use an older version than the bundled one.
+ */
+ public boolean isPinningForcingOldVersion() {
+ if (!isPinned()) return false;
+
+ Manifest bundled = Jenkins.getInstance().pluginManager.getBundledPluginManifest(getShortName());
+ if (bundled==null) return false;
+
+ VersionNumber you = new VersionNumber(getVersionOf(bundled));
+ VersionNumber me = getVersionNumber();
+
+ return me.isOlderThan(you);
+ }
+
//
//
// Action methods
@@ -623,4 +640,8 @@ public class PluginWrapper implements Comparable, ModelObject {
private static final Logger LOGGER = Logger.getLogger(PluginWrapper.class.getName());
+ /**
+ * Name of the plugin manifest file (to help find where we parse them.)
+ */
+ public static final String MANIFEST_FILENAME = "META-INF/MANIFEST.MF";
}
diff --git a/core/src/main/java/hudson/Proc.java b/core/src/main/java/hudson/Proc.java
index ca1f4a6767d26fedc768acb33f866f0bf0ece38b..5114cbd2c445a9e490efe2477f7d396932296ad3 100644
--- a/core/src/main/java/hudson/Proc.java
+++ b/core/src/main/java/hudson/Proc.java
@@ -28,7 +28,7 @@ import hudson.model.TaskListener;
import hudson.remoting.Channel;
import hudson.util.DaemonThreadFactory;
import hudson.util.ExceptionCatchingThreadFactory;
-import hudson.util.IOException2;
+import hudson.util.NamingThreadFactory;
import hudson.util.NullStream;
import hudson.util.StreamCopyThread;
import hudson.util.ProcessTree;
@@ -132,7 +132,7 @@ public abstract class Proc {
*/
public abstract OutputStream getStdin();
- private static final ExecutorService executor = Executors.newCachedThreadPool(new ExceptionCatchingThreadFactory(new DaemonThreadFactory()));
+ private static final ExecutorService executor = Executors.newCachedThreadPool(new ExceptionCatchingThreadFactory(new NamingThreadFactory(new DaemonThreadFactory(), "Proc.executor")));
/**
* Like {@link #join} but can be given a maximum time to wait.
@@ -454,7 +454,7 @@ public abstract class Proc {
} catch (ExecutionException e) {
if(e.getCause() instanceof IOException)
throw (IOException)e.getCause();
- throw new IOException2("Failed to join the process",e);
+ throw new IOException("Failed to join the process",e);
} catch (CancellationException x) {
return -1;
}
diff --git a/core/src/main/java/hudson/TcpSlaveAgentListener.java b/core/src/main/java/hudson/TcpSlaveAgentListener.java
index 2c5f4f916c62591b4ddbb6f34da8833e8029324b..059e2af96566a291e3a9df0db5632687736d9f8b 100644
--- a/core/src/main/java/hudson/TcpSlaveAgentListener.java
+++ b/core/src/main/java/hudson/TcpSlaveAgentListener.java
@@ -32,8 +32,9 @@ import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.BindException;
-import java.net.ServerSocket;
+import java.net.InetSocketAddress;
import java.net.Socket;
+import java.nio.channels.ServerSocketChannel;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -55,7 +56,7 @@ import java.util.logging.Logger;
*/
public final class TcpSlaveAgentListener extends Thread {
- private final ServerSocket serverSocket;
+ private final ServerSocketChannel serverSocket;
private volatile boolean shuttingDown;
public final int configuredPort;
@@ -67,13 +68,14 @@ public final class TcpSlaveAgentListener extends Thread {
public TcpSlaveAgentListener(int port) throws IOException {
super("TCP slave agent listener port="+port);
try {
- serverSocket = new ServerSocket(port);
+ serverSocket = ServerSocketChannel.open();
+ serverSocket.socket().bind(new InetSocketAddress(port));
} catch (BindException e) {
throw (BindException)new BindException("Failed to listen on port "+port+" because it's already in use.").initCause(e);
}
this.configuredPort = port;
- LOGGER.info("JNLP slave agent listener started on TCP port "+getPort());
+ LOGGER.log(Level.FINE, "JNLP slave agent listener started on TCP port {0}", getPort());
start();
}
@@ -82,7 +84,7 @@ public final class TcpSlaveAgentListener extends Thread {
* Gets the TCP port number in which we are listening.
*/
public int getPort() {
- return serverSocket.getLocalPort();
+ return serverSocket.socket().getLocalPort();
}
@Override
@@ -90,7 +92,7 @@ public final class TcpSlaveAgentListener extends Thread {
try {
// the loop eventually terminates when the socket is closed.
while (true) {
- Socket s = serverSocket.accept();
+ Socket s = serverSocket.accept().socket();
// this prevents a connection from silently terminated by the router in between or the other peer
// and that goes without unnoticed. However, the time out is often very long (for example 2 hours
diff --git a/core/src/main/java/hudson/UDPBroadcastFragment.java b/core/src/main/java/hudson/UDPBroadcastFragment.java
index 12ee1910705a589144235a72ba207f3d4d9df268..9e7039f739566cba48c4ad53001d67447cb75730 100644
--- a/core/src/main/java/hudson/UDPBroadcastFragment.java
+++ b/core/src/main/java/hudson/UDPBroadcastFragment.java
@@ -54,6 +54,6 @@ public abstract class UDPBroadcastFragment implements ExtensionPoint {
* Returns all the registered {@link UDPBroadcastFragment}s.
*/
public static ExtensionList all() {
- return Jenkins.getInstance().getExtensionList(UDPBroadcastFragment.class);
+ return ExtensionList.lookup(UDPBroadcastFragment.class);
}
}
diff --git a/core/src/main/java/hudson/URLConnectionDecorator.java b/core/src/main/java/hudson/URLConnectionDecorator.java
index 04ec90657cfada7bf49b39c25c650e325f72f807..d6aad07b7081e76a3a2ab81b317ff1a22b2489f0 100644
--- a/core/src/main/java/hudson/URLConnectionDecorator.java
+++ b/core/src/main/java/hudson/URLConnectionDecorator.java
@@ -46,6 +46,6 @@ public abstract class URLConnectionDecorator implements ExtensionPoint {
* Returns all the registered {@link URLConnectionDecorator}s.
*/
public static ExtensionList all() {
- return Jenkins.getInstance().getExtensionList(URLConnectionDecorator.class);
+ return ExtensionList.lookup(URLConnectionDecorator.class);
}
}
diff --git a/core/src/main/java/hudson/Util.java b/core/src/main/java/hudson/Util.java
index ad91672dc65a267e5a04bc0d3f4aee52d0642d90..7183937d2d9f0f91c84afcc6482d4a34f662b791 100644
--- a/core/src/main/java/hudson/Util.java
+++ b/core/src/main/java/hudson/Util.java
@@ -30,7 +30,6 @@ import edu.umd.cs.findbugs.annotations.SuppressWarnings;
import hudson.Proc.LocalProc;
import hudson.model.TaskListener;
import hudson.os.PosixAPI;
-import hudson.util.IOException2;
import hudson.util.QuotedStringTokenizer;
import hudson.util.VariableResolver;
import hudson.util.jna.WinIOException;
@@ -43,7 +42,6 @@ import org.apache.tools.ant.taskdefs.Copy;
import org.apache.tools.ant.types.FileSet;
import jnr.posix.FileStat;
import jnr.posix.POSIX;
-import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
@@ -64,6 +62,7 @@ import java.security.NoSuchAlgorithmException;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.*;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -74,6 +73,9 @@ import hudson.util.jna.Kernel32Utils;
import static hudson.util.jna.GNUCLibrary.LIBC;
import java.security.DigestInputStream;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
import org.apache.commons.codec.digest.DigestUtils;
/**
@@ -95,7 +97,8 @@ public class Util {
* Creates a filtered sublist.
* @since 1.176
*/
- public static List filter( Iterable> base, Class type ) {
+ @Nonnull
+ public static List filter( @Nonnull Iterable> base, @Nonnull Class type ) {
List r = new ArrayList();
for (Object i : base) {
if(type.isInstance(i))
@@ -107,7 +110,8 @@ public class Util {
/**
* Creates a filtered sublist.
*/
- public static List filter( List> base, Class type ) {
+ @Nonnull
+ public static