Skip to content

Commit 0d54b11

Browse files
author
Pámer Bálint
committed
Added option to reuse GitSCM's excluded users list
1 parent 7549b07 commit 0d54b11

3 files changed

Lines changed: 177 additions & 13 deletions

File tree

src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
import hudson.model.Item;
1212
import hudson.model.Job;
1313
import hudson.model.Project;
14+
import hudson.plugins.git.GitSCM;
15+
import hudson.plugins.git.extensions.impl.UserExclusion;
16+
import hudson.scm.SCM;
1417
import hudson.triggers.SCMTrigger;
1518
import hudson.triggers.Trigger;
1619
import hudson.triggers.TriggerDescriptor;
@@ -23,6 +26,7 @@
2326
import jenkins.scm.api.SCMEvent;
2427
import jenkins.triggers.SCMTriggerItem;
2528
import jenkins.triggers.SCMTriggerItem.SCMTriggerItems;
29+
2630
import org.apache.commons.jelly.XMLOutput;
2731
import org.jenkinsci.plugins.github.GitHubPlugin;
2832
import org.jenkinsci.plugins.github.admin.GitHubHookRegisterProblemMonitor;
@@ -34,6 +38,7 @@
3438
import org.kohsuke.accmod.restrictions.NoExternalUse;
3539
import org.kohsuke.stapler.AncestorInPath;
3640
import org.kohsuke.stapler.DataBoundConstructor;
41+
import org.kohsuke.stapler.DataBoundSetter;
3742
import org.kohsuke.stapler.Stapler;
3843
import org.slf4j.Logger;
3944
import org.slf4j.LoggerFactory;
@@ -65,6 +70,7 @@
6570
* @author Kohsuke Kawaguchi
6671
*/
6772
public class GitHubPushTrigger extends Trigger<Job<?, ?>> implements GitHubTrigger {
73+
private boolean useGitExcludedUsers;
6874

6975
@DataBoundConstructor
7076
public GitHubPushTrigger() {
@@ -98,6 +104,22 @@ public void onPost(final GitHubTriggerEvent event) {
98104
if (Objects.isNull(job)) {
99105
return; // nothing to do
100106
}
107+
if (useGitExcludedUsers) {
108+
Set<String> excludedUsers = null;
109+
if (job instanceof AbstractProject) {
110+
SCM scm = ((AbstractProject<?, ?>) job).getScm();
111+
if (scm instanceof GitSCM) {
112+
UserExclusion exclusions = ((GitSCM) scm).getExtensions().get(UserExclusion.class);
113+
if (exclusions != null) {
114+
excludedUsers = exclusions.getExcludedUsersNormalized();
115+
}
116+
}
117+
}
118+
119+
if (excludedUsers != null && excludedUsers.contains(event.getTriggeredByUser())) {
120+
return; // user is excluded from triggering build
121+
}
122+
}
101123

102124
Job<?, ?> currentJob = notNull(job, "Job can't be null");
103125

@@ -241,6 +263,15 @@ public DescriptorImpl getDescriptor() {
241263
return (DescriptorImpl) super.getDescriptor();
242264
}
243265

266+
public boolean isUseGitExcludedUsers() {
267+
return useGitExcludedUsers;
268+
}
269+
270+
@DataBoundSetter
271+
public void setUseGitExcludedUsers(Boolean useGitExcludedUsers) {
272+
this.useGitExcludedUsers = useGitExcludedUsers != null ? useGitExcludedUsers : false;
273+
}
274+
244275
/**
245276
* Action object for {@link Project}. Used to display the polling log.
246277
*/

src/main/resources/com/cloudbees/jenkins/GitHubPushTrigger/config.groovy

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package com.cloudbees.jenkins.GitHubPushTrigger
22

33
import com.cloudbees.jenkins.GitHubPushTrigger
44

5+
def f = namespace(lib.FormTagLib);
6+
57
tr {
68
td(colspan: 4) {
79
div(id: 'gh-hooks-warn')
@@ -18,3 +20,7 @@ InlineWarning.setup({
1820
}).start();
1921
""")
2022
}
23+
24+
f.entry() {
25+
f.checkbox(title: _("Use Git excluded user list (\"Polling ignores commits from certain users\")"), field: "useGitExcludedUsers")
26+
}

src/test/java/com/cloudbees/jenkins/GitHubPushTriggerTest.java

Lines changed: 140 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11
package com.cloudbees.jenkins;
22

3-
import hudson.model.FreeStyleProject;
4-
import hudson.plugins.git.GitSCM;
5-
import hudson.plugins.git.util.Build;
6-
import hudson.plugins.git.util.BuildData;
7-
import hudson.util.FormValidation;
3+
import static com.cloudbees.jenkins.GitHubWebHookFullTest.classpath;
4+
import static org.hamcrest.MatcherAssert.assertThat;
5+
import static org.hamcrest.Matchers.is;
6+
import static org.jenkinsci.plugins.github.webhook.subscriber.DefaultPushGHEventListenerTest.TRIGGERED_BY_USER_FROM_RESOURCE;
7+
8+
import java.io.IOException;
9+
import java.lang.reflect.Field;
10+
import java.util.HashMap;
11+
import java.util.concurrent.TimeUnit;
12+
13+
import javax.inject.Inject;
14+
815
import org.eclipse.jgit.lib.ObjectId;
916
import org.jenkinsci.plugins.github.admin.GitHubHookRegisterProblemMonitor;
1017
import org.jenkinsci.plugins.github.webhook.subscriber.DefaultPushGHEventListenerTest;
@@ -16,16 +23,21 @@
1623
import org.junit.Test;
1724
import org.jvnet.hudson.test.Issue;
1825
import org.jvnet.hudson.test.JenkinsRule;
26+
import org.mockito.Mockito;
1927

20-
import javax.inject.Inject;
21-
import java.io.IOException;
22-
import java.util.HashMap;
23-
import java.util.concurrent.TimeUnit;
28+
import com.cloudbees.jenkins.GitHubPushTrigger.DescriptorImpl;
2429

25-
import static com.cloudbees.jenkins.GitHubWebHookFullTest.classpath;
26-
import static org.hamcrest.MatcherAssert.assertThat;
27-
import static org.hamcrest.Matchers.is;
28-
import static org.jenkinsci.plugins.github.webhook.subscriber.DefaultPushGHEventListenerTest.TRIGGERED_BY_USER_FROM_RESOURCE;
30+
import hudson.model.FreeStyleProject;
31+
import hudson.plugins.git.GitSCM;
32+
import hudson.plugins.git.extensions.impl.UserExclusion;
33+
import hudson.plugins.git.util.Build;
34+
import hudson.plugins.git.util.BuildData;
35+
import hudson.util.FormValidation;
36+
import hudson.util.ReflectionUtils;
37+
import hudson.util.SequentialExecutionQueue;
38+
39+
import static org.mockito.Mockito.verify;
40+
import static org.mockito.Mockito.times;
2941

3042
/**
3143
* @author lanwen (Merkushev Kirill)
@@ -96,4 +108,119 @@ public void shouldReturnOkOnNoAnyProblem() throws Exception {
96108
FormValidation validation = descriptor.doCheckHookRegistered(job);
97109
assertThat("all ok", validation.kind, is(FormValidation.Kind.OK));
98110
}
111+
112+
private SequentialExecutionQueue addSpyToQueueField() {
113+
Field queueField = ReflectionUtils.findField(DescriptorImpl.class, "queue");
114+
ReflectionUtils.makeAccessible(queueField);
115+
SequentialExecutionQueue queue = (SequentialExecutionQueue)ReflectionUtils.getField(queueField, descriptor);
116+
SequentialExecutionQueue spiedQueue = Mockito.spy(queue);
117+
ReflectionUtils.setField(queueField, descriptor, spiedQueue);
118+
return spiedQueue;
119+
}
120+
121+
@Test
122+
public void shouldSkipBuildIfExclusionEnabledWithMatchingUser() throws IOException {
123+
SequentialExecutionQueue spiedQueue = addSpyToQueueField();
124+
125+
String matchingUserName = "userName";
126+
FreeStyleProject project = jRule.createFreeStyleProject();
127+
GitHubPushTrigger trigger = new GitHubPushTrigger();
128+
trigger.setUseGitExcludedUsers(true);
129+
trigger.start(project, false);
130+
project.addTrigger(trigger);
131+
GitSCM scm = new GitSCM("https://localhost/dummy.git");
132+
UserExclusion userExclusion = new UserExclusion("something" + System.lineSeparator() +
133+
matchingUserName + System.lineSeparator() +
134+
"somethingElse" + System.lineSeparator());
135+
scm.getExtensions().add(userExclusion);
136+
project.setScm(scm);
137+
138+
GitHubTriggerEvent event = GitHubTriggerEvent.create()
139+
.withTimestamp(System.currentTimeMillis())
140+
.withOrigin("origin")
141+
.withTriggeredByUser(matchingUserName)
142+
.build();
143+
trigger.onPost(event);
144+
145+
verify(spiedQueue, times(0)).execute(Mockito.any(Runnable.class));
146+
}
147+
148+
@Test
149+
public void shouldTriggerBuildIfExclusionEnabledWithNonMatchingUser() throws IOException {
150+
SequentialExecutionQueue spiedQueue = addSpyToQueueField();
151+
152+
FreeStyleProject project = jRule.createFreeStyleProject();
153+
GitHubPushTrigger trigger = new GitHubPushTrigger();
154+
trigger.setUseGitExcludedUsers(true);
155+
trigger.start(project, false);
156+
project.addTrigger(trigger);
157+
GitSCM scm = new GitSCM("https://localhost/dummy.git");
158+
UserExclusion userExclusion = new UserExclusion("something" + System.lineSeparator() +
159+
"nonMatchingUserName" + System.lineSeparator() +
160+
"somethingElse" + System.lineSeparator());
161+
scm.getExtensions().add(userExclusion);
162+
project.setScm(scm);
163+
164+
GitHubTriggerEvent event = GitHubTriggerEvent.create()
165+
.withTimestamp(System.currentTimeMillis())
166+
.withOrigin("origin")
167+
.withTriggeredByUser("userName")
168+
.build();
169+
trigger.onPost(event);
170+
171+
verify(spiedQueue).execute(Mockito.any(Runnable.class));
172+
}
173+
174+
@Test
175+
public void shouldTriggerBuildIfExclusionDisabledWithMatchingUser() throws IOException {
176+
SequentialExecutionQueue spiedQueue = addSpyToQueueField();
177+
178+
String matchingUserName = "userName";
179+
FreeStyleProject project = jRule.createFreeStyleProject();
180+
GitHubPushTrigger trigger = new GitHubPushTrigger();
181+
trigger.setUseGitExcludedUsers(false);
182+
trigger.start(project, false);
183+
project.addTrigger(trigger);
184+
GitSCM scm = new GitSCM("https://localhost/dummy.git");
185+
UserExclusion userExclusion = new UserExclusion("something" + System.lineSeparator() +
186+
matchingUserName + System.lineSeparator() +
187+
"somethingElse" + System.lineSeparator());
188+
scm.getExtensions().add(userExclusion);
189+
project.setScm(scm);
190+
191+
GitHubTriggerEvent event = GitHubTriggerEvent.create()
192+
.withTimestamp(System.currentTimeMillis())
193+
.withOrigin("origin")
194+
.withTriggeredByUser(matchingUserName)
195+
.build();
196+
trigger.onPost(event);
197+
198+
verify(spiedQueue).execute(Mockito.any(Runnable.class));
199+
}
200+
201+
@Test
202+
public void shouldTriggerBuildIfExclusionDisabledWithNonMatchingUser() throws IOException {
203+
SequentialExecutionQueue spiedQueue = addSpyToQueueField();
204+
205+
FreeStyleProject project = jRule.createFreeStyleProject();
206+
GitHubPushTrigger trigger = new GitHubPushTrigger();
207+
trigger.setUseGitExcludedUsers(false);
208+
trigger.start(project, false);
209+
project.addTrigger(trigger);
210+
GitSCM scm = new GitSCM("https://localhost/dummy.git");
211+
UserExclusion userExclusion = new UserExclusion("something" + System.lineSeparator() +
212+
"nonMatchingUserName" + System.lineSeparator() +
213+
"somethingElse" + System.lineSeparator());
214+
scm.getExtensions().add(userExclusion);
215+
project.setScm(scm);
216+
217+
GitHubTriggerEvent event = GitHubTriggerEvent.create()
218+
.withTimestamp(System.currentTimeMillis())
219+
.withOrigin("origin")
220+
.withTriggeredByUser("userName")
221+
.build();
222+
trigger.onPost(event);
223+
224+
verify(spiedQueue).execute(Mockito.any(Runnable.class));
225+
}
99226
}

0 commit comments

Comments
 (0)