Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
f4009b5
specifies an ignorable pusher
Jun 22, 2015
891455a
specifies an ignorable pusher
Jun 22, 2015
f84123f
documents ignorable pusher
Jun 23, 2015
1494279
Merge branch 'stable'
Jun 23, 2015
985cc73
fixes breaking of backward compatibility caused by the implementation…
Jun 23, 2015
be4c874
Merge branch 'stable'
Jun 23, 2015
784abc6
fixes access to ignorable pusher
Jun 23, 2015
f5b2488
Merge branch 'stable'
Jun 23, 2015
0ce901a
fixes needless line deletion
Jun 23, 2015
23abd4a
fixes NPE if regex for ignorable pusher is null
Jun 24, 2015
fa122af
Merge branch 'stable'
Jun 24, 2015
9bcadfa
[maven-release-plugin] prepare for next development iteration
KostyaSha Aug 30, 2015
93cb2f9
don't run cleaner if we don't manage hooks
lanwen Aug 30, 2015
b6e21f1
throw config exception on empty jenkins root url
lanwen Aug 30, 2015
f4f6525
[maven-release-plugin] prepare release github-1.13.1
KostyaSha Aug 30, 2015
2f684d0
[maven-release-plugin] prepare for next development iteration
KostyaSha Aug 30, 2015
f0a971f
check hook url for override before checking jenkins default url
lanwen Aug 31, 2015
c4657a2
[maven-release-plugin] prepare release github-1.13.2
KostyaSha Aug 31, 2015
0dbb10d
[maven-release-plugin] prepare for next development iteration
KostyaSha Aug 31, 2015
73b60b4
fixes typo
Aug 31, 2015
b10ad38
[FIXES JENKINS-30223] return back com.cloudbees.jenkins.Credential
lanwen Aug 31, 2015
28cb051
[maven-release-plugin] prepare release github-1.13.3
lanwen Sep 2, 2015
f4b6e2e
Merge tag 'github-1.13.3' into stable
Sep 9, 2015
7cc6f54
fixes constructor parameter name (@DataBoundConstructor)
Sep 10, 2015
4d7c47f
Merge branch 'stable'
Sep 10, 2015
6763575
Merge remote-tracking branch 'upstream/master'
Sep 10, 2015
6a52fdc
Merge remote-tracking branch 'upstream/master'
Oct 9, 2015
6990b83
Merge remote-tracking branch 'upstream/master'
Oct 16, 2015
082ed8c
fixes SonarQube issues
Oct 16, 2015
72d1013
turns logic of ignoring a pusher to avoid further mocking
Oct 16, 2015
02157bc
Merge remote-tracking branch 'upstream/master'
Oct 22, 2015
0567134
Merge remote-tracking branch 'upstream/master'
Nov 10, 2015
33473e9
Merge remote-tracking branch 'upstream/master'
Dec 18, 2015
57f1f57
Merge remote-tracking branch 'upstream/master'
Dec 21, 2015
28e9481
Merge remote-tracking branch 'upstream/master'
Jan 8, 2016
7a68f89
Merge remote-tracking branch 'upstream/master'
Jan 19, 2016
6f52adc
Merge remote-tracking branch 'upstream/master'
Jan 29, 2016
4fc39e2
merges config.jelly into config.groovy
Feb 10, 2016
e985ff1
Merge remote-tracking branch 'upstream/master'
Feb 24, 2016
ddd4d67
Merge remote-tracking branch 'upstream/master'
Mar 18, 2016
49c1e3a
Merge remote-tracking branch 'upstream/master'
Apr 11, 2016
9802aa1
Merge remote-tracking branch 'upstream/master'
May 2, 2016
07bd103
Merge remote-tracking branch 'upstream/master'
May 17, 2016
79d37a0
Merge remote-tracking branch 'upstream/master'
Jun 27, 2016
b2daf8b
Merge remote-tracking branch 'upstream/master'
Jul 21, 2016
830e436
Merge remote-tracking branch 'upstream/master'
Jul 26, 2016
b1d8812
Merge remote-tracking branch 'upstream/master'
aderigs Aug 21, 2016
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 45 additions & 1 deletion src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
import jenkins.model.Jenkins;
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.admin.GitHubHookRegisterProblemMonitor;
Expand Down Expand Up @@ -56,9 +58,51 @@
* @author Kohsuke Kawaguchi
*/
public class GitHubPushTrigger extends Trigger<Job<?, ?>> implements GitHubTrigger {
private String pushBy;
private final String ignorablePusher;

@DataBoundConstructor
public GitHubPushTrigger(final String ignorablePusher) {
this.ignorablePusher = ignorablePusher;
}

public GitHubPushTrigger() {
this(null);
}

String pushBy() {
return pushBy;
}

/**
* 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.
*/
public String getIgnorablePusher() {
return ignorablePusher;
}

/**
* @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 ignores(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 true;
}
}
}

return false;
}

/**
Expand All @@ -73,7 +117,7 @@ public void onPost() {
* Called when a POST is made.
*/
public void onPost(String triggeredByUser) {
final String pushBy = triggeredByUser;
pushBy = triggeredByUser;
DescriptorImpl d = getDescriptor();
d.checkThreadPoolSizeAndUpdateIfNecessary();
d.queue.execute(new Runnable() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -61,7 +60,7 @@ protected Set<GHEvent> events() {
*/
@Override
protected void onEvent(GHEvent event, String payload) {
JSONObject json = JSONObject.fromObject(payload);
final JSONObject json = JSONObject.fromObject(payload);
String repoUrl = json.getJSONObject("repository").getString("url");
final String pusherName = json.getJSONObject("pusher").getString("name");

Expand All @@ -76,8 +75,8 @@ protected void onEvent(GHEvent event, String payload) {
@Override
public void run() {
for (Job<?, ?> job : Jenkins.getInstance().getAllItems(Job.class)) {
GitHubTrigger trigger = triggerFrom(job, GitHubPushTrigger.class);
if (trigger != null) {
final GitHubPushTrigger trigger = triggerFrom(job, GitHubPushTrigger.class);
if (trigger != null && !trigger.ignores(json)) {
LOGGER.debug("Considering to poke {}", job.getFullDisplayName());
if (GitHubRepositoryNameContributor.parseAssociatedNames(job).contains(changedRepository)) {
LOGGER.info("Poked {}", job.getFullDisplayName());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
github.ignorablePusher=Ignorable pusher
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
github.ignorablePusher=Ignorierbarer Pusher
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<div>
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.
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<div>
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.
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package com.cloudbees.jenkins;

import static java.nio.charset.StandardCharsets.UTF_8;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;

import java.io.IOException;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import org.jenkinsci.plugins.github.GitHubPlugin;
import org.jenkinsci.plugins.github.config.GitHubPluginConfig;
import org.junit.Rule;
import org.junit.Test;
import org.jvnet.hudson.test.JenkinsRule;

import hudson.model.FreeStyleProject;
import hudson.plugins.git.GitSCM;
import hudson.scm.SCM;

/**
* @author <a href = "mailto:achim.derigs@graudata.com">Achim Derigs</a>
*/
public final class GitHubPushTriggerTestCase {

@Rule
public final JenkinsRule jenkins = new JenkinsRule();

private static void triggerWebHook(final String repositoryUrl, final String pusherName) throws IOException {
final GitHubPluginConfig configuration = GitHubPlugin.configuration();
final URL url = configuration.getHookUrl();
final HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("X-GitHub-Event", "push");
connection.setDoOutput(true);
connection.connect();

final String payload = "payload={\"repository\":{\"url\":\"" + repositoryUrl + "\"},\"pusher\":{\"name\":\"" + pusherName + "\",\"email\":\"\"}}";

try (final OutputStream stream = connection.getOutputStream()) {
stream.write(payload.getBytes(UTF_8));
}

assertEquals("fails to connect to " + url, HttpURLConnection.HTTP_OK, connection.getResponseCode());
}

@Test
public void trigger() throws IOException {
final String repositoryUrl = "https://github.com/kohsuke/foo";
final SCM scm = new GitSCM(repositoryUrl);
final FreeStyleProject project = jenkins.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("fails to be triggered by pusher: ", expected, actual);
}

@Test
public void ignore() throws IOException {
final String repositoryUrl = "https://github.com/kohsuke/foo";
final SCM scm = new GitSCM(repositoryUrl);
final FreeStyleProject project = jenkins.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("fails to ignore pusher: ", object);
}
}