package org.jenkinsci.plugins.p4.trigger; import edu.umd.cs.findbugs.annotations.CheckForNull; import hudson.Extension; import hudson.model.Job; import hudson.model.UnprotectedRootAction; import hudson.triggers.Trigger; import jenkins.model.Jenkins; import jenkins.model.ParameterizedJobMixIn; import net.sf.json.JSONObject; import org.apache.commons.io.IOUtils; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; import javax.servlet.ServletException; import java.io.IOException; import java.net.URLDecoder; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.logging.Logger; @Extension public class P4Hook implements UnprotectedRootAction { ExecutorService executorService = Executors.newSingleThreadExecutor(); public static final String URLNAME = "p4"; @Override public String getIconFileName() { return "/plugin/p4/icons/helix-24px.png"; } @Override public String getDisplayName() { return "P4 Trigger"; } @Override public String getUrlName() { return URLNAME; } public void doChange(StaplerRequest req) throws IOException { String body = IOUtils.toString(req.getInputStream(), Charset.forName("UTF-8")); String contentType = req.getContentType(); if (contentType != null && contentType.startsWith("application/json")) { body = URLDecoder.decode(body, "UTF-8"); } if (body.startsWith("payload=")) { body = body.substring(8); JSONObject payload = JSONObject.fromObject(body); final String port = payload.getString("p4port"); //final String change = payload.getString("change"); final List<Job> jobs = getJobs(); LOGGER.info("Received trigger event for: " + port); if (port == null) { LOGGER.warning("p4port must be specified"); return; } // Use an executor to prevent blocking the trigger during polling executorService.submit(new Runnable() { @Override public void run() { try { probeJobs(port, jobs); } catch (IOException e) { LOGGER.severe("Error on Polling Thread."); e.printStackTrace(); } } }); } } public void doChangeSubmit(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { JSONObject formData = req.getSubmittedForm(); if (!formData.isEmpty()) { String port = req.getParameter("_.p4port"); //String change = req.getParameter("_.change"); List<Job> jobs = getJobs(); LOGGER.info("Manual trigger event: "); if (port != null) { probeJobs(port, jobs); } else { LOGGER.warning("p4port must be specified"); } // send the user back. rsp.sendRedirect("../"); } } private void probeJobs(@CheckForNull String port, List<Job> jobs) throws IOException { for (Job<?, ?> job : jobs) { if(!job.isBuildable()) { continue; } LOGGER.fine("P4: trying: " + job.getName()); P4Trigger trigger = null; if (job instanceof ParameterizedJobMixIn.ParameterizedJob) { ParameterizedJobMixIn.ParameterizedJob pJob = (ParameterizedJobMixIn.ParameterizedJob) job; for (Trigger<?> t : pJob.getTriggers().values()) { if (t instanceof P4Trigger) { trigger = (P4Trigger) t; break; } } } if (trigger != null) { LOGGER.info("P4: probing: " + job.getName()); trigger.poke(job, port); } else { LOGGER.fine("P4: trigger not set: " + job.getName()); } } } private List<Job> getJobs() { Jenkins j = Jenkins.getInstance(); if (j == null) { LOGGER.warning("Jenkins instance is null."); return new ArrayList<>(); } return j.getAllItems(Job.class); } final static Logger LOGGER = Logger.getLogger(P4Hook.class.getName()); }
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#4 | 24112 | Paul Allen | Merging using p4-jenkins_main>dev | ||
#3 | 23862 | Paul Allen | Merging using p4-jenkins_main>dev | ||
#2 | 23685 | Paul Allen | Copy main -> dev | ||
#1 | 20641 | Paul Allen | Copy main -> dev (jenkinsci/p4-plugin) | ||
//guest/perforce_software/p4jenkins/main/src/main/java/org/jenkinsci/plugins/p4/trigger/P4Hook.java | |||||
#4 | 19641 | Paul Allen |
Merge pull request #26 from Dohbedoh/hotfix/JENKINS-25249 [JENKINS-25249]: Fixed Null Pointer dereference |
||
#3 | 19593 | Paul Allen | More minor fixes to satisfy FindBugs Analysis. | ||
#2 | 19294 | Paul Allen |
Schedule build on trigger for subscribed Jobs. JENKINS-33858 |
||
#1 | 15403 | Paul Allen |
Perforce triggered polling BETA. Perforce triggers on a change-submit and sends a POST to the endpoint http://${JENKINS}/p4/change with the data: {"change":"12345","p4port":"localhost:1666"} Note: ‘change’ is not used (yet), but ‘p4port’ MUST match the credential in the Jenkins Job. JENKINS-25249 |