package org.jenkinsci.plugins.p4; import hudson.AbortException; import hudson.FilePath.FileCallable; import hudson.model.TaskListener; import hudson.remoting.VirtualChannel; import java.io.File; import java.io.IOException; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; import org.jenkinsci.plugins.p4.client.ClientHelper; import org.jenkinsci.plugins.p4.client.ConnectionHelper; import org.jenkinsci.plugins.p4.credentials.P4StandardCredentials; import org.jenkinsci.plugins.p4.populate.Populate; import org.jenkinsci.plugins.p4.workspace.Workspace; public class CheckoutTask implements FileCallable<Boolean>, Serializable { private static final long serialVersionUID = 1L; private static Logger logger = Logger.getLogger(CheckoutTask.class .getName()); private final P4StandardCredentials credential; private final TaskListener listener; private final String client; private CheckoutStatus status; private int head; private Object buildChange; private int review; private Populate populate; /** * Constructor * * @param config * - Server connection details * @param auth * - Server login details */ public CheckoutTask(String credentialID, Workspace config, TaskListener listener) { this.credential = ConnectionHelper.findCredential(credentialID); this.listener = listener; this.client = config.getFullName(); } public void setBuildOpts(Workspace workspace) throws AbortException { ClientHelper p4 = new ClientHelper(credential, listener, client); try { // setup the client workspace to use for the build. if (!p4.setClient(workspace)) { String err = "Undefined workspace: " + workspace.getFullName(); logger.severe(err); listener.error(err); throw new AbortException(err); } // fetch and calculate change to sync to or review to unshelve. status = getStatus(workspace); head = p4.getClientHead(); review = getReview(workspace); buildChange = getBuildChange(workspace); } catch (Exception e) { String err = "Unable to setup workspace: " + e; logger.severe(err); listener.error(err); throw new AbortException(err); } finally { p4.disconnect(); } } public void setPopulateOpts(Populate populate) { this.populate = populate; } /** * Invoke sync on build node (master or remote node). * * @return true if updated, false if no change. */ public Boolean invoke(File workspace, VirtualChannel channel) throws IOException { ClientHelper p4 = new ClientHelper(credential, listener, client); try { // test server connection if (!p4.isConnected()) { p4.log("P4: Server connection error:" + credential.getP4port()); return false; } p4.log("Connected to server: " + credential.getP4port()); // test client connection if (p4.getClient() == null) { p4.log("P4: Client unknown: " + client); return false; } p4.log("Connected to client: " + client); // Tidy the workspace before sync/build p4.tidyWorkspace(populate); // Sync workspace to label, head or specified change p4.syncFiles(buildChange, populate); // Unshelve review if specified if (status == CheckoutStatus.SHELVED) { p4.unshelveFiles(review); } } catch (Exception e) { String msg = "Unable to update workspace: " + e; logger.warning(msg); throw new AbortException(msg); } finally { p4.disconnect(); } return true; } /** * Get the build status for the parameter map. * * @param map * @return */ private CheckoutStatus getStatus(Workspace workspace) { CheckoutStatus status = CheckoutStatus.HEAD; String value = workspace.get("status"); if (value != null && !value.isEmpty()) { status = CheckoutStatus.parse(value); } return status; } /** * Get the sync point from the parameter map. Returns the head if no change * found in the map. * * @param map * @return */ private Object getBuildChange(Workspace workspace) { // Use head as the default Object build = this.head; // if change is specified then update String change = workspace.get("change"); if (change != null && !change.isEmpty()) { try { build = Integer.parseInt(change); } catch (NumberFormatException e) { } } // if label is specified then update String label = workspace.get("label"); if (label != null && !label.isEmpty()) { build = label; } return build; } /** * Get the unshelve point from the parameter map. * * @param map * @return */ private int getReview(Workspace workspace) { int review = 0; String value = workspace.get("review"); if (value != null && !value.isEmpty()) { try { review = Integer.parseInt(value); } catch (NumberFormatException e) { } } return review; } public List<Object> getChanges(Object last) { List<Object> changes = new ArrayList<Object>(); // Add changes to this build. ClientHelper p4 = new ClientHelper(credential, listener, client); try { changes = p4.listChanges(last, buildChange); } catch (Exception e) { String err = "Unable to get changes: " + e; logger.severe(err); listener.getLogger().println(err); e.printStackTrace(); } finally { p4.disconnect(); } // Include shelf if a review if (status == CheckoutStatus.SHELVED) { changes.add(review); } return changes; } public CheckoutStatus getStatus() { return status; } public Object getBuildChange() { if (status == CheckoutStatus.SHELVED) { return review; } return buildChange; } }
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#10 | 16574 | dawn_foundry |
Call to wschanges needed to set the os correctly (to the os of the build slave that the build was going to run on). Note: This was required because the wschanges command runs on master Jenkins, rather than directly on the build slave. |
||
#9 | 15122 | dawn_foundry |
Changelog generation for CBD projects will now use our new "wschanges" command. Output from the command is xml which is written directly to the changelog file. The xml format has remained the same for the moment, but will need to be altered (and the parsing updated) to allow us to display more detailed data about added/removed modules etc. |
||
#8 | 11462 | dawn_foundry |
If a call to wscreate fails, the build will now no longer continue, and will be marked as failed. Also improved error logging around this area and other execMapCmd calls. |
||
#7 | 11073 | dawn_foundry | Adding in functionality for creating and archiving a "snapshot CBD" file with each build (Foundry-specific functionality). | ||
#6 | 10968 | dawn_foundry | Add a space in a message. | ||
#5 | 10746 | dawn_foundry |
Now storing data about the head change value for the CBD xml file. This is used to ensure that the "changes" broker script accurately knows when the build changed to use a newer version of the CBD xml file. |
||
#4 | 10708 | dawn_foundry | Adding the ability to deal with The Foundry CBD files and the use of our "wscreate" command to create workspaces for the build. | ||
#3 | 10622 | dawn_foundry | Ensure that all configurations of a matrix build run using the same changelist number. | ||
#2 | 10604 | dawn_foundry | Integrating over all the latest changes from Paul. | ||
#1 | 10123 | dawn_foundry | Branching using dawn_foundry_p4jenkins | ||
//guest/perforce_software/p4jenkins/main/src/main/java/org/jenkinsci/plugins/p4/CheckoutTask.java | |||||
#8 | 9987 | Paul Allen | Better logging for slave connections. | ||
#7 | 9980 | Paul Allen |
Changed error reporting to use AbortException. - Use direct access of scm attributes, not via build.getProject().getScm() - Improved logging around labels/changes. |
||
#6 | 9851 | Paul Allen | Merging using p4-jenkins | ||
#5 | 9803 | Paul Allen | Merging using p4-jenkins | ||
#4 | 9787 | Paul Allen | Merging using p4-jenkins | ||
#3 | 9769 | Paul Allen | Copying using p4-jenkins | ||
#2 | 9738 | Paul Allen | Merging using p4-jenkins | ||
#1 | 9690 | Paul Allen |
[Branching using p4-jenkins] Release 1.0.1 |
||
//guest/paul_allen/dev/p4-jenkins/p4-client/src/main/java/org/jenkinsci/plugins/p4/CheckoutTask.java | |||||
#1 | 9672 | Paul Allen | Refactor name from 'p4_client' to 'p4'. | ||
//guest/paul_allen/dev/p4-jenkins/p4-client/src/main/java/org/jenkinsci/plugins/p4_client/CheckoutTask.java | |||||
#14 | 9371 | Paul Allen | Fix issue when label could be empty (called by Swarm or Review URL). | ||
#13 | 9115 | Paul Allen |
Initial implementation of workspace Cleanup and Sync options. - Includes 3 modes: Automatic Clean/Sync, Force Clean/Sync, Sync Only Automatic Clean/Sync Uses reconcile to clean up workspace and sync changes. Force Clean/Sync Force sync of all files (does not remove files yet...) Sync Only Normal sync with no cleanup TODO: - remove of files in Force Clean/Sync mode - Inline help - Update docs - Add unit/functional tests |
||
#12 | 9069 | Paul Allen |
Adding initial support for tagging Jenkins builds as Perforce Automatic Labels. Only implements TagAction (manual labels); TagNotifier and test cases TODO. |
||
#11 | 9055 | Paul Allen |
Label support. Build at a label using the pram 'label'. This includes adding the label to the ChangeEntry, building the change reports and Browser links to Swarm. (TPI-102) |
||
#10 | 8969 | Paul Allen |
Adds all contributing change-lists for the build to the change log (using p4 cstat). - Includes exception logging for server connection to the Jenkins console. |
||
#9 | 8940 | Paul Allen |
Major refactor for the ConnectionHelper class to simplify serialisation. Fixed remote Jenkins JNLP slave connection issue. ClientHelper now extends ConnectionHelper and takes on all methods that require a client workspace. P4StandardCredentials is sent to the remote node instead of Credentials ID due to an issue accessing the Credentials store over a remote connection. For simplicity Client ID (workspace name) is serialised instead of the Workspace object. |
||
#8 | 8926 | Paul Allen |
Bug fix when unshelving files with the Template workspace option. p4-java was unable to switch the worksapce view (without the -f flag) if there were files open. - Improved logging (as this error was hidden) - Added test case for this condition. |
||
#7 | 8924 | Paul Allen | Sync workspace to last change in workspace (not depot). | ||
#6 | 8915 | Paul Allen |
Support for ChangeLog and RepoBrowser. - Added RepoBrowser for Swarm (porting the others should be easy) - ChangeLog XML file now only stores the changelist number all other information is fetched from Perforce |
||
#5 | 8765 | Paul Allen | Update status to include SUBMITTED and sync to change. | ||
#4 | 8762 | Paul Allen |
Console Ouptut logging for SCM build steps. - Removed SLF4J and used old style logger (matching Jenkins) - Set Client Host filed to null, Jenkins sometimes gives an IP address. - Test p4java setps in SCM tasks for success(true/false) |
||
#3 | 8725 | Paul Allen |
Minor fixes: - Improved tidy workspace method - Fix for template clients - After an unshelf revert -k files - Minor bug in CheckoutTask - Clear callback urls to prevet reuse |
||
#2 | 8715 | Paul Allen |
#review-8716 [Basic Swarm-Jenkins cycle DONE] Support Job's build notification and then POST's the pass/fail call-back URLs to Swarm. |
||
#1 | 8694 | Paul Allen | Added support for unshelve and revert -w behaviour for builds. |