package org.jenkinsci.plugins.p4.asset; import hudson.EnvVars; import hudson.Extension; import hudson.FilePath; import hudson.Launcher; import hudson.model.BuildListener; import hudson.model.Result; import hudson.model.AbstractBuild; import hudson.model.AbstractProject; import hudson.security.ACL; import hudson.tasks.BuildStepDescriptor; import hudson.tasks.BuildStepMonitor; import hudson.tasks.Notifier; import hudson.tasks.Publisher; import hudson.util.ListBoxModel; import java.io.IOException; import java.util.List; import jenkins.model.Jenkins; import org.acegisecurity.Authentication; import org.jenkinsci.plugins.p4.credentials.P4StandardCredentials; import org.jenkinsci.plugins.p4.publish.Publish; import org.jenkinsci.plugins.p4.tasks.PublishTask; import org.jenkinsci.plugins.p4.workspace.Workspace; import org.kohsuke.stapler.DataBoundConstructor; import com.cloudbees.plugins.credentials.CredentialsProvider; import com.cloudbees.plugins.credentials.domains.DomainRequirement; public class AssetNotifier extends Notifier { private final String credential; private final Workspace workspace; private final Publish publish; public String getCredential() { return credential; } public Workspace getWorkspace() { return workspace; } public Publish getPublish() { return publish; } @DataBoundConstructor public AssetNotifier(String credential, Workspace workspace, Publish publish) { this.credential = credential; this.workspace = workspace; this.publish = publish; } public BuildStepMonitor getRequiredMonitorService() { return BuildStepMonitor.NONE; } @Override public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { // return early if publish not required if (publish.isOnlyOnSuccess() && build.getResult() != Result.SUCCESS) { return true; } Workspace ws = (Workspace) workspace.clone(); try { EnvVars envVars = build.getEnvironment(listener); ws.setExpand(envVars); ws.setRootPath(build.getWorkspace().getRemote()); String desc = publish.getDescription(); desc = ws.getExpand().format(desc, false); publish.setExpandedDesc(desc); } catch (IOException e) { e.printStackTrace(); } // Create task PublishTask task = new PublishTask(publish); task.setListener(listener); task.setCredential(credential); task.setWorkspace(ws); FilePath buildWorkspace = build.getWorkspace(); boolean success = buildWorkspace.act(task); return success; } public static DescriptorImpl descriptor() { return Jenkins.getInstance().getDescriptorByType( AssetNotifier.DescriptorImpl.class); } @Extension public static final class DescriptorImpl extends BuildStepDescriptor<Publisher> { @Override public boolean isApplicable(Class<? extends AbstractProject> jobType) { return true; } @Override public String getDisplayName() { return "Perforce: Publish assets"; } /** * Credentials list, a Jelly config method for a build job. * * @return A list of Perforce credential items to populate the jelly * Select list. */ public ListBoxModel doFillCredentialItems() { ListBoxModel list = new ListBoxModel(); Class<P4StandardCredentials> type = P4StandardCredentials.class; Jenkins scope = Jenkins.getInstance(); Authentication acl = ACL.SYSTEM; DomainRequirement domain = new DomainRequirement(); List<P4StandardCredentials> credentials; credentials = CredentialsProvider.lookupCredentials(type, scope, acl, domain); if (credentials.isEmpty()) { list.add("Select credential...", null); } for (P4StandardCredentials c : credentials) { StringBuffer sb = new StringBuffer(); sb.append(c.getDescription()); sb.append(" ("); sb.append(c.getUsername()); sb.append(":"); sb.append(c.getP4port()); sb.append(")"); list.add(sb.toString(), c.getId()); } return list; } } }
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#12 | 16510 | Paul Allen | Move AssetNotifier* to Publish and rename. | ||
#11 | 15656 | Paul Allen |
Updated credentials to extend BaseStandardCredentials. Allows users to set the ID at creation. JENKINS-29702 |
||
#10 | 15394 | Paul Allen |
Workflow-DSL functionality. Tested workflow DSL against 1.596.1 older functionality tested against 1.580.1 @sven_erik_knop |
||
#9 | 14035 | Paul Allen |
Publish on Success option. Added a checkbox to the Publish step to only shelve/submit change if the build succeeded. |
||
#8 | 13681 | Paul Allen |
Abstracted Expand class from Workspace. Added support for Label variable expansion in the name and description. |
||
#7 | 13603 | Paul Allen | Improved Error for Publish step when connection is down. | ||
#6 | 11334 | Paul Allen |
Remote slave support for Publish Perforce Publish commands need to be executed from the remote slave. - Includes refactoring into task package |
||
#5 | 11258 | Paul Allen |
Minor fix for Publish Asset Set client root for new workspaces. Flush client to populate have list (sync -k) |
||
#4 | 11249 | Paul Allen | Fix: Use cloned workspace not config. | ||
#3 | 11246 | Paul Allen | Create/Update client when using publish assets. | ||
#2 | 11236 | Paul Allen | Merge minor GitHub edit | ||
#1 | 11231 | Paul Allen |
Publish assets to Perforce. New feature to allow Jenkins to shelve or submit the build result to Perforce. Configured as a Post Build Step, the Perforce credential and workspace are required as the asset could be published to a different Perforce instance. |