From f4009b54981c5f724450b586e0d25b9c555d4566 Mon Sep 17 00:00:00 2001 From: Achim Derigs Date: Mon, 22 Jun 2015 16:47:34 +0200 Subject: [PATCH 01/22] specifies an ignorable pusher --- pom.xml | 2 +- .../cloudbees/jenkins/GitHubPushTrigger.java | 28 +++++-- .../com/cloudbees/jenkins/GitHubTrigger.java | 11 +++ .../com/cloudbees/jenkins/GitHubWebHook.java | 44 +++++++--- .../jenkins/GitHubPushTrigger/config.jelly | 5 ++ .../GitHubPushTrigger/config.properties | 1 + .../GitHubPushTrigger/config_de.properties | 1 + .../help-ignorablePusher.html | 3 + .../help-ignorablePusher_de.html | 3 + .../jenkins/GitHubPushTriggerTestCase.java | 84 +++++++++++++++++++ 10 files changed, 165 insertions(+), 17 deletions(-) create mode 100644 src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config.jelly create mode 100644 src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config.properties create mode 100644 src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config_de.properties create mode 100644 src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher.html create mode 100644 src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher_de.html create mode 100644 src/test/java/com/cloudbees/jenkins/GitHubPushTriggerTestCase.java diff --git a/pom.xml b/pom.xml index a55d659b5..92630c1bf 100644 --- a/pom.xml +++ b/pom.xml @@ -47,7 +47,7 @@ org.jmock jmock-junit4 - 2.5.1 + 2.8.1 test diff --git a/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java b/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java index 32a5c7811..b24b588a7 100644 --- a/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java +++ b/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java @@ -4,10 +4,10 @@ import hudson.Util; import hudson.console.AnnotatedLargeText; import hudson.model.Action; -import hudson.model.Hudson; -import hudson.model.Hudson.MasterComputer; import hudson.model.Item; import hudson.model.AbstractProject; +import hudson.model.Hudson; +import hudson.model.Hudson.MasterComputer; import hudson.model.Project; import hudson.triggers.Trigger; import hudson.triggers.TriggerDescriptor; @@ -33,6 +33,8 @@ import java.util.logging.Level; import java.util.logging.Logger; +import javax.inject.Inject; + import jenkins.model.Jenkins; import net.sf.json.JSONObject; @@ -45,16 +47,32 @@ import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.StaplerRequest; -import javax.inject.Inject; - /** * Triggers a build when we receive a GitHub post-commit webhook. * * @author Kohsuke Kawaguchi */ public class GitHubPushTrigger extends Trigger> implements GitHubTrigger { + String pushBy; + private final String ignorablePusher; + @DataBoundConstructor + public GitHubPushTrigger(final String ignorablePusher) { + this.ignorablePusher = ignorablePusher; + } + public GitHubPushTrigger() { + this(""); + } + + @Override + public String pushBy() { + return pushBy; + } + + @Override + public String getIgnorablePusher() { + return ignorablePusher; } /** @@ -69,7 +87,7 @@ public void onPost() { * Called when a POST is made. */ public void onPost(String triggeredByUser) { - final String pushBy = triggeredByUser; + pushBy = triggeredByUser; getDescriptor().queue.execute(new Runnable() { private boolean runPolling() { try { diff --git a/src/main/java/com/cloudbees/jenkins/GitHubTrigger.java b/src/main/java/com/cloudbees/jenkins/GitHubTrigger.java index cb225313a..dd0550877 100644 --- a/src/main/java/com/cloudbees/jenkins/GitHubTrigger.java +++ b/src/main/java/com/cloudbees/jenkins/GitHubTrigger.java @@ -50,4 +50,15 @@ public void parseAssociatedNames(AbstractProject job, Collection> triggerClass) { JSONObject o = JSONObject.fromObject(payload); String repoUrl = o.getJSONObject("repository").getString("url"); // something like 'https://github.com/kohsuke/foo' - String pusherName = o.getJSONObject("pusher").getString("name"); + final JSONObject pusher = o.getJSONObject("pusher"); + final String pusherName = pusher.getString("name"); + final String pusherEmail = pusher.getString("email"); LOGGER.info("Received POST for {}", repoUrl); LOGGER.debug("Full details of the POST was {}", o.toString()); @@ -207,6 +213,22 @@ public void processGitHubPayload(String payload, Class> tri for (AbstractProject job : Jenkins.getInstance().getAllItems(AbstractProject.class)) { GitHubTrigger trigger = (GitHubTrigger) job.getTrigger(triggerClass); if (trigger != null) { + final String regex = trigger.getIgnorablePusher(); + + if (pusherName != null && !pusherName.isEmpty() + && pusherName.matches(regex)) { + + LOGGER.info("Ignoring pusher [{}] ...", pusherName); + continue; + } + + if (pusherEmail != null && !pusherEmail.isEmpty() + && pusherEmail.matches(regex)) { + + LOGGER.info("Ignoring pusher [{}] ...", pusherEmail); + continue; + } + LOGGER.debug("Considering to poke {}", job.getFullDisplayName()); if (GitHubRepositoryNameContributor.parseAssociatedNames(job).contains(changedRepository)) { LOGGER.info("Poked {}", job.getFullDisplayName()); diff --git a/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config.jelly b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config.jelly new file mode 100644 index 000000000..3c058652b --- /dev/null +++ b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config.jelly @@ -0,0 +1,5 @@ + + + + + diff --git a/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config.properties b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config.properties new file mode 100644 index 000000000..de7edbd49 --- /dev/null +++ b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config.properties @@ -0,0 +1 @@ +github.ignorablePusher=Ignorable pusher diff --git a/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config_de.properties b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config_de.properties new file mode 100644 index 000000000..fc398c9dc --- /dev/null +++ b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config_de.properties @@ -0,0 +1 @@ +github.ignorablePusher=Ignorierbarer Pusher diff --git a/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher.html b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher.html new file mode 100644 index 000000000..8fb81e000 --- /dev/null +++ b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher.html @@ -0,0 +1,3 @@ +
+ Defines a regular expression to which the name or email of an ignorable pusher is to be matched. +
diff --git a/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher_de.html b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher_de.html new file mode 100644 index 000000000..9117be7e9 --- /dev/null +++ b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher_de.html @@ -0,0 +1,3 @@ +
+ Definiert einen regulären Ausdruck, der zu dem Namen oder die E-Mail eines ignorierbaren Pushers passt. +
diff --git a/src/test/java/com/cloudbees/jenkins/GitHubPushTriggerTestCase.java b/src/test/java/com/cloudbees/jenkins/GitHubPushTriggerTestCase.java new file mode 100644 index 000000000..d3e45e7f4 --- /dev/null +++ b/src/test/java/com/cloudbees/jenkins/GitHubPushTriggerTestCase.java @@ -0,0 +1,84 @@ +package com.cloudbees.jenkins; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import hudson.model.FreeStyleProject; +import hudson.plugins.git.GitSCM; +import hudson.scm.SCM; + +import java.io.IOException; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; + +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; + +import com.cloudbees.jenkins.GitHubPushTrigger.DescriptorImpl; + +/** + * @author Achim Derigs + */ +public final class GitHubPushTriggerTestCase { + + @Rule + public final JenkinsRule j = new JenkinsRule(); + + private static void triggerWebHook(final String repositoryUrl, final String pusherName) + throws IOException { + + final DescriptorImpl descriptor = DescriptorImpl.get(); + final URL url = descriptor.getHookUrl(); + final HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("POST"); + connection.setDoOutput(true); + connection.connect(); + + final String payload = "payload={\"repository\":{\"url\":\"" + repositoryUrl + + "\"},\"pusher\":{\"name\":\"" + pusherName + "\",\"email\":\"\"}}"; + + final OutputStream stream = connection.getOutputStream(); + + try { + stream.write(payload.getBytes(StandardCharsets.UTF_8)); + } finally { + stream.close(); + } + + assertEquals(HttpURLConnection.HTTP_OK, connection.getResponseCode()); + } + + @Test + public void trigger() throws IOException { + final String repositoryUrl = "https://github.com/OpenDataSpace/parent"; + final SCM scm = new GitSCM(repositoryUrl); + final FreeStyleProject project = j.createFreeStyleProject(); + project.setScm(scm); + + final String expected = System.getProperty("user.name"); + final GitHubPushTrigger trigger = new GitHubPushTrigger(); + project.addTrigger(trigger); + triggerWebHook(repositoryUrl, expected); + + final String actual = trigger.pushBy(); + assertEquals(expected, actual); + } + + @Test + public void ignorePusher() throws IOException { + final String repositoryUrl = "https://github.com/OpenDataSpace/parent"; + final SCM scm = new GitSCM(repositoryUrl); + final FreeStyleProject project = j.createFreeStyleProject(); + project.setScm(scm); + + final String pusherName = System.getProperty("user.name"); + final GitHubPushTrigger trigger = new GitHubPushTrigger(pusherName); + project.addTrigger(trigger); + triggerWebHook(repositoryUrl, pusherName); + + final Object object = trigger.pushBy(); + assertNull(object); + } +} From 891455a8f87f161bac2ce89b6b39457dbd7f2c2f Mon Sep 17 00:00:00 2001 From: Achim Derigs Date: Mon, 22 Jun 2015 16:47:34 +0200 Subject: [PATCH 02/22] specifies an ignorable pusher --- pom.xml | 2 +- .../cloudbees/jenkins/GitHubPushTrigger.java | 28 +++++-- .../com/cloudbees/jenkins/GitHubTrigger.java | 11 +++ .../com/cloudbees/jenkins/GitHubWebHook.java | 55 ++++++++---- .../jenkins/GitHubPushTrigger/config.jelly | 5 ++ .../GitHubPushTrigger/config.properties | 1 + .../GitHubPushTrigger/config_de.properties | 1 + .../help-ignorablePusher.html | 3 + .../help-ignorablePusher_de.html | 3 + .../jenkins/GitHubPushTriggerTestCase.java | 84 +++++++++++++++++++ 10 files changed, 169 insertions(+), 24 deletions(-) create mode 100644 src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config.jelly create mode 100644 src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config.properties create mode 100644 src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config_de.properties create mode 100644 src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher.html create mode 100644 src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher_de.html create mode 100644 src/test/java/com/cloudbees/jenkins/GitHubPushTriggerTestCase.java diff --git a/pom.xml b/pom.xml index 979f9d715..381924450 100644 --- a/pom.xml +++ b/pom.xml @@ -46,7 +46,7 @@ org.jmock jmock-junit4 - 2.5.1 + 2.8.1 test diff --git a/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java b/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java index 417d65d4d..e28642b02 100644 --- a/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java +++ b/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java @@ -4,10 +4,10 @@ import hudson.Util; import hudson.console.AnnotatedLargeText; import hudson.model.Action; -import hudson.model.Hudson; -import hudson.model.Hudson.MasterComputer; import hudson.model.Item; import hudson.model.AbstractProject; +import hudson.model.Hudson; +import hudson.model.Hudson.MasterComputer; import hudson.model.Project; import hudson.triggers.Trigger; import hudson.triggers.TriggerDescriptor; @@ -33,6 +33,8 @@ import java.util.logging.Level; import java.util.logging.Logger; +import javax.inject.Inject; + import jenkins.model.Jenkins; import net.sf.json.JSONObject; @@ -45,16 +47,30 @@ import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.StaplerRequest; -import javax.inject.Inject; - /** * Triggers a build when we receive a GitHub post-commit webhook. * * @author Kohsuke Kawaguchi */ -public class GitHubPushTrigger extends Trigger> implements GitHubTrigger { +public class GitHubPushTrigger extends Trigger> implements GitHubTrigger { + String pushBy; + private final String ignorablePusher; + @DataBoundConstructor + public GitHubPushTrigger(final String ignorablePusher) { + this.ignorablePusher = ignorablePusher; + } + public GitHubPushTrigger() { + this(""); + } + + public String pushBy() { + return pushBy; + } + + public String getIgnorablePusher() { + return ignorablePusher; } /** @@ -69,7 +85,7 @@ public void onPost() { * Called when a POST is made. */ public void onPost(String triggeredByUser) { - final String pushBy = triggeredByUser; + pushBy = triggeredByUser; getDescriptor().queue.execute(new Runnable() { private boolean runPolling() { try { diff --git a/src/main/java/com/cloudbees/jenkins/GitHubTrigger.java b/src/main/java/com/cloudbees/jenkins/GitHubTrigger.java index cb225313a..dd0550877 100644 --- a/src/main/java/com/cloudbees/jenkins/GitHubTrigger.java +++ b/src/main/java/com/cloudbees/jenkins/GitHubTrigger.java @@ -50,4 +50,15 @@ public void parseAssociatedNames(AbstractProject job, Collection> triggerClass) { JSONObject o = JSONObject.fromObject(payload); String repoUrl = o.getJSONObject("repository").getString("url"); // something like 'https://github.com/kohsuke/foo' - String pusherName = o.getJSONObject("pusher").getString("name"); + final JSONObject pusher = o.getJSONObject("pusher"); + final String pusherName = pusher.getString("name"); + final String pusherEmail = pusher.getString("email"); LOGGER.info("Received POST for "+repoUrl); LOGGER.fine("Full details of the POST was "+o.toString()); @@ -207,7 +211,24 @@ public void processGitHubPayload(String payload, Class> tri try { for (AbstractProject job : Hudson.getInstance().getAllItems(AbstractProject.class)) { GitHubTrigger trigger = (GitHubTrigger) job.getTrigger(triggerClass); - if (trigger!=null) { + + if (trigger != null) { + final String regex = trigger.getIgnorablePusher(); + + if (pusherName != null && !pusherName.isEmpty() + && pusherName.matches(regex)) { + + LOGGER.info("Ignoring pusher [" + pusherName + "] ..."); + continue; + } + + if (pusherEmail != null && !pusherEmail.isEmpty() + && pusherEmail.matches(regex)) { + + LOGGER.info("Ignoring pusher [" + pusherEmail + "] ..."); + continue; + } + LOGGER.fine("Considering to poke "+job.getFullDisplayName()); if (GitHubRepositoryNameContributor.parseAssociatedNames(job).contains(changedRepository)) { LOGGER.info("Poked "+job.getFullDisplayName()); diff --git a/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config.jelly b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config.jelly new file mode 100644 index 000000000..3c058652b --- /dev/null +++ b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config.jelly @@ -0,0 +1,5 @@ + + + + + diff --git a/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config.properties b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config.properties new file mode 100644 index 000000000..de7edbd49 --- /dev/null +++ b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config.properties @@ -0,0 +1 @@ +github.ignorablePusher=Ignorable pusher diff --git a/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config_de.properties b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config_de.properties new file mode 100644 index 000000000..fc398c9dc --- /dev/null +++ b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config_de.properties @@ -0,0 +1 @@ +github.ignorablePusher=Ignorierbarer Pusher diff --git a/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher.html b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher.html new file mode 100644 index 000000000..8fb81e000 --- /dev/null +++ b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher.html @@ -0,0 +1,3 @@ +
+ Defines a regular expression to which the name or email of an ignorable pusher is to be matched. +
diff --git a/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher_de.html b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher_de.html new file mode 100644 index 000000000..9117be7e9 --- /dev/null +++ b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher_de.html @@ -0,0 +1,3 @@ +
+ Definiert einen regulären Ausdruck, der zu dem Namen oder die E-Mail eines ignorierbaren Pushers passt. +
diff --git a/src/test/java/com/cloudbees/jenkins/GitHubPushTriggerTestCase.java b/src/test/java/com/cloudbees/jenkins/GitHubPushTriggerTestCase.java new file mode 100644 index 000000000..d3e45e7f4 --- /dev/null +++ b/src/test/java/com/cloudbees/jenkins/GitHubPushTriggerTestCase.java @@ -0,0 +1,84 @@ +package com.cloudbees.jenkins; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import hudson.model.FreeStyleProject; +import hudson.plugins.git.GitSCM; +import hudson.scm.SCM; + +import java.io.IOException; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; + +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; + +import com.cloudbees.jenkins.GitHubPushTrigger.DescriptorImpl; + +/** + * @author Achim Derigs + */ +public final class GitHubPushTriggerTestCase { + + @Rule + public final JenkinsRule j = new JenkinsRule(); + + private static void triggerWebHook(final String repositoryUrl, final String pusherName) + throws IOException { + + final DescriptorImpl descriptor = DescriptorImpl.get(); + final URL url = descriptor.getHookUrl(); + final HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("POST"); + connection.setDoOutput(true); + connection.connect(); + + final String payload = "payload={\"repository\":{\"url\":\"" + repositoryUrl + + "\"},\"pusher\":{\"name\":\"" + pusherName + "\",\"email\":\"\"}}"; + + final OutputStream stream = connection.getOutputStream(); + + try { + stream.write(payload.getBytes(StandardCharsets.UTF_8)); + } finally { + stream.close(); + } + + assertEquals(HttpURLConnection.HTTP_OK, connection.getResponseCode()); + } + + @Test + public void trigger() throws IOException { + final String repositoryUrl = "https://github.com/OpenDataSpace/parent"; + final SCM scm = new GitSCM(repositoryUrl); + final FreeStyleProject project = j.createFreeStyleProject(); + project.setScm(scm); + + final String expected = System.getProperty("user.name"); + final GitHubPushTrigger trigger = new GitHubPushTrigger(); + project.addTrigger(trigger); + triggerWebHook(repositoryUrl, expected); + + final String actual = trigger.pushBy(); + assertEquals(expected, actual); + } + + @Test + public void ignorePusher() throws IOException { + final String repositoryUrl = "https://github.com/OpenDataSpace/parent"; + final SCM scm = new GitSCM(repositoryUrl); + final FreeStyleProject project = j.createFreeStyleProject(); + project.setScm(scm); + + final String pusherName = System.getProperty("user.name"); + final GitHubPushTrigger trigger = new GitHubPushTrigger(pusherName); + project.addTrigger(trigger); + triggerWebHook(repositoryUrl, pusherName); + + final Object object = trigger.pushBy(); + assertNull(object); + } +} From f84123fd4d1109e5fa93a1f30d869b230c83b3ab Mon Sep 17 00:00:00 2001 From: Achim Derigs Date: Tue, 23 Jun 2015 11:14:14 +0200 Subject: [PATCH 03/22] documents ignorable pusher --- .../jenkins/GitHubPushTrigger/help-ignorablePusher.html | 2 +- .../jenkins/GitHubPushTrigger/help-ignorablePusher_de.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher.html b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher.html index 8fb81e000..7a02d0820 100644 --- a/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher.html +++ b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher.html @@ -1,3 +1,3 @@
- Defines a regular expression to which the name or email of an ignorable pusher is to be matched. + This defines a regular expression to which the name or email of an ignorable pusher is to be matched. Such a push wil be ignored. Normally a preceding push of Jenkins him self could be prevented that way.
diff --git a/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher_de.html b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher_de.html index 9117be7e9..72604b02b 100644 --- a/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher_de.html +++ b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher_de.html @@ -1,3 +1,3 @@
- Definiert einen regulären Ausdruck, der zu dem Namen oder die E-Mail eines ignorierbaren Pushers passt. + Hier wird ein regulärer Ausdruck definiert, der zu dem Namen oder der E-Mail eines ignorierbaren Pushers paßt. Solch ein Push wird ignoriert. Üblicherweise kann kann auf diese Weise damit ein vorhergehender Push von Jenkins selber verhindert werden.
From 985cc7315e0136dd74eb96b6afde277396cda530 Mon Sep 17 00:00:00 2001 From: Achim Derigs Date: Tue, 23 Jun 2015 16:20:00 +0200 Subject: [PATCH 04/22] fixes breaking of backward compatibility caused by the implementation of an ignorable pusher --- .../cloudbees/jenkins/GitHubPushTrigger.java | 21 ++++--- .../com/cloudbees/jenkins/GitHubTrigger.java | 11 ---- .../com/cloudbees/jenkins/GitHubWebHook.java | 57 +++++++++---------- .../help-ignorablePusher.html | 2 +- .../jenkins/GitHubPushTriggerTestCase.java | 6 +- 5 files changed, 46 insertions(+), 51 deletions(-) diff --git a/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java b/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java index e28642b02..f4d7a2d9b 100644 --- a/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java +++ b/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java @@ -4,10 +4,10 @@ import hudson.Util; import hudson.console.AnnotatedLargeText; import hudson.model.Action; -import hudson.model.Item; -import hudson.model.AbstractProject; import hudson.model.Hudson; import hudson.model.Hudson.MasterComputer; +import hudson.model.Item; +import hudson.model.AbstractProject; import hudson.model.Project; import hudson.triggers.Trigger; import hudson.triggers.TriggerDescriptor; @@ -33,8 +33,6 @@ import java.util.logging.Level; import java.util.logging.Logger; -import javax.inject.Inject; - import jenkins.model.Jenkins; import net.sf.json.JSONObject; @@ -47,12 +45,14 @@ import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.StaplerRequest; +import javax.inject.Inject; + /** * Triggers a build when we receive a GitHub post-commit webhook. * * @author Kohsuke Kawaguchi */ -public class GitHubPushTrigger extends Trigger> implements GitHubTrigger { +public class GitHubPushTrigger extends Trigger> implements GitHubTrigger { String pushBy; private final String ignorablePusher; @@ -65,11 +65,18 @@ public GitHubPushTrigger() { this(""); } - public String pushBy() { + String pushBy() { return pushBy; } - public String getIgnorablePusher() { + /** + * Gets the regular expression to which the name or email of an ignorable pusher is to be + * matched. + * + * @return the regular expression to which the name or email of an ignorable pusher is to be + * matched. + */ + String getIgnorablePusher() { return ignorablePusher; } diff --git a/src/main/java/com/cloudbees/jenkins/GitHubTrigger.java b/src/main/java/com/cloudbees/jenkins/GitHubTrigger.java index dd0550877..cb225313a 100644 --- a/src/main/java/com/cloudbees/jenkins/GitHubTrigger.java +++ b/src/main/java/com/cloudbees/jenkins/GitHubTrigger.java @@ -50,15 +50,4 @@ public void parseAssociatedNames(AbstractProject job, Collection> tri try { for (AbstractProject job : Hudson.getInstance().getAllItems(AbstractProject.class)) { GitHubTrigger trigger = (GitHubTrigger) job.getTrigger(triggerClass); + if (trigger!=null) { + if (trigger instanceof GitHubPushTrigger) { + final String regex = ((GitHubPushTrigger) trigger).getIgnorablePusher(); - if (trigger != null) { - final String regex = trigger.getIgnorablePusher(); + if (pusherName != null && !pusherName.isEmpty() + && pusherName.matches(regex)) { - if (pusherName != null && !pusherName.isEmpty() - && pusherName.matches(regex)) { - - LOGGER.info("Ignoring pusher [" + pusherName + "] ..."); - continue; - } + LOGGER.info("Ignoring pusher [" + pusherName + "] ..."); + continue; + } - if (pusherEmail != null && !pusherEmail.isEmpty() - && pusherEmail.matches(regex)) { + if (pusherEmail != null && !pusherEmail.isEmpty() + && pusherEmail.matches(regex)) { - LOGGER.info("Ignoring pusher [" + pusherEmail + "] ..."); - continue; + LOGGER.info("Ignoring pusher [" + pusherEmail + "] ..."); + continue; + } } LOGGER.fine("Considering to poke "+job.getFullDisplayName()); diff --git a/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher.html b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher.html index 7a02d0820..f7320f708 100644 --- a/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher.html +++ b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher.html @@ -1,3 +1,3 @@
- This defines a regular expression to which the name or email of an ignorable pusher is to be matched. Such a push wil be ignored. Normally a preceding push of Jenkins him self could be prevented that way. + This defines a regular expression to which the name or email of an ignorable pusher is to be matched. Such a push will be ignored. Usually a preceding push of Jenkins him self could be prevented that way.
diff --git a/src/test/java/com/cloudbees/jenkins/GitHubPushTriggerTestCase.java b/src/test/java/com/cloudbees/jenkins/GitHubPushTriggerTestCase.java index d3e45e7f4..63b7e4fe4 100644 --- a/src/test/java/com/cloudbees/jenkins/GitHubPushTriggerTestCase.java +++ b/src/test/java/com/cloudbees/jenkins/GitHubPushTriggerTestCase.java @@ -52,7 +52,7 @@ private static void triggerWebHook(final String repositoryUrl, final String push @Test public void trigger() throws IOException { - final String repositoryUrl = "https://github.com/OpenDataSpace/parent"; + final String repositoryUrl = "https://github.com/kohsuke/foo"; final SCM scm = new GitSCM(repositoryUrl); final FreeStyleProject project = j.createFreeStyleProject(); project.setScm(scm); @@ -67,8 +67,8 @@ public void trigger() throws IOException { } @Test - public void ignorePusher() throws IOException { - final String repositoryUrl = "https://github.com/OpenDataSpace/parent"; + public void ignore() throws IOException { + final String repositoryUrl = "https://github.com/kohsuke/foo"; final SCM scm = new GitSCM(repositoryUrl); final FreeStyleProject project = j.createFreeStyleProject(); project.setScm(scm); From 784abc6c6526486cbdcc168b5a7bfd1c344cd000 Mon Sep 17 00:00:00 2001 From: Achim Derigs Date: Tue, 23 Jun 2015 17:26:58 +0200 Subject: [PATCH 05/22] fixes access to ignorable pusher --- src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java b/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java index f4d7a2d9b..6e59e1e48 100644 --- a/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java +++ b/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java @@ -65,7 +65,7 @@ public GitHubPushTrigger() { this(""); } - String pushBy() { + public String pushBy() { return pushBy; } @@ -76,7 +76,7 @@ String pushBy() { * @return the regular expression to which the name or email of an ignorable pusher is to be * matched. */ - String getIgnorablePusher() { + public String getIgnorablePusher() { return ignorablePusher; } From 0ce901a38bd412c04e594ed9924f2abe1f7e65db Mon Sep 17 00:00:00 2001 From: Achim Derigs Date: Tue, 23 Jun 2015 17:31:02 +0200 Subject: [PATCH 06/22] fixes needless line deletion --- src/main/java/com/cloudbees/jenkins/GitHubWebHook.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/cloudbees/jenkins/GitHubWebHook.java b/src/main/java/com/cloudbees/jenkins/GitHubWebHook.java index 82bed0425..b0aa799ed 100644 --- a/src/main/java/com/cloudbees/jenkins/GitHubWebHook.java +++ b/src/main/java/com/cloudbees/jenkins/GitHubWebHook.java @@ -32,6 +32,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; + /** * Receives github hook. * From 23abd4ad2c19c3a5f4b97d43264898a04ac19bf4 Mon Sep 17 00:00:00 2001 From: Achim Derigs Date: Wed, 24 Jun 2015 10:13:38 +0200 Subject: [PATCH 07/22] fixes NPE if regex for ignorable pusher is null --- .../cloudbees/jenkins/GitHubPushTrigger.java | 4 ++-- .../com/cloudbees/jenkins/GitHubWebHook.java | 22 +++++++++---------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java b/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java index 6e59e1e48..e37534734 100644 --- a/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java +++ b/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java @@ -62,10 +62,10 @@ public GitHubPushTrigger(final String ignorablePusher) { } public GitHubPushTrigger() { - this(""); + this(null); } - public String pushBy() { + String pushBy() { return pushBy; } diff --git a/src/main/java/com/cloudbees/jenkins/GitHubWebHook.java b/src/main/java/com/cloudbees/jenkins/GitHubWebHook.java index 583408eaa..3d89b794e 100644 --- a/src/main/java/com/cloudbees/jenkins/GitHubWebHook.java +++ b/src/main/java/com/cloudbees/jenkins/GitHubWebHook.java @@ -213,18 +213,16 @@ public void processGitHubPayload(String payload, Class> tri if (trigger instanceof GitHubPushTrigger) { final String regex = ((GitHubPushTrigger) trigger).getIgnorablePusher(); - if (pusherName != null && !pusherName.isEmpty() - && pusherName.matches(regex)) { - - LOGGER.info("Ignoring pusher [" + pusherName + "] ..."); - continue; - } - - if (pusherEmail != null && !pusherEmail.isEmpty() - && pusherEmail.matches(regex)) { - - LOGGER.info("Ignoring pusher [" + pusherEmail + "] ..."); - continue; + if (regex != null) { + if (pusherName != null && pusherName.matches(regex)) { + LOGGER.info("Ignoring pusher [" + pusherName + "] ..."); + continue; + } + + if (pusherEmail != null && pusherEmail.matches(regex)) { + LOGGER.info("Ignoring pusher [" + pusherEmail + "] ..."); + continue; + } } } From 9bcadfa3fe529b1b7cea4a892b100d83b32f035f Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sun, 30 Aug 2015 18:32:28 +0300 Subject: [PATCH 08/22] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6e63de569..28cd03529 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ com.coravy.hudson.plugins.github github - 1.13.0 + 1.13.1-SNAPSHOT hpi GitHub plugin From 93cb2f9a77827005077f6c92d09f66d0613f7d00 Mon Sep 17 00:00:00 2001 From: Kirill Merkushev Date: Sun, 30 Aug 2015 19:04:52 +0300 Subject: [PATCH 09/22] don't run cleaner if we don't manage hooks --- src/main/java/com/cloudbees/jenkins/Cleaner.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/cloudbees/jenkins/Cleaner.java b/src/main/java/com/cloudbees/jenkins/Cleaner.java index ad6cf2d61..ea89635d9 100644 --- a/src/main/java/com/cloudbees/jenkins/Cleaner.java +++ b/src/main/java/com/cloudbees/jenkins/Cleaner.java @@ -55,6 +55,10 @@ public long getRecurrencePeriod() { */ @Override protected void doRun() throws Exception { + if (!GitHubPlugin.configuration().isManageHooks()) { + return; + } + URL url = GitHubPlugin.configuration().getHookUrl(); List jobs = Jenkins.getInstance().getAllItems(AbstractProject.class); From b6e21f12cb162304e0c886977efc2acba61c8824 Mon Sep 17 00:00:00 2001 From: Kirill Merkushev Date: Sun, 30 Aug 2015 19:06:15 +0300 Subject: [PATCH 10/22] throw config exception on empty jenkins root url --- .../plugins/github/config/GitHubPluginConfig.java | 14 ++++++++++---- .../jenkinsci/plugins/github/Messages.properties | 2 ++ 2 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/org/jenkinsci/plugins/github/Messages.properties diff --git a/src/main/java/org/jenkinsci/plugins/github/config/GitHubPluginConfig.java b/src/main/java/org/jenkinsci/plugins/github/config/GitHubPluginConfig.java index 461494e84..bf8ae38a2 100644 --- a/src/main/java/org/jenkinsci/plugins/github/config/GitHubPluginConfig.java +++ b/src/main/java/org/jenkinsci/plugins/github/config/GitHubPluginConfig.java @@ -14,6 +14,7 @@ import org.apache.commons.codec.binary.Base64; import org.jenkinsci.main.modules.instance_identity.InstanceIdentity; import org.jenkinsci.plugins.github.GitHubPlugin; +import org.jenkinsci.plugins.github.Messages; import org.jenkinsci.plugins.github.internal.GHPluginConfigException; import org.jenkinsci.plugins.github.migration.Migrator; import org.kohsuke.github.GitHub; @@ -34,6 +35,7 @@ import static com.google.common.base.Charsets.UTF_8; import static java.lang.String.format; +import static org.apache.commons.lang3.StringUtils.isEmpty; import static org.jenkinsci.plugins.github.config.GitHubServerConfig.allowedToManageHooks; import static org.jenkinsci.plugins.github.config.GitHubServerConfig.loginToGithub; import static org.jenkinsci.plugins.github.util.FluentIterableWrapper.from; @@ -103,13 +105,17 @@ public void setOverrideHookUrl(boolean overrideHookUrl) { public URL getHookUrl() throws GHPluginConfigException { try { + String jenkinsUrl = Jenkins.getInstance().getRootUrl(); + + if (isEmpty(jenkinsUrl)) { + throw new GHPluginConfigException(Messages.global_config_url_is_empty()); + } + return hookUrl != null ? hookUrl - : new URL(Jenkins.getInstance().getRootUrl() + GitHubWebHook.get().getUrlName() + '/'); + : new URL(jenkinsUrl + GitHubWebHook.get().getUrlName() + '/'); } catch (MalformedURLException e) { - throw new GHPluginConfigException( - "Mailformed GH hook url in global configuration (%s)", e.getMessage() - ); + throw new GHPluginConfigException(Messages.global_config_hook_url_is_mailformed(e.getMessage())); } } diff --git a/src/main/resources/org/jenkinsci/plugins/github/Messages.properties b/src/main/resources/org/jenkinsci/plugins/github/Messages.properties new file mode 100644 index 000000000..eb041faad --- /dev/null +++ b/src/main/resources/org/jenkinsci/plugins/github/Messages.properties @@ -0,0 +1,2 @@ +global.config.url.is.empty=Jenkins URL is empty. Set explicitly Jenkins URL in global configuration or in GitHub plugin configuration to manage hooks. +global.config.hook.url.is.mailformed=Mailformed GH hook url in global configuration ({0}) From f4f6525850b2ef1e8838d7580a47d21f0f1784ea Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Mon, 31 Aug 2015 00:20:43 +0300 Subject: [PATCH 11/22] [maven-release-plugin] prepare release github-1.13.1 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 28cd03529..e2769294f 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ com.coravy.hudson.plugins.github github - 1.13.1-SNAPSHOT + 1.13.1 hpi GitHub plugin @@ -39,7 +39,7 @@ scm:git:git://github.com/jenkinsci/github-plugin.git scm:git:git@github.com:jenkinsci/github-plugin.git https://github.com/jenkinsci/github-plugin - github-1.13.0 + github-1.13.1 From 2f684d0d89d5567b69d1f6325c3f081fd4e692d3 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Mon, 31 Aug 2015 00:20:49 +0300 Subject: [PATCH 12/22] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index e2769294f..57648616a 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ com.coravy.hudson.plugins.github github - 1.13.1 + 1.13.2-SNAPSHOT hpi GitHub plugin @@ -39,7 +39,7 @@ scm:git:git://github.com/jenkinsci/github-plugin.git scm:git:git@github.com:jenkinsci/github-plugin.git https://github.com/jenkinsci/github-plugin - github-1.13.1 + github-1.13.0 From f0a971f5e4ac486a64a92cdc572206e4bf119767 Mon Sep 17 00:00:00 2001 From: Kirill Merkushev Date: Mon, 31 Aug 2015 14:17:31 +0300 Subject: [PATCH 13/22] check hook url for override before checking jenkins default url + typo fix in word malformed --- .../github/config/GitHubPluginConfig.java | 52 ++++++++++++++----- .../plugins/github/Messages.properties | 2 +- 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/jenkinsci/plugins/github/config/GitHubPluginConfig.java b/src/main/java/org/jenkinsci/plugins/github/config/GitHubPluginConfig.java index bf8ae38a2..b60deb3d6 100644 --- a/src/main/java/org/jenkinsci/plugins/github/config/GitHubPluginConfig.java +++ b/src/main/java/org/jenkinsci/plugins/github/config/GitHubPluginConfig.java @@ -35,7 +35,7 @@ import static com.google.common.base.Charsets.UTF_8; import static java.lang.String.format; -import static org.apache.commons.lang3.StringUtils.isEmpty; +import static org.apache.commons.lang3.StringUtils.isNotEmpty; import static org.jenkinsci.plugins.github.config.GitHubServerConfig.allowedToManageHooks; import static org.jenkinsci.plugins.github.config.GitHubServerConfig.loginToGithub; import static org.jenkinsci.plugins.github.util.FluentIterableWrapper.from; @@ -103,19 +103,15 @@ public void setOverrideHookUrl(boolean overrideHookUrl) { this.overrideHookUrl = overrideHookUrl; } + /** + * @return hook url used as endpoint to search and write auto-managed hooks in GH + * @throws GHPluginConfigException if default jenkins url is malformed + */ public URL getHookUrl() throws GHPluginConfigException { - try { - String jenkinsUrl = Jenkins.getInstance().getRootUrl(); - - if (isEmpty(jenkinsUrl)) { - throw new GHPluginConfigException(Messages.global_config_url_is_empty()); - } - - return hookUrl != null - ? hookUrl - : new URL(jenkinsUrl + GitHubWebHook.get().getUrlName() + '/'); - } catch (MalformedURLException e) { - throw new GHPluginConfigException(Messages.global_config_hook_url_is_mailformed(e.getMessage())); + if (hookUrl != null) { + return hookUrl; + } else { + return constructDefaultUrl(); } } @@ -213,4 +209,34 @@ public FormValidation doCheckHookUrl(@QueryParameter String value) { return FormValidation.error(e, "Failed to test a connection to %s", value); } } + + /** + * Used by default in {@link #getHookUrl()} + * + * @return url to be used in GH hooks configuration as main endpoint + * @throws GHPluginConfigException if jenkins root url empty of malformed + */ + private URL constructDefaultUrl() { + String jenkinsUrl = Jenkins.getInstance().getRootUrl(); + validateConfig(isNotEmpty(jenkinsUrl), Messages.global_config_url_is_empty()); + try { + return new URL(jenkinsUrl + GitHubWebHook.get().getUrlName() + '/'); + } catch (MalformedURLException e) { + throw new GHPluginConfigException(Messages.global_config_hook_url_is_malformed(e.getMessage())); + } + } + + /** + * Util method just to hide one more if for better readability + * + * @param state to check. If false, then exception will be thrown + * @param message message to describe exception in case of false state + * + * @throws GHPluginConfigException if state is false + */ + private void validateConfig(boolean state, String message) { + if (!state) { + throw new GHPluginConfigException(message); + } + } } diff --git a/src/main/resources/org/jenkinsci/plugins/github/Messages.properties b/src/main/resources/org/jenkinsci/plugins/github/Messages.properties index eb041faad..464b5c807 100644 --- a/src/main/resources/org/jenkinsci/plugins/github/Messages.properties +++ b/src/main/resources/org/jenkinsci/plugins/github/Messages.properties @@ -1,2 +1,2 @@ global.config.url.is.empty=Jenkins URL is empty. Set explicitly Jenkins URL in global configuration or in GitHub plugin configuration to manage hooks. -global.config.hook.url.is.mailformed=Mailformed GH hook url in global configuration ({0}) +global.config.hook.url.is.malformed=Malformed GH hook url in global configuration ({0}). Please check Jenkins URL is valid and ends with slash or use overrided hook url From c4657a23ce9c50c60c4bf7de576bff3e6a6c4a20 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Mon, 31 Aug 2015 17:49:27 +0300 Subject: [PATCH 14/22] [maven-release-plugin] prepare release github-1.13.2 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 57648616a..f4c3cdcbb 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ com.coravy.hudson.plugins.github github - 1.13.2-SNAPSHOT + 1.13.2 hpi GitHub plugin @@ -39,7 +39,7 @@ scm:git:git://github.com/jenkinsci/github-plugin.git scm:git:git@github.com:jenkinsci/github-plugin.git https://github.com/jenkinsci/github-plugin - github-1.13.0 + github-1.13.2 From 0dbb10d26a3da15e8c7c7cac503b35164d0fd1dc Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Mon, 31 Aug 2015 17:49:31 +0300 Subject: [PATCH 15/22] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index f4c3cdcbb..39a9325b8 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ com.coravy.hudson.plugins.github github - 1.13.2 + 1.13.3-SNAPSHOT hpi GitHub plugin @@ -39,7 +39,7 @@ scm:git:git://github.com/jenkinsci/github-plugin.git scm:git:git@github.com:jenkinsci/github-plugin.git https://github.com/jenkinsci/github-plugin - github-1.13.2 + github-1.13.0 From 73b60b4334e33d6d5c147ec981b448e9c5b4ebf0 Mon Sep 17 00:00:00 2001 From: Achim Derigs Date: Mon, 31 Aug 2015 17:21:04 +0200 Subject: [PATCH 16/22] fixes typo --- .../jenkins/GitHubPushTrigger/help-ignorablePusher_de.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher_de.html b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher_de.html index 72604b02b..a63a4af8d 100644 --- a/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher_de.html +++ b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/help-ignorablePusher_de.html @@ -1,3 +1,3 @@
- Hier wird ein regulärer Ausdruck definiert, der zu dem Namen oder der E-Mail eines ignorierbaren Pushers paßt. Solch ein Push wird ignoriert. Üblicherweise kann kann auf diese Weise damit ein vorhergehender Push von Jenkins selber verhindert werden. + Hier wird ein regulärer Ausdruck definiert, der zu dem Namen oder der E-Mail eines ignorierbaren Pushers paßt. Solch ein Push wird ignoriert. Üblicherweise kann auf diese Weise damit ein vorhergehender Push von Jenkins selber verhindert werden.
From b10ad388815a35617fe5fbb79171f116eb814a64 Mon Sep 17 00:00:00 2001 From: Kirill Merkushev Date: Tue, 1 Sep 2015 00:38:44 +0300 Subject: [PATCH 17/22] [FIXES JENKINS-30223] return back com.cloudbees.jenkins.Credential as of it makes fail to boot jenkins after installation of plugin which depends on this class. Also remove migration to another package for this class and use it directly (cherry picked from commit 061d849) --- .../com/cloudbees/jenkins/Credential.java | 67 +++++++++++++++++++ .../cloudbees/jenkins/GitHubPushTrigger.java | 1 - .../github/config/GitHubServerConfig.java | 5 ++ .../plugins/github/deprecated/Credential.java | 36 ---------- .../plugins/github/migration/Migrator.java | 9 ++- .../github/migration/MigratorTest.java | 2 +- 6 files changed, 79 insertions(+), 41 deletions(-) create mode 100644 src/main/java/com/cloudbees/jenkins/Credential.java delete mode 100644 src/main/java/org/jenkinsci/plugins/github/deprecated/Credential.java diff --git a/src/main/java/com/cloudbees/jenkins/Credential.java b/src/main/java/com/cloudbees/jenkins/Credential.java new file mode 100644 index 000000000..d5b801a7b --- /dev/null +++ b/src/main/java/com/cloudbees/jenkins/Credential.java @@ -0,0 +1,67 @@ +package com.cloudbees.jenkins; + +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; +import org.jenkinsci.plugins.github.GitHubPlugin; +import org.jenkinsci.plugins.github.config.GitHubServerConfig; +import org.kohsuke.github.GitHub; +import org.kohsuke.stapler.DataBoundConstructor; + +import javax.annotation.CheckForNull; +import java.io.IOException; + +import static org.jenkinsci.plugins.github.util.FluentIterableWrapper.from; + +/** + * Credential to access GitHub. + * Used only for migration. + * + * @author Kohsuke Kawaguchi + * @see org.jenkinsci.plugins.github.config.GitHubPluginConfig + * @see GitHubServerConfig + * @deprecated since 1.13.0 plugin uses credentials-plugin to manage tokens. All configuration moved to + * {@link org.jenkinsci.plugins.github.config.GitHubPluginConfig} which can be fetched via + * {@link GitHubPlugin#configuration()}. You can fetch corresponding config with creds by + * {@link org.jenkinsci.plugins.github.config.GitHubPluginConfig#findGithubConfig(Predicate)} which returns + * iterable over authorized nonnull {@link GitHub}s matched your predicate + */ +@Deprecated +public class Credential { + @SuppressWarnings("visibilitymodifier") + public final transient String username; + @SuppressWarnings("visibilitymodifier") + public final transient String apiUrl; + @SuppressWarnings("visibilitymodifier") + public final transient String oauthAccessToken; + + @DataBoundConstructor + public Credential(String username, String apiUrl, String oauthAccessToken) { + this.username = username; + this.apiUrl = apiUrl; + this.oauthAccessToken = oauthAccessToken; + } + + public String getUsername() { + return username; + } + + public String getApiUrl() { + return apiUrl; + } + + public String getOauthAccessToken() { + return oauthAccessToken; + } + + /** + * @return authorized first {@link GitHub} from global config or null if no any + * @throws IOException never thrown, but in signature for backward compatibility + * @deprecated see class javadoc. Now any instance return same GH. Please use new api to fetch another + */ + @CheckForNull + @Deprecated + public GitHub login() throws IOException { + return from(GitHubPlugin.configuration().findGithubConfig(Predicates.alwaysTrue())) + .first().orNull(); + } +} diff --git a/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java b/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java index b98239cb3..5d0427d04 100644 --- a/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java +++ b/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java @@ -18,7 +18,6 @@ import org.apache.commons.jelly.XMLOutput; import org.jenkinsci.plugins.github.GitHubPlugin; import org.jenkinsci.plugins.github.config.GitHubPluginConfig; -import org.jenkinsci.plugins.github.deprecated.Credential; import org.jenkinsci.plugins.github.internal.GHPluginConfigException; import org.jenkinsci.plugins.github.migration.Migrator; import org.kohsuke.stapler.DataBoundConstructor; diff --git a/src/main/java/org/jenkinsci/plugins/github/config/GitHubServerConfig.java b/src/main/java/org/jenkinsci/plugins/github/config/GitHubServerConfig.java index 03eacd24f..1fa853020 100644 --- a/src/main/java/org/jenkinsci/plugins/github/config/GitHubServerConfig.java +++ b/src/main/java/org/jenkinsci/plugins/github/config/GitHubServerConfig.java @@ -191,6 +191,11 @@ public static String tokenFor(String credentialsId) { /** * Returns true if given host is part of stored (or default if blank) api url * + * For example: + * withHost(api.github.com).apply(config for ~empty~) = true + * withHost(api.github.com).apply(config for api.github.com) = true + * withHost(api.github.com).apply(config for github.company.com) = false + * * @param host host to find in api url * * @return predicate to match against {@link GitHubServerConfig} diff --git a/src/main/java/org/jenkinsci/plugins/github/deprecated/Credential.java b/src/main/java/org/jenkinsci/plugins/github/deprecated/Credential.java deleted file mode 100644 index 01443a8e1..000000000 --- a/src/main/java/org/jenkinsci/plugins/github/deprecated/Credential.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.jenkinsci.plugins.github.deprecated; - -import org.kohsuke.stapler.DataBoundConstructor; - -/** - * Credential to access GitHub. - * Used only for migration. - * - * @author Kohsuke Kawaguchi - * @deprecated Please use {@link org.jenkinsci.plugins.github.config.GitHubServerConfig} instead - */ -@Deprecated -public class Credential { - private final transient String username; - private final transient String apiUrl; - private final transient String oauthAccessToken; - - @DataBoundConstructor - public Credential(String username, String apiUrl, String oauthAccessToken) { - this.username = username; - this.apiUrl = apiUrl; - this.oauthAccessToken = oauthAccessToken; - } - - public String getUsername() { - return username; - } - - public String getApiUrl() { - return apiUrl; - } - - public String getOauthAccessToken() { - return oauthAccessToken; - } -} diff --git a/src/main/java/org/jenkinsci/plugins/github/migration/Migrator.java b/src/main/java/org/jenkinsci/plugins/github/migration/Migrator.java index 20d4aa60f..c34849042 100644 --- a/src/main/java/org/jenkinsci/plugins/github/migration/Migrator.java +++ b/src/main/java/org/jenkinsci/plugins/github/migration/Migrator.java @@ -1,5 +1,6 @@ package org.jenkinsci.plugins.github.migration; +import com.cloudbees.jenkins.Credential; import com.cloudbees.jenkins.GitHubPushTrigger; import com.cloudbees.plugins.credentials.common.StandardCredentials; import com.google.common.annotations.VisibleForTesting; @@ -9,7 +10,6 @@ import org.jenkinsci.plugins.github.config.GitHubPluginConfig; import org.jenkinsci.plugins.github.config.GitHubServerConfig; import org.jenkinsci.plugins.github.config.GitHubTokenCredentialsCreator; -import org.jenkinsci.plugins.github.deprecated.Credential; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -92,10 +92,13 @@ public GitHubServerConfig apply(Credential input) { } /** - * - Old plain credentials moved to deprecated package as used only for migration + * Enable xml migration from deprecated nodes to new + * + * Can be used for example as + * Jenkins.XSTREAM2.addCompatibilityAlias("com.cloudbees.jenkins.Credential", Credential.class); */ public static void enableCompatibilityAliases() { - Jenkins.XSTREAM2.addCompatibilityAlias("com.cloudbees.jenkins.Credential", Credential.class); + // not used at this moment } /** diff --git a/src/test/java/org/jenkinsci/plugins/github/migration/MigratorTest.java b/src/test/java/org/jenkinsci/plugins/github/migration/MigratorTest.java index e2524a8f5..6fd01cb02 100644 --- a/src/test/java/org/jenkinsci/plugins/github/migration/MigratorTest.java +++ b/src/test/java/org/jenkinsci/plugins/github/migration/MigratorTest.java @@ -1,12 +1,12 @@ package org.jenkinsci.plugins.github.migration; +import com.cloudbees.jenkins.Credential; import com.cloudbees.jenkins.GitHubPushTrigger; import com.cloudbees.jenkins.GitHubWebHook; import hudson.model.FreeStyleProject; import jenkins.model.Jenkins; import org.jenkinsci.plugins.github.GitHubPlugin; import org.jenkinsci.plugins.github.config.GitHubServerConfig; -import org.jenkinsci.plugins.github.deprecated.Credential; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.JenkinsRule; From 28cb051e380ee3cd2e52b509855c9f38ae06d72a Mon Sep 17 00:00:00 2001 From: Kirill Merkushev Date: Wed, 2 Sep 2015 12:39:38 +0300 Subject: [PATCH 18/22] [maven-release-plugin] prepare release github-1.13.3 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 39a9325b8..626513f16 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ com.coravy.hudson.plugins.github github - 1.13.3-SNAPSHOT + 1.13.3 hpi GitHub plugin @@ -39,7 +39,7 @@ scm:git:git://github.com/jenkinsci/github-plugin.git scm:git:git@github.com:jenkinsci/github-plugin.git https://github.com/jenkinsci/github-plugin - github-1.13.0 + github-1.13.3 From 7cc6f5493a341c010f0c2609942ffd45c2e53d03 Mon Sep 17 00:00:00 2001 From: Achim Derigs Date: Thu, 10 Sep 2015 12:49:43 +0200 Subject: [PATCH 19/22] fixes constructor parameter name (@DataBoundConstructor) --- src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java b/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java index 5107bb53a..90d66a58c 100644 --- a/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java +++ b/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java @@ -48,8 +48,8 @@ public class GitHubPushTrigger extends Trigger> implements private final String ignorablePusher; @DataBoundConstructor - public GitHubPushTrigger(final String regex) { - ignorablePusher = regex; + public GitHubPushTrigger(final String ignorablePusher) { + this.ignorablePusher = ignorablePusher; } public GitHubPushTrigger() { From 082ed8c33ef106dafcd5a67b958341e424ea7a1c Mon Sep 17 00:00:00 2001 From: Achim Derigs Date: Fri, 16 Oct 2015 21:42:00 +0200 Subject: [PATCH 20/22] fixes SonarQube issues --- .../cloudbees/jenkins/GitHubPushTrigger.java | 26 ++++++++++++++++--- .../DefaultPushGHEventSubscriber.java | 24 +++-------------- .../jenkins/GitHubPushTriggerTestCase.java | 15 +++++------ 3 files changed, 32 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java b/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java index 1c5ac2ec9..5887c627e 100644 --- a/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java +++ b/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java @@ -18,6 +18,8 @@ import jenkins.model.Jenkins.MasterComputer; import jenkins.model.ParameterizedJobMixIn; import jenkins.triggers.SCMTriggerItem.SCMTriggerItems; +import net.sf.json.JSONObject; + import org.apache.commons.jelly.XMLOutput; import org.jenkinsci.plugins.github.GitHubPlugin; import org.jenkinsci.plugins.github.config.GitHubPluginConfig; @@ -65,12 +67,28 @@ String pushBy() { } /** - * Gets the regular expression to which the name or email of an ignorable pusher is to be matched. + * The payload will be accepted only if the regular expression to which the name or email of an ignorable pusher + * is not to be matched. * - * @return the regular expression to which the name or email of an ignorable pusher is to be matched. + * @param payload payload of gh-event. Never blank. + * @return false if the regular expression to which the name or email of an ignorable pusher is to be matched. + * Otherwise false. */ - public String getIgnorablePusher() { - return ignorablePusher; + public boolean accepts(final JSONObject payload) { + if (ignorablePusher != null && !ignorablePusher.isEmpty()) { + final JSONObject pusher = payload.getJSONObject("pusher"); + + for (final String key : new String[] {"name", "email"}) { + final String value = pusher.getString(key); + + if (value != null && value.matches(ignorablePusher)) { + LOGGER.info("Ignoring pusher [{}] ...", pusher); + return false; + } + } + } + + return true; } /** diff --git a/src/main/java/org/jenkinsci/plugins/github/webhook/subscriber/DefaultPushGHEventSubscriber.java b/src/main/java/org/jenkinsci/plugins/github/webhook/subscriber/DefaultPushGHEventSubscriber.java index 9f3b5a2ff..3392841a0 100644 --- a/src/main/java/org/jenkinsci/plugins/github/webhook/subscriber/DefaultPushGHEventSubscriber.java +++ b/src/main/java/org/jenkinsci/plugins/github/webhook/subscriber/DefaultPushGHEventSubscriber.java @@ -3,7 +3,6 @@ import com.cloudbees.jenkins.GitHubPushTrigger; import com.cloudbees.jenkins.GitHubRepositoryName; import com.cloudbees.jenkins.GitHubRepositoryNameContributor; -import com.cloudbees.jenkins.GitHubTrigger; import com.cloudbees.jenkins.GitHubWebHook; import hudson.Extension; import hudson.model.Job; @@ -64,11 +63,10 @@ protected Set events() { */ @Override protected void onEvent(GHEvent event, String payload) { - JSONObject json = JSONObject.fromObject(payload); + final JSONObject json = JSONObject.fromObject(payload); // something like 'https://github.com/bar/foo' String repoUrl = json.getJSONObject("repository").getString("url"); - final JSONObject pusher = json.getJSONObject("pusher"); - final String pusherName = pusher.getString("name"); + final String pusherName = json.getJSONObject("pusher").getString("name"); LOGGER.info("Received POST for {}", repoUrl); Matcher matcher = REPOSITORY_NAME_PATTERN.matcher(repoUrl); @@ -85,23 +83,9 @@ protected void onEvent(GHEvent event, String payload) { ACL.impersonate(ACL.SYSTEM, new Runnable() { @Override public void run() { - final String pusherEmail = pusher.getString("email"); for (Job job : Jenkins.getInstance().getAllItems(Job.class)) { - GitHubTrigger trigger = triggerFrom(job, GitHubPushTrigger.class); - if (trigger != null) { - if (trigger instanceof GitHubPushTrigger) { - final String regex = ((GitHubPushTrigger) trigger).getIgnorablePusher(); - if (regex != null) { - if (pusherName != null && pusherName.matches(regex)) { - LOGGER.info("Ignoring pusher [{}] ...", pusherName); - continue; - } - if (pusherEmail != null && pusherEmail.matches(regex)) { - LOGGER.info("Ignoring pusher [{}] ...", pusherEmail); - continue; - } - } - } + final GitHubPushTrigger trigger = triggerFrom(job, GitHubPushTrigger.class); + if (trigger != null && trigger.accepts(json)) { LOGGER.debug("Considering to poke {}", job.getFullDisplayName()); if (GitHubRepositoryNameContributor.parseAssociatedNames(job).contains(changedRepository)) { LOGGER.info("Poked {}", job.getFullDisplayName()); diff --git a/src/test/java/com/cloudbees/jenkins/GitHubPushTriggerTestCase.java b/src/test/java/com/cloudbees/jenkins/GitHubPushTriggerTestCase.java index 98a587a1c..4ac538235 100644 --- a/src/test/java/com/cloudbees/jenkins/GitHubPushTriggerTestCase.java +++ b/src/test/java/com/cloudbees/jenkins/GitHubPushTriggerTestCase.java @@ -1,5 +1,6 @@ package com.cloudbees.jenkins; +import static java.nio.charset.StandardCharsets.UTF_8; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; @@ -7,7 +8,6 @@ import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; -import java.nio.charset.StandardCharsets; import org.jenkinsci.plugins.github.GitHubPlugin; import org.jenkinsci.plugins.github.config.GitHubPluginConfig; @@ -37,15 +37,12 @@ private static void triggerWebHook(final String repositoryUrl, final String push connection.connect(); final String payload = "payload={\"repository\":{\"url\":\"" + repositoryUrl + "\"},\"pusher\":{\"name\":\"" + pusherName + "\",\"email\":\"\"}}"; - final OutputStream stream = connection.getOutputStream(); - try { - stream.write(payload.getBytes(StandardCharsets.UTF_8)); - } finally { - stream.close(); + try (final OutputStream stream = connection.getOutputStream()) { + stream.write(payload.getBytes(UTF_8)); } - assertEquals(HttpURLConnection.HTTP_OK, connection.getResponseCode()); + assertEquals("fails to connect to " + url, HttpURLConnection.HTTP_OK, connection.getResponseCode()); } @Test @@ -61,7 +58,7 @@ public void trigger() throws IOException { triggerWebHook(repositoryUrl, expected); final String actual = trigger.pushBy(); - assertEquals(expected, actual); + assertEquals("fails to be triggered by pusher: ", expected, actual); } @Test @@ -77,6 +74,6 @@ public void ignore() throws IOException { triggerWebHook(repositoryUrl, pusherName); final Object object = trigger.pushBy(); - assertNull(object); + assertNull("fails to ignore pusher: ", object); } } From 72d1013bd56307d27622061e7e82d351524cb2cf Mon Sep 17 00:00:00 2001 From: Achim Derigs Date: Fri, 16 Oct 2015 22:48:52 +0200 Subject: [PATCH 21/22] turns logic of ignoring a pusher to avoid further mocking --- .../com/cloudbees/jenkins/GitHubPushTrigger.java | 15 ++++++--------- .../subscriber/DefaultPushGHEventSubscriber.java | 2 +- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java b/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java index 5887c627e..f5ff2abd4 100644 --- a/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java +++ b/src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java @@ -67,14 +67,11 @@ String pushBy() { } /** - * The payload will be accepted only if the regular expression to which the name or email of an ignorable pusher - * is not to be matched. - * - * @param payload payload of gh-event. Never blank. - * @return false if the regular expression to which the name or email of an ignorable pusher is to be matched. - * Otherwise false. + * @param payload payload of gh-event. Never blank + * @return true if the regular expression to which the pusher name + * or email of a payload is to be matched, false otherwise */ - public boolean accepts(final JSONObject payload) { + public boolean ignores(final JSONObject payload) { if (ignorablePusher != null && !ignorablePusher.isEmpty()) { final JSONObject pusher = payload.getJSONObject("pusher"); @@ -83,12 +80,12 @@ public boolean accepts(final JSONObject payload) { if (value != null && value.matches(ignorablePusher)) { LOGGER.info("Ignoring pusher [{}] ...", pusher); - return false; + return true; } } } - return true; + return false; } /** diff --git a/src/main/java/org/jenkinsci/plugins/github/webhook/subscriber/DefaultPushGHEventSubscriber.java b/src/main/java/org/jenkinsci/plugins/github/webhook/subscriber/DefaultPushGHEventSubscriber.java index 3392841a0..310addab5 100644 --- a/src/main/java/org/jenkinsci/plugins/github/webhook/subscriber/DefaultPushGHEventSubscriber.java +++ b/src/main/java/org/jenkinsci/plugins/github/webhook/subscriber/DefaultPushGHEventSubscriber.java @@ -85,7 +85,7 @@ protected void onEvent(GHEvent event, String payload) { public void run() { for (Job job : Jenkins.getInstance().getAllItems(Job.class)) { final GitHubPushTrigger trigger = triggerFrom(job, GitHubPushTrigger.class); - if (trigger != null && trigger.accepts(json)) { + if (trigger != null && !trigger.ignores(json)) { LOGGER.debug("Considering to poke {}", job.getFullDisplayName()); if (GitHubRepositoryNameContributor.parseAssociatedNames(job).contains(changedRepository)) { LOGGER.info("Poked {}", job.getFullDisplayName()); From 4fc39e26133c46bae79309182b139b68c82ca5be Mon Sep 17 00:00:00 2001 From: Achim Derigs Date: Wed, 10 Feb 2016 08:38:39 +0100 Subject: [PATCH 22/22] merges config.jelly into config.groovy --- .../cloudbees/jenkins/GitHubPushTrigger/config.groovy | 10 ++++++++++ .../cloudbees/jenkins/GitHubPushTrigger/config.jelly | 5 ----- 2 files changed, 10 insertions(+), 5 deletions(-) delete mode 100644 src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config.jelly diff --git a/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config.groovy b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config.groovy index c9a140f5c..4530a6434 100644 --- a/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config.groovy +++ b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config.groovy @@ -2,6 +2,16 @@ package com.cloudbees.jenkins.GitHubPushTrigger import com.cloudbees.jenkins.GitHubPushTrigger +def f = namespace(lib.FormTagLib) + +tr { + td(colspan: 4) { + f.entry(title: _("Ignorable Pusher"), field: "ignorablePusher") { + f.textbox() + } + } +} + tr { td(colspan: 4) { div(id: 'gh-hooks-warn') diff --git a/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config.jelly b/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config.jelly deleted file mode 100644 index 3c058652b..000000000 --- a/src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config.jelly +++ /dev/null @@ -1,5 +0,0 @@ - - - - -