diff --git a/README.md b/README.md index 4b6b0e7f2..3a3bf3431 100644 --- a/README.md +++ b/README.md @@ -291,6 +291,7 @@ properties([ branchFilterType: "NameBasedFilter", includeBranchesSpec: "release/qat", excludeBranchesSpec: "", + userNameFilterType: "All", ] ]) ]) @@ -482,7 +483,12 @@ Triggers may be filtered based on the branch name, i.e. the build will only be a **Note:** This functionality requires access to GitLab and a git repository url already saved in the project configuration. In other words, when creating a new project, the configuration needs to be saved *once* before being able to add branch filters. For Pipeline jobs, the configuration must be saved *and* the job must be run once before the list is populated. -### Build when tags are pushed +## User name filtering +Triggers may be filtered based on the user name, i.e. the build will only be allowed for users not listed in excluded user names. On the project configuration page, when you configure the GitLab trigger, you can choose 'Filter users by name'.' Filter by name takes comma-separated lists of user names to exclude from triggering a build. + +**Note:** This functionality requires access to GitLab and a git repository url already saved in the project configuration. In other words, when creating a new project, the configuration needs to be saved *once* before being able to add branch filters. For Pipeline jobs, the configuration must be saved *and* the job must be run once before the list is populated. + +## Build when tags are pushed In order to build when a new tag is pushed: 1. In the GitLab webhook configuration, add 'Tag push events' 2. In the job configuration under 'Source code management': diff --git a/src/main/java/com/dabsquared/gitlabjenkins/GitLabPushTrigger.java b/src/main/java/com/dabsquared/gitlabjenkins/GitLabPushTrigger.java index e9c6eb221..39a755a1b 100644 --- a/src/main/java/com/dabsquared/gitlabjenkins/GitLabPushTrigger.java +++ b/src/main/java/com/dabsquared/gitlabjenkins/GitLabPushTrigger.java @@ -20,6 +20,9 @@ import com.dabsquared.gitlabjenkins.trigger.filter.MergeRequestLabelFilter; import com.dabsquared.gitlabjenkins.trigger.filter.MergeRequestLabelFilterConfig; import com.dabsquared.gitlabjenkins.trigger.filter.MergeRequestLabelFilterFactory; +import com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilter; +import com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilterFactory; +import com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilterType; import com.dabsquared.gitlabjenkins.trigger.handler.merge.MergeRequestHookTriggerHandler; import com.dabsquared.gitlabjenkins.trigger.handler.note.NoteHookTriggerHandler; import com.dabsquared.gitlabjenkins.trigger.handler.pipeline.PipelineHookTriggerHandler; @@ -63,6 +66,7 @@ import java.util.Collection; import static com.dabsquared.gitlabjenkins.trigger.filter.BranchFilterConfig.BranchFilterConfigBuilder.branchFilterConfig; +import static com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilterConfig.UserNameFilterConfigBuilder.userNameFilterConfig; import static com.dabsquared.gitlabjenkins.trigger.handler.merge.MergeRequestHookTriggerHandlerFactory.newMergeRequestHookTriggerHandler; import static com.dabsquared.gitlabjenkins.trigger.handler.note.NoteHookTriggerHandlerFactory.newNoteHookTriggerHandler; import static com.dabsquared.gitlabjenkins.trigger.handler.pipeline.PipelineHookTriggerHandlerFactory.newPipelineHookTriggerHandler; @@ -97,18 +101,23 @@ public class GitLabPushTrigger extends Trigger> implements MergeReques private transient boolean addCiMessage; private transient boolean addVoteOnMergeRequest; private transient boolean allowAllBranches = false; + private transient boolean allowAllUserNames = false; private transient String branchFilterName; private BranchFilterType branchFilterType; + protected final String userNameFilterName; + private UserNameFilterType userNameFilterType; private String includeBranchesSpec; private String excludeBranchesSpec; private String sourceBranchRegex; private String targetBranchRegex; + protected final String excludeUserNamesSpec; private MergeRequestLabelFilterConfig mergeRequestLabelFilterConfig; private volatile Secret secretToken; private String pendingBuildName; private boolean cancelPendingBuildsOnUpdate; private transient BranchFilter branchFilter; + private transient UserNameFilter userNameFilter; private transient PushHookTriggerHandler pushHookTriggerHandler; private transient MergeRequestHookTriggerHandler mergeRequestHookTriggerHandler; private transient NoteHookTriggerHandler noteHookTriggerHandler; @@ -128,7 +137,9 @@ public GitLabPushTrigger(boolean triggerOnPush, boolean triggerToBranchDeleteReq boolean acceptMergeRequestOnSuccess, BranchFilterType branchFilterType, String includeBranchesSpec, String excludeBranchesSpec, String sourceBranchRegex, String targetBranchRegex, MergeRequestLabelFilterConfig mergeRequestLabelFilterConfig, String secretToken, boolean triggerOnPipelineEvent, - boolean triggerOnApprovedMergeRequest, String pendingBuildName, boolean cancelPendingBuildsOnUpdate) { + boolean triggerOnApprovedMergeRequest, String pendingBuildName, boolean cancelPendingBuildsOnUpdate, UserNameFilterType userNameFilterType, + String excludeUserNamesSpec + ) { this.triggerOnPush = triggerOnPush; this.triggerToBranchDeleteRequest = triggerToBranchDeleteRequest; this.triggerOnMergeRequest = triggerOnMergeRequest; @@ -147,10 +158,12 @@ public GitLabPushTrigger(boolean triggerOnPush, boolean triggerToBranchDeleteReq this.addCiMessage = addCiMessage; this.addVoteOnMergeRequest = addVoteOnMergeRequest; this.branchFilterType = branchFilterType; + this.userNameFilterType = userNameFilterType; this.includeBranchesSpec = includeBranchesSpec; this.excludeBranchesSpec = excludeBranchesSpec; this.sourceBranchRegex = sourceBranchRegex; this.targetBranchRegex = targetBranchRegex; + this.excludeUserNamesSpec = excludeUserNamesSpec; this.acceptMergeRequestOnSuccess = acceptMergeRequestOnSuccess; this.mergeRequestLabelFilterConfig = mergeRequestLabelFilterConfig; this.secretToken = Secret.fromString(secretToken); @@ -160,6 +173,7 @@ public GitLabPushTrigger(boolean triggerOnPush, boolean triggerToBranchDeleteReq initializeTriggerHandler(); initializeBranchFilter(); + initializeUserNameFilter(); initializeMergeRequestLabelFilter(); } @@ -286,6 +300,10 @@ public BranchFilterType getBranchFilterType() { return branchFilterType; } + public UserNameFilterType getUserNameFilterType() { + return userNameFilterType; + } + public String getIncludeBranchesSpec() { return includeBranchesSpec; } @@ -302,6 +320,10 @@ public String getTargetBranchRegex() { return targetBranchRegex; } + public String getExcludeUserNamesSpec() { + return excludeUserNamesSpec; + } + public MergeRequestLabelFilterConfig getMergeRequestLabelFilterConfig() { return mergeRequestLabelFilterConfig; } @@ -409,11 +431,21 @@ public void setBranchFilterName(String branchFilterName) { this.branchFilterName = branchFilterName; } + @DataBoundSetter + public void setUserNameFilterName(String userNameFilterName) { + this.userNameFilterName = userNameFilterName; + } + @DataBoundSetter public void setBranchFilterType(BranchFilterType branchFilterType) { this.branchFilterType = branchFilterType; } + @DataBoundSetter + public void setUserNameFilterType(UserNameFilterType userNameFilterType) { + this.userNameFilterType = userNameFilterType; + } + @DataBoundSetter public void setIncludeBranchesSpec(String includeBranchesSpec) { this.includeBranchesSpec = includeBranchesSpec; @@ -424,6 +456,11 @@ public void setExcludeBranchesSpec(String excludeBranchesSpec) { this.excludeBranchesSpec = excludeBranchesSpec; } + @DataBoundSetter + public void setExcludeUserNamesSpec(String excludeUserNamesSpec) { + this.excludeUserNamesSpec = excludeUserNamesSpec; + } + @DataBoundSetter public void setSourceBranchRegex(String sourceBranchRegex) { this.sourceBranchRegex = sourceBranchRegex; @@ -475,7 +512,10 @@ public void onPost(final PushHook hook) { if (pushHookTriggerHandler == null) { initializeTriggerHandler(); } - pushHookTriggerHandler.handle(job, hook, ciSkip, branchFilter, mergeRequestLabelFilter); + if (userNameFilter == null) { + initializeUserNameFilter(); + } + pushHookTriggerHandler.handle(job, hook, ciSkip, branchFilter, mergeRequestLabelFilter, userNameFilter); } // executes when the Trigger receives a merge request @@ -489,7 +529,10 @@ public void onPost(final MergeRequestHook hook) { if (mergeRequestHookTriggerHandler == null) { initializeTriggerHandler(); } - mergeRequestHookTriggerHandler.handle(job, hook, ciSkip, branchFilter, mergeRequestLabelFilter); + if (userNameFilter == null) { + initializeUserNameFilter(); + } + mergeRequestHookTriggerHandler.handle(job, hook, ciSkip, branchFilter, mergeRequestLabelFilter, userNameFilter); } // executes when the Trigger receives a note request @@ -503,7 +546,10 @@ public void onPost(final NoteHook hook) { if (noteHookTriggerHandler == null) { initializeTriggerHandler(); } - noteHookTriggerHandler.handle(job, hook, ciSkip, branchFilter, mergeRequestLabelFilter); + if (userNameFilter == null) { + initializeUserNameFilter(); + } + noteHookTriggerHandler.handle(job, hook, ciSkip, branchFilter, mergeRequestLabelFilter, userNameFilter); } // executes when the Trigger receives a pipeline event @@ -514,7 +560,10 @@ public void onPost(final PipelineHook hook) { if (pipelineTriggerHandler == null) { initializeTriggerHandler(); } - pipelineTriggerHandler.handle(job, hook, ciSkip, branchFilter, mergeRequestLabelFilter); + if (userNameFilter == null) { + initializeUserNameFilter(); + } + pipelineTriggerHandler.handle(job, hook, ciSkip, branchFilter, mergeRequestLabelFilter, userNameFilter); } private void initializeTriggerHandler() { @@ -537,13 +586,24 @@ private void initializeMergeRequestLabelFilter() { mergeRequestLabelFilter = MergeRequestLabelFilterFactory.newMergeRequestLabelFilter(mergeRequestLabelFilterConfig); } + private void initializeUserNameFilter() { + userNameFilter = UserNameFilterFactory.newUserNameFilter(userNameFilterConfig() + .withExcludeUserNamesSpec(excludeUserNamesSpec) + .build(userNameFilterType) + ); + } + @Override protected Object readResolve() throws ObjectStreamException { if (branchFilterType == null) { branchFilterType = StringUtils.isNotBlank(branchFilterName) ? BranchFilterType.valueOf(branchFilterName) : BranchFilterType.All; } + if (userNameFilterType == null) { + userNameFilterType = StringUtils.isNotBlank(userNameFilterName) ? UserNameFilterType.valueOf(userNameFilterName) : UserNameFilterType.All; + } initializeTriggerHandler(); initializeBranchFilter(); + initializeUserNameFilter(); initializeMergeRequestLabelFilter(); return super.readResolve(); } @@ -642,7 +702,6 @@ public AutoCompletionCandidates doAutoCompleteIncludeBranchesSpec(@AncestorInPat public AutoCompletionCandidates doAutoCompleteExcludeBranchesSpec(@AncestorInPath final Job job, @QueryParameter final String value) { return ProjectBranchesProvider.instance().doAutoCompleteBranchesSpec(job, value); } - public FormValidation doCheckIncludeBranchesSpec(@AncestorInPath final Job project, @QueryParameter final String value) { return ProjectBranchesProvider.instance().doCheckBranchesSpec(project, value); } diff --git a/src/main/java/com/dabsquared/gitlabjenkins/trigger/filter/AllUserNamesFilter.java b/src/main/java/com/dabsquared/gitlabjenkins/trigger/filter/AllUserNamesFilter.java new file mode 100644 index 000000000..cc2c6d5ad --- /dev/null +++ b/src/main/java/com/dabsquared/gitlabjenkins/trigger/filter/AllUserNamesFilter.java @@ -0,0 +1,11 @@ +package com.dabsquared.gitlabjenkins.trigger.filter; + +/** + * @author Robin Müller + */ +class AllUserNamesFilter implements UserNameFilter { + @Override + public boolean isUserNameAllowed(String userName) { + return true; + } +} diff --git a/src/main/java/com/dabsquared/gitlabjenkins/trigger/filter/UserNameBasedFilter.java b/src/main/java/com/dabsquared/gitlabjenkins/trigger/filter/UserNameBasedFilter.java new file mode 100644 index 000000000..def89cd9b --- /dev/null +++ b/src/main/java/com/dabsquared/gitlabjenkins/trigger/filter/UserNameBasedFilter.java @@ -0,0 +1,58 @@ +package com.dabsquared.gitlabjenkins.trigger.filter; + +import com.google.common.base.Splitter; +import org.springframework.util.AntPathMatcher; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + + + +/** + * @author jean flores + */ +class UserNameBasedFilter implements UserNameFilter { + private static final Logger LOGGER = Logger.getLogger(UserNameBasedFilter.class.getName()); + + + private final List excludedUserNames; + + public UserNameBasedFilter(String excludedUserNames) { + this.excludedUserNames = convert(excludedUserNames); + } + @Override + public boolean isUserNameAllowed(String userName) { + return hasNoUserNameSpecs() || isUserNameNotExcluded(userName); + } + + private boolean hasNoUserNameSpecs() { + return excludedUserNames.isEmpty(); + } + + private boolean isUserNameNotExcluded(String userName) { + AntPathMatcher matcher = new AntPathMatcher(); + for (String excludePattern : excludedUserNames) { + LOGGER.log(Level.INFO, "excludedUserNames"); + LOGGER.log(Level.INFO, excludePattern); + LOGGER.log(Level.INFO, userName); + if (matcher.match(excludePattern, userName)) { + return false; + } + } + return true; + } + + private List convert(String commaSeparatedString) { + if (commaSeparatedString == null) + return Collections.EMPTY_LIST; + + ArrayList result = new ArrayList<>(); + for (String s : Splitter.on(',').omitEmptyStrings().trimResults().split(commaSeparatedString)) { + result.add(s); + } + return result; + } +} diff --git a/src/main/java/com/dabsquared/gitlabjenkins/trigger/filter/UserNameFilter.java b/src/main/java/com/dabsquared/gitlabjenkins/trigger/filter/UserNameFilter.java new file mode 100644 index 000000000..0899f3000 --- /dev/null +++ b/src/main/java/com/dabsquared/gitlabjenkins/trigger/filter/UserNameFilter.java @@ -0,0 +1,9 @@ +package com.dabsquared.gitlabjenkins.trigger.filter; + +/** + * @author Robin Müller + */ +public interface UserNameFilter { + + boolean isUserNameAllowed(String userName); +} diff --git a/src/main/java/com/dabsquared/gitlabjenkins/trigger/filter/UserNameFilterConfig.java b/src/main/java/com/dabsquared/gitlabjenkins/trigger/filter/UserNameFilterConfig.java new file mode 100644 index 000000000..d60c44ae7 --- /dev/null +++ b/src/main/java/com/dabsquared/gitlabjenkins/trigger/filter/UserNameFilterConfig.java @@ -0,0 +1,40 @@ +package com.dabsquared.gitlabjenkins.trigger.filter; + +/** + * @author jean flores + */ +public final class UserNameFilterConfig { + + private final UserNameFilterType type; + private final String excludeUserNamesSpec; + + private UserNameFilterConfig(UserNameFilterType type, String excludeUserNamesSpec) { + this.type = type; + this.excludeUserNamesSpec = excludeUserNamesSpec; + } + + public UserNameFilterType getType() { + return type; + } + + String getExcludeUserNamesSpec() { + return excludeUserNamesSpec; + } + + public static class UserNameFilterConfigBuilder { + private String excludeUserNamesSpec; + + public static UserNameFilterConfigBuilder userNameFilterConfig() { + return new UserNameFilterConfigBuilder(); + } + + public UserNameFilterConfigBuilder withExcludeUserNamesSpec(String excludeUserNamesSpec) { + this.excludeUserNamesSpec = excludeUserNamesSpec; + return this; + } + + public UserNameFilterConfig build(UserNameFilterType type) { + return new UserNameFilterConfig(type, excludeUserNamesSpec); + } + } +} diff --git a/src/main/java/com/dabsquared/gitlabjenkins/trigger/filter/UserNameFilterFactory.java b/src/main/java/com/dabsquared/gitlabjenkins/trigger/filter/UserNameFilterFactory.java new file mode 100644 index 000000000..d8e1467b4 --- /dev/null +++ b/src/main/java/com/dabsquared/gitlabjenkins/trigger/filter/UserNameFilterFactory.java @@ -0,0 +1,22 @@ +package com.dabsquared.gitlabjenkins.trigger.filter; + +/** + * @author jean flores + */ +public final class UserNameFilterFactory { + + private UserNameFilterFactory() { } + + public static UserNameFilter newUserNameFilter(UserNameFilterConfig config) { + + if(config == null) + return new AllUserNamesFilter(); + + switch (config.getType()) { + case NameBasedFilter: + return new UserNameBasedFilter(config.getExcludeUserNamesSpec()); + default: + return new AllUserNamesFilter(); + } + } +} diff --git a/src/main/java/com/dabsquared/gitlabjenkins/trigger/filter/UserNameFilterType.java b/src/main/java/com/dabsquared/gitlabjenkins/trigger/filter/UserNameFilterType.java new file mode 100644 index 000000000..afc989f06 --- /dev/null +++ b/src/main/java/com/dabsquared/gitlabjenkins/trigger/filter/UserNameFilterType.java @@ -0,0 +1,9 @@ +package com.dabsquared.gitlabjenkins.trigger.filter; + +/** + * @author jean flores + */ +public enum UserNameFilterType { + All, + NameBasedFilter +} diff --git a/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/AbstractWebHookTriggerHandler.java b/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/AbstractWebHookTriggerHandler.java index c8a3aa604..db94d7cd9 100644 --- a/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/AbstractWebHookTriggerHandler.java +++ b/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/AbstractWebHookTriggerHandler.java @@ -9,6 +9,7 @@ import com.dabsquared.gitlabjenkins.trigger.exception.NoRevisionToBuildException; import com.dabsquared.gitlabjenkins.trigger.filter.BranchFilter; import com.dabsquared.gitlabjenkins.trigger.filter.MergeRequestLabelFilter; +import com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilter; import com.dabsquared.gitlabjenkins.util.LoggerUtil; import hudson.model.Action; import hudson.model.CauseAction; @@ -39,7 +40,7 @@ public abstract class AbstractWebHookTriggerHandler implement protected PendingBuildsHandler pendingBuildsHandler = new PendingBuildsHandler(); @Override - public void handle(Job job, H hook, boolean ciSkip, BranchFilter branchFilter, MergeRequestLabelFilter mergeRequestLabelFilter) { + public void handle(Job job, H hook, boolean ciSkip, BranchFilter branchFilter, MergeRequestLabelFilter mergeRequestLabelFilter, UserNameFilter userNameFilter) { if (ciSkip && isCiSkip(hook)) { LOGGER.log(Level.INFO, "Skipping due to ci-skip."); return; @@ -47,15 +48,20 @@ public void handle(Job job, H hook, boolean ciSkip, BranchFilter branchFil String sourceBranch = getSourceBranch(hook); String targetBranch = getTargetBranch(hook); - if (branchFilter.isBranchAllowed(sourceBranch, targetBranch)) { - LOGGER.log(Level.INFO, "{0} triggered for {1}.", LoggerUtil.toArray(job.getFullName(), getTriggerType())); - cancelPendingBuildsIfNecessary(job, hook); - setCommitStatusPendingIfNecessary(job, hook); - scheduleBuild(job, createActions(job, hook)); + String userName = getUserName(hook); + if (userNameFilter.isUserNameAllowed(userName)) { + if (branchFilter.isBranchAllowed(sourceBranch, targetBranch) && userNameFilter.isUserNameAllowed(userName)) { + LOGGER.log(Level.INFO, "{0} triggered for {1}.", LoggerUtil.toArray(job.getFullName(), getTriggerType())); + cancelPendingBuildsIfNecessary(job, hook); + setCommitStatusPendingIfNecessary(job, hook); + scheduleBuild(job, createActions(job, hook)); + } else { + LOGGER.log(Level.INFO, "Source branch {0} or target branch {1} is not allowed", new Object[]{sourceBranch, targetBranch}); + } } else { - LOGGER.log(Level.INFO, "Source branch {0} or target branch {1} is not allowed", new Object[]{sourceBranch, targetBranch}); + LOGGER.log(Level.INFO, "UserName {0} is not allowed", new Object[]{userName}); } - } + } protected abstract String getTriggerType(); @@ -103,6 +109,8 @@ protected void cancelPendingBuildsIfNecessary(Job job, H hook) {} protected abstract String getTargetBranch(H hook); + protected abstract String getUserName(H hook); + protected abstract RevisionParameterAction createRevisionParameter(H hook, GitSCM gitSCM) throws NoRevisionToBuildException; protected abstract BuildStatusUpdate retrieveBuildStatusUpdate(H hook); diff --git a/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/WebHookTriggerHandler.java b/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/WebHookTriggerHandler.java index a87a3e506..2fa94c6c7 100644 --- a/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/WebHookTriggerHandler.java +++ b/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/WebHookTriggerHandler.java @@ -3,6 +3,7 @@ import com.dabsquared.gitlabjenkins.gitlab.hook.model.WebHook; import com.dabsquared.gitlabjenkins.trigger.filter.BranchFilter; import com.dabsquared.gitlabjenkins.trigger.filter.MergeRequestLabelFilter; +import com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilter; import hudson.model.Job; /** @@ -10,5 +11,5 @@ */ public interface WebHookTriggerHandler { - void handle(Job job, H hook, boolean ciSkip, BranchFilter branchFilter, MergeRequestLabelFilter mergeRequestLabelFilter); + void handle(Job job, H hook, boolean ciSkip, BranchFilter branchFilter, MergeRequestLabelFilter mergeRequestLabelFilter, UserNameFilter userNameFilter); } diff --git a/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/merge/MergeRequestHookTriggerHandlerImpl.java b/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/merge/MergeRequestHookTriggerHandlerImpl.java index 19ce4fcc6..62b19f1d2 100644 --- a/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/merge/MergeRequestHookTriggerHandlerImpl.java +++ b/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/merge/MergeRequestHookTriggerHandlerImpl.java @@ -6,6 +6,7 @@ import com.dabsquared.gitlabjenkins.trigger.exception.NoRevisionToBuildException; import com.dabsquared.gitlabjenkins.trigger.filter.BranchFilter; import com.dabsquared.gitlabjenkins.trigger.filter.MergeRequestLabelFilter; +import com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilter; import com.dabsquared.gitlabjenkins.trigger.handler.AbstractWebHookTriggerHandler; import com.dabsquared.gitlabjenkins.util.BuildUtil; import com.dabsquared.gitlabjenkins.trigger.handler.PendingBuildsHandler; @@ -70,7 +71,7 @@ class MergeRequestHookTriggerHandlerImpl extends AbstractWebHookTriggerHandler job, MergeRequestHook hook, boolean ciSkip, BranchFilter branchFilter, MergeRequestLabelFilter mergeRequestLabelFilter) { + public void handle(Job job, MergeRequestHook hook, boolean ciSkip, BranchFilter branchFilter, MergeRequestLabelFilter mergeRequestLabelFilter, UserNameFilter userNameFilter) { if (isExecutable(job, hook)) { List labelsNames = new ArrayList<>(); if (hook.getLabels() != null) { @@ -80,7 +81,7 @@ public void handle(Job job, MergeRequestHook hook, boolean ciSkip, BranchF } if (mergeRequestLabelFilter.isMergeRequestAllowed(labelsNames)) { - super.handle(job, hook, ciSkip, branchFilter, mergeRequestLabelFilter); + super.handle(job, hook, ciSkip, branchFilter, mergeRequestLabelFilter, userNameFilter); } } } @@ -153,6 +154,11 @@ protected String getTargetBranch(MergeRequestHook hook) { return hook.getObjectAttributes() == null ? null : hook.getObjectAttributes().getTargetBranch(); } + @Override + protected String getUserName(MergeRequestHook hook) { + return hook.getUser() == null ? null : hook.getUser().getUsername(); + } + @Override protected String getTriggerType() { return "merge request"; diff --git a/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/merge/NopMergeRequestHookTriggerHandler.java b/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/merge/NopMergeRequestHookTriggerHandler.java index 1daaf6805..0798dc8c0 100644 --- a/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/merge/NopMergeRequestHookTriggerHandler.java +++ b/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/merge/NopMergeRequestHookTriggerHandler.java @@ -3,6 +3,7 @@ import com.dabsquared.gitlabjenkins.gitlab.hook.model.MergeRequestHook; import com.dabsquared.gitlabjenkins.trigger.filter.BranchFilter; import com.dabsquared.gitlabjenkins.trigger.filter.MergeRequestLabelFilter; +import com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilter; import hudson.model.Job; /** @@ -10,7 +11,7 @@ */ class NopMergeRequestHookTriggerHandler implements MergeRequestHookTriggerHandler { @Override - public void handle(Job job, MergeRequestHook hook, boolean ciSkip, BranchFilter branchFilter, MergeRequestLabelFilter mergeRequestLabelFilter) { + public void handle(Job job, MergeRequestHook hook, boolean ciSkip, BranchFilter branchFilter, MergeRequestLabelFilter mergeRequestLabelFilter, UserNameFilter userNameFilter) { // nothing to do } } diff --git a/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/note/NopNoteHookTriggerHandler.java b/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/note/NopNoteHookTriggerHandler.java index e8d09b35b..0bae7437b 100644 --- a/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/note/NopNoteHookTriggerHandler.java +++ b/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/note/NopNoteHookTriggerHandler.java @@ -3,6 +3,7 @@ import com.dabsquared.gitlabjenkins.gitlab.hook.model.NoteHook; import com.dabsquared.gitlabjenkins.trigger.filter.BranchFilter; import com.dabsquared.gitlabjenkins.trigger.filter.MergeRequestLabelFilter; +import com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilter; import hudson.model.Job; /** @@ -10,7 +11,7 @@ */ class NopNoteHookTriggerHandler implements NoteHookTriggerHandler { @Override - public void handle(Job job, NoteHook hook, boolean ciSkip, BranchFilter branchFilter, MergeRequestLabelFilter mergeRequestLabelFilter) { + public void handle(Job job, NoteHook hook, boolean ciSkip, BranchFilter branchFilter, MergeRequestLabelFilter mergeRequestLabelFilter, UserNameFilter userNameFilter) { // nothing to do } } diff --git a/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/note/NoteHookTriggerHandlerImpl.java b/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/note/NoteHookTriggerHandlerImpl.java index 5c4345415..e993c25ad 100644 --- a/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/note/NoteHookTriggerHandlerImpl.java +++ b/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/note/NoteHookTriggerHandlerImpl.java @@ -5,6 +5,7 @@ import com.dabsquared.gitlabjenkins.trigger.exception.NoRevisionToBuildException; import com.dabsquared.gitlabjenkins.trigger.filter.BranchFilter; import com.dabsquared.gitlabjenkins.trigger.filter.MergeRequestLabelFilter; +import com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilter; import com.dabsquared.gitlabjenkins.trigger.handler.AbstractWebHookTriggerHandler; import hudson.model.Job; import hudson.plugins.git.GitSCM; @@ -31,9 +32,9 @@ class NoteHookTriggerHandlerImpl extends AbstractWebHookTriggerHandler } @Override - public void handle(Job job, NoteHook hook, boolean ciSkip, BranchFilter branchFilter, MergeRequestLabelFilter mergeRequestLabelFilter) { + public void handle(Job job, NoteHook hook, boolean ciSkip, BranchFilter branchFilter, MergeRequestLabelFilter mergeRequestLabelFilter, UserNameFilter userNameFilter) { if (isValidTriggerPhrase(hook.getObjectAttributes().getNote())) { - super.handle(job, hook, ciSkip, branchFilter, mergeRequestLabelFilter); + super.handle(job, hook, ciSkip, branchFilter, mergeRequestLabelFilter, userNameFilter); } } @@ -54,6 +55,11 @@ protected String getTargetBranch(NoteHook hook) { return hook.getMergeRequest() == null ? null : hook.getMergeRequest().getTargetBranch(); } + @Override + protected String getUserName(NoteHook hook) { + return hook.getUser() == null ? null : hook.getUser().getUsername(); + } + @Override protected String getTriggerType() { return "note"; diff --git a/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/pipeline/NopPipelineHookTriggerHandler.java b/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/pipeline/NopPipelineHookTriggerHandler.java index f6792f0e4..96aab7747 100644 --- a/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/pipeline/NopPipelineHookTriggerHandler.java +++ b/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/pipeline/NopPipelineHookTriggerHandler.java @@ -4,6 +4,7 @@ import com.dabsquared.gitlabjenkins.gitlab.hook.model.PushHook; import com.dabsquared.gitlabjenkins.trigger.filter.BranchFilter; import com.dabsquared.gitlabjenkins.trigger.filter.MergeRequestLabelFilter; +import com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilter; import com.dabsquared.gitlabjenkins.trigger.handler.push.PushHookTriggerHandler; import hudson.model.Job; @@ -13,7 +14,7 @@ class NopPipelineHookTriggerHandler implements PipelineHookTriggerHandler { @Override - public void handle(Job job, PipelineHook hook, boolean ciSkip, BranchFilter branchFilter, MergeRequestLabelFilter mergeRequestLabelFilter) { + public void handle(Job job, PipelineHook hook, boolean ciSkip, BranchFilter branchFilter, MergeRequestLabelFilter mergeRequestLabelFilter, UserNameFilter userNameFilter) { } } diff --git a/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/pipeline/PipelineHookTriggerHandlerImpl.java b/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/pipeline/PipelineHookTriggerHandlerImpl.java index 1da1e053b..e870db4f9 100644 --- a/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/pipeline/PipelineHookTriggerHandlerImpl.java +++ b/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/pipeline/PipelineHookTriggerHandlerImpl.java @@ -9,6 +9,7 @@ import com.dabsquared.gitlabjenkins.trigger.exception.NoRevisionToBuildException; import com.dabsquared.gitlabjenkins.trigger.filter.BranchFilter; import com.dabsquared.gitlabjenkins.trigger.filter.MergeRequestLabelFilter; +import com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilter; import com.dabsquared.gitlabjenkins.trigger.handler.AbstractWebHookTriggerHandler; import com.dabsquared.gitlabjenkins.util.BuildUtil; import com.dabsquared.gitlabjenkins.util.LoggerUtil; @@ -40,7 +41,7 @@ class PipelineHookTriggerHandlerImpl extends AbstractWebHookTriggerHandler job, PipelineHook hook, boolean ciSkip, BranchFilter branchFilter, MergeRequestLabelFilter mergeRequestLabelFilter) { + public void handle(Job job, PipelineHook hook, boolean ciSkip, BranchFilter branchFilter, MergeRequestLabelFilter mergeRequestLabelFilter, UserNameFilter userNameFilter) { PipelineEventObjectAttributes objectAttributes = hook.getObjectAttributes(); try { if (job instanceof AbstractProject) { @@ -64,14 +65,19 @@ public void handle(Job job, PipelineHook hook, boolean ciSkip, BranchFilte //in case of pipeline events that could lead to a deadlock String sourceBranch = getSourceBranch(hook); String targetBranch = getTargetBranch(hook); - if (branchFilter.isBranchAllowed(sourceBranch, targetBranch)) { - LOGGER.log(Level.INFO, "{0} triggered for {1}.", LoggerUtil.toArray(job.getFullName(), getTriggerType())); + String userName = getUserName(hook); - super.scheduleBuild(job, createActions(job, hook)); + if (userNameFilter.isUserNameAllowed(userName)) { + if (branchFilter.isBranchAllowed(sourceBranch, targetBranch)) { + LOGGER.log(Level.INFO, "{0} triggered for {1}.", LoggerUtil.toArray(job.getFullName(), getTriggerType())); + + super.scheduleBuild(job, createActions(job, hook)); + } else { + LOGGER.log(Level.INFO, "branch {0} is not allowed", sourceBranch + " or " + targetBranch); + } } else { - LOGGER.log(Level.INFO, "branch {0} is not allowed", sourceBranch + " or " + targetBranch); + LOGGER.log(Level.INFO, "userName {0} is not allowed", userName); } - } } @@ -91,6 +97,11 @@ protected String getTargetBranch(PipelineHook hook) { return hook.getObjectAttributes().getRef() == null ? null : hook.getObjectAttributes().getRef().replaceFirst("^refs/heads/", ""); } + @Override + protected String getUserName(PipelineHook hook) { + return hook.getUser().getUsername(); + } + @Override protected String getTriggerType() { return "pipeline event"; diff --git a/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/push/NopPushHookTriggerHandler.java b/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/push/NopPushHookTriggerHandler.java index 9238ba16a..85fb00368 100644 --- a/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/push/NopPushHookTriggerHandler.java +++ b/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/push/NopPushHookTriggerHandler.java @@ -3,6 +3,7 @@ import com.dabsquared.gitlabjenkins.gitlab.hook.model.PushHook; import com.dabsquared.gitlabjenkins.trigger.filter.BranchFilter; import com.dabsquared.gitlabjenkins.trigger.filter.MergeRequestLabelFilter; +import com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilter; import hudson.model.Job; /** @@ -10,7 +11,7 @@ */ class NopPushHookTriggerHandler implements PushHookTriggerHandler { @Override - public void handle(Job job, PushHook hook, boolean ciSkip, BranchFilter branchFilter, MergeRequestLabelFilter mergeRequestLabelFilter) { + public void handle(Job job, PushHook hook, boolean ciSkip, BranchFilter branchFilter, MergeRequestLabelFilter mergeRequestLabelFilter, UserNameFilter userNameFilter) { // nothing to do } } diff --git a/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/push/OpenMergeRequestPushHookTriggerHandler.java b/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/push/OpenMergeRequestPushHookTriggerHandler.java index 1d4154272..3aa14ff5d 100644 --- a/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/push/OpenMergeRequestPushHookTriggerHandler.java +++ b/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/push/OpenMergeRequestPushHookTriggerHandler.java @@ -14,6 +14,7 @@ import com.dabsquared.gitlabjenkins.gitlab.hook.model.State; import com.dabsquared.gitlabjenkins.trigger.filter.BranchFilter; import com.dabsquared.gitlabjenkins.trigger.filter.MergeRequestLabelFilter; +import com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilter; import com.dabsquared.gitlabjenkins.util.LoggerUtil; import com.dabsquared.gitlabjenkins.trigger.handler.PendingBuildsHandler; import hudson.model.Action; @@ -54,7 +55,7 @@ class OpenMergeRequestPushHookTriggerHandler implements PushHookTriggerHandler { } @Override - public void handle(Job job, PushHook hook, boolean ciSkip, BranchFilter branchFilter, MergeRequestLabelFilter mergeRequestLabelFilter) { + public void handle(Job job, PushHook hook, boolean ciSkip, BranchFilter branchFilter, MergeRequestLabelFilter mergeRequestLabelFilter, UserNameFilter userNameFilter) { try { if (job instanceof ParameterizedJobMixIn.ParameterizedJob) { ParameterizedJob project = (ParameterizedJobMixIn.ParameterizedJob) job; @@ -64,11 +65,11 @@ public void handle(Job job, PushHook hook, boolean ciSkip, BranchFilter br if (t instanceof GitLabPushTrigger) { final GitLabPushTrigger trigger = (GitLabPushTrigger) t; Integer projectId = hook.getProjectId(); - if (property != null && property.getClient() != null && projectId != null && trigger != null) { + if (property != null && property.getClient() != null && projectId != null) { GitLabClient client = property.getClient(); for (MergeRequest mergeRequest : getOpenMergeRequests(client, projectId.toString())) { if (mergeRequestLabelFilter.isMergeRequestAllowed(mergeRequest.getLabels())) { - handleMergeRequest(job, hook, ciSkip, branchFilter, client, mergeRequest); + handleMergeRequest(job, hook, ciSkip, branchFilter, client, mergeRequest, userNameFilter); } } } @@ -94,7 +95,7 @@ private List getOpenMergeRequests(GitLabClient client, String proj return result; } - private void handleMergeRequest(Job job, PushHook hook, boolean ciSkip, BranchFilter branchFilter, GitLabClient client, MergeRequest mergeRequest) { + private void handleMergeRequest(Job job, PushHook hook, boolean ciSkip, BranchFilter branchFilter, GitLabClient client, MergeRequest mergeRequest, UserNameFilter userNameFilter) { if (ciSkip && mergeRequest.getDescription() != null && mergeRequest.getDescription().contains("[ci-skip]")) { LOGGER.log(Level.INFO, "Skipping MR " + mergeRequest.getTitle() + " due to ci-skip."); return; @@ -108,7 +109,8 @@ private void handleMergeRequest(Job job, PushHook hook, boolean ciSkip, Br String sourceBranch = mergeRequest.getSourceBranch(); String targetBranch = mergeRequest.getTargetBranch(); - if (targetBranch != null && branchFilter.isBranchAllowed(sourceBranch, targetBranch) && hook.getRef().equals("refs/heads/"+targetBranch) && sourceBranch != null) { + String userName = mergeRequest.getAuthor().getUsername(); + if (targetBranch != null && branchFilter.isBranchAllowed(sourceBranch, targetBranch) && hook.getRef().equals("refs/heads/"+targetBranch) && sourceBranch != null && userNameFilter.isUserNameAllowed(userName)) { LOGGER.log(Level.INFO, "{0} triggered for push to target branch of open merge request #{1}.", LoggerUtil.toArray(job.getFullName(), mergeRequest.getId())); diff --git a/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/push/PushHookTriggerHandlerImpl.java b/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/push/PushHookTriggerHandlerImpl.java index ddeed0136..e7825315c 100644 --- a/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/push/PushHookTriggerHandlerImpl.java +++ b/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/push/PushHookTriggerHandlerImpl.java @@ -6,6 +6,7 @@ import com.dabsquared.gitlabjenkins.trigger.exception.NoRevisionToBuildException; import com.dabsquared.gitlabjenkins.trigger.filter.BranchFilter; import com.dabsquared.gitlabjenkins.trigger.filter.MergeRequestLabelFilter; +import com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilter; import com.dabsquared.gitlabjenkins.trigger.handler.AbstractWebHookTriggerHandler; import hudson.model.Job; import hudson.plugins.git.GitSCM; @@ -24,7 +25,7 @@ class PushHookTriggerHandlerImpl extends AbstractWebHookTriggerHandler private static final String NO_COMMIT = "0000000000000000000000000000000000000000"; private boolean triggerToBranchDeleteRequest = false; - + public PushHookTriggerHandlerImpl(boolean triggerToBranchDeleteRequest) { @@ -32,9 +33,9 @@ public PushHookTriggerHandlerImpl(boolean triggerToBranchDeleteRequest) } @Override - public void handle(Job job, PushHook hook, boolean ciSkip, BranchFilter branchFilter, MergeRequestLabelFilter mergeRequestLabelFilter) { + public void handle(Job job, PushHook hook, boolean ciSkip, BranchFilter branchFilter, MergeRequestLabelFilter mergeRequestLabelFilter, UserNameFilter userNameFilter) { if (isNoRemoveBranchPush(hook) || this.triggerToBranchDeleteRequest ) { - super.handle(job, hook, ciSkip, branchFilter, mergeRequestLabelFilter); + super.handle(job, hook, ciSkip, branchFilter, mergeRequestLabelFilter, userNameFilter); } } @@ -96,6 +97,11 @@ protected String getTargetBranch(PushHook hook) { return hook.getRef() == null ? null : hook.getRef().replaceFirst("^refs/heads/", ""); } + @Override + protected String getUserName(PushHook hook) { + return hook.getUserName(); + } + @Override protected String getTriggerType() { return "push"; diff --git a/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/push/PushHookTriggerHandlerList.java b/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/push/PushHookTriggerHandlerList.java index 290daf464..44772b448 100644 --- a/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/push/PushHookTriggerHandlerList.java +++ b/src/main/java/com/dabsquared/gitlabjenkins/trigger/handler/push/PushHookTriggerHandlerList.java @@ -3,6 +3,7 @@ import com.dabsquared.gitlabjenkins.gitlab.hook.model.PushHook; import com.dabsquared.gitlabjenkins.trigger.filter.BranchFilter; import com.dabsquared.gitlabjenkins.trigger.filter.MergeRequestLabelFilter; +import com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilter; import hudson.model.Job; import java.util.List; @@ -19,9 +20,9 @@ class PushHookTriggerHandlerList implements PushHookTriggerHandler { } @Override - public void handle(Job job, PushHook hook, boolean ciSkip, BranchFilter branchFilter, MergeRequestLabelFilter mergeRequestLabelFilter) { + public void handle(Job job, PushHook hook, boolean ciSkip, BranchFilter branchFilter, MergeRequestLabelFilter mergeRequestLabelFilter, UserNameFilter userNameFilter) { for (PushHookTriggerHandler handler : handlers) { - handler.handle(job, hook, ciSkip, branchFilter, mergeRequestLabelFilter); + handler.handle(job, hook, ciSkip, branchFilter, mergeRequestLabelFilter, userNameFilter); } } } diff --git a/src/main/resources/com/dabsquared/gitlabjenkins/GitLabPushTrigger/config.jelly b/src/main/resources/com/dabsquared/gitlabjenkins/GitLabPushTrigger/config.jelly index 7360ff473..0d969249b 100644 --- a/src/main/resources/com/dabsquared/gitlabjenkins/GitLabPushTrigger/config.jelly +++ b/src/main/resources/com/dabsquared/gitlabjenkins/GitLabPushTrigger/config.jelly @@ -118,6 +118,23 @@ + + + + + + + + + + + + + diff --git a/src/main/webapp/help/help-excludedUsers.html b/src/main/webapp/help/help-excludedUsers.html new file mode 100644 index 000000000..4fb9eac27 --- /dev/null +++ b/src/main/webapp/help/help-excludedUsers.html @@ -0,0 +1,4 @@ +

+ Comma-separated list of source users which are not allowed to trigger a build from a Push event or a Merge Request event. + If this field is left empty, all users are allowed to trigger this job. +

diff --git a/src/main/webapp/help/help-noUserNameFiltering.html b/src/main/webapp/help/help-noUserNameFiltering.html new file mode 100644 index 000000000..b7e3c9fd6 --- /dev/null +++ b/src/main/webapp/help/help-noUserNameFiltering.html @@ -0,0 +1,3 @@ +
+

All users are allowed to trigger this job.

+
diff --git a/src/test/java/com/dabsquared/gitlabjenkins/testing/integration/GitLabIT.java b/src/test/java/com/dabsquared/gitlabjenkins/testing/integration/GitLabIT.java index f43119968..af5206f16 100644 --- a/src/test/java/com/dabsquared/gitlabjenkins/testing/integration/GitLabIT.java +++ b/src/test/java/com/dabsquared/gitlabjenkins/testing/integration/GitLabIT.java @@ -7,6 +7,7 @@ import com.dabsquared.gitlabjenkins.publisher.GitLabCommitStatusPublisher; import com.dabsquared.gitlabjenkins.testing.gitlab.rule.GitLabRule; import com.dabsquared.gitlabjenkins.trigger.filter.BranchFilterType; +import com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilterType; import hudson.Launcher; import hudson.model.AbstractBuild; import hudson.model.BuildListener; @@ -68,7 +69,7 @@ public class GitLabIT { public void buildOnPush() throws IOException, InterruptedException, GitAPIException { final OneShotEvent buildTriggered = new OneShotEvent(); FreeStyleProject project = jenkins.createFreeStyleProject("test"); - GitLabPushTrigger trigger = gitLabPushTrigger().withTriggerOnPush(true).withBranchFilterType(BranchFilterType.All).build(); + GitLabPushTrigger trigger = gitLabPushTrigger().withTriggerOnPush(true).withBranchFilterType(BranchFilterType.All).withUserNameFilterType(UserNameFilterType.All).build(); project.addTrigger(trigger); trigger.start(project, true); project.getBuildersList().add(new TestBuilder() { @@ -91,7 +92,7 @@ public boolean perform(AbstractBuild build, Launcher launcher, BuildListen public void buildOnMergeRequest() throws IOException, InterruptedException, GitAPIException { final OneShotEvent buildTriggered = new OneShotEvent(); FreeStyleProject project = jenkins.createFreeStyleProject("test"); - GitLabPushTrigger trigger = gitLabPushTrigger().withTriggerOnMergeRequest(true).withBranchFilterType(BranchFilterType.All).build(); + GitLabPushTrigger trigger = gitLabPushTrigger().withTriggerOnMergeRequest(true).withBranchFilterType(BranchFilterType.All).withUserNameFilterType(UserNameFilterType.All).build(); project.addTrigger(trigger); trigger.start(project, true); project.getBuildersList().add(new TestBuilder() { @@ -118,7 +119,9 @@ public void buildOnNote() throws IOException, InterruptedException, GitAPIExcept GitLabPushTrigger trigger = gitLabPushTrigger() .withTriggerOnNoteRequest(true) .withNoteRegex(".*test.*") - .withBranchFilterType(BranchFilterType.All).build(); + .withBranchFilterType(BranchFilterType.All) + .withUserNameFilterType(UserNameFilterType.All) + .build(); project.getBuildersList().add(new TestBuilder() { @Override public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { @@ -151,6 +154,7 @@ public void reportBuildStatus() throws IOException, InterruptedException, GitAPI GitLabPushTrigger trigger = gitLabPushTrigger() .withTriggerOnPush(true) .withBranchFilterType(BranchFilterType.All) + .withUserNameFilterType(UserNameFilterType.All) .build(); FreeStyleProject project = jenkins.createFreeStyleProject("test"); diff --git a/src/test/java/com/dabsquared/gitlabjenkins/trigger/filter/AllUserNamesFilterTest.java b/src/test/java/com/dabsquared/gitlabjenkins/trigger/filter/AllUserNamesFilterTest.java new file mode 100644 index 000000000..e6b4992f4 --- /dev/null +++ b/src/test/java/com/dabsquared/gitlabjenkins/trigger/filter/AllUserNamesFilterTest.java @@ -0,0 +1,20 @@ +package com.dabsquared.gitlabjenkins.trigger.filter; + +import org.apache.commons.lang.RandomStringUtils; +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +/** + * @author jean.flores + */ + +public class AllUserNamesFilterTest{ + + @Test + public void isRandomBranchNameAllowed() { + String randomUserName = RandomStringUtils.random(10, true, false); + assertThat(new AllUserNamesFilter().isUserNameAllowed(randomUserName), is(true)); + } +} diff --git a/src/test/java/com/dabsquared/gitlabjenkins/trigger/filter/UserNameBasedFilterTest.java b/src/test/java/com/dabsquared/gitlabjenkins/trigger/filter/UserNameBasedFilterTest.java new file mode 100644 index 000000000..b12cd1bfd --- /dev/null +++ b/src/test/java/com/dabsquared/gitlabjenkins/trigger/filter/UserNameBasedFilterTest.java @@ -0,0 +1,28 @@ +package com.dabsquared.gitlabjenkins.trigger.filter; + +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +/** + * @author Robin Müller + */ +public class UserNameBasedFilterTest { + + @Test + public void excludeBranches() { + UserNameBasedFilter nameBasedFilter = new UserNameBasedFilter("John Doe, John Doe2"); + + assertThat(nameBasedFilter.isUserNameAllowed("John Doe"), is(false)); + assertThat(nameBasedFilter.isUserNameAllowed("John Doe2"), is(false)); + assertThat(nameBasedFilter.isUserNameAllowed("not-excluded-user"), is(true)); + } + + @Test + public void allowExcludeToBeNull() { + UserNameBasedFilter nameBasedFilter = new UserNameBasedFilter(null); + + assertThat(nameBasedFilter.isUserNameAllowed("John Doe"), is(true)); + } +} diff --git a/src/test/java/com/dabsquared/gitlabjenkins/trigger/filter/UserNameFilterFactoryTest.java b/src/test/java/com/dabsquared/gitlabjenkins/trigger/filter/UserNameFilterFactoryTest.java new file mode 100644 index 000000000..965093a99 --- /dev/null +++ b/src/test/java/com/dabsquared/gitlabjenkins/trigger/filter/UserNameFilterFactoryTest.java @@ -0,0 +1,27 @@ +package com.dabsquared.gitlabjenkins.trigger.filter; + +import org.junit.Test; + +import static com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilterConfig.UserNameFilterConfigBuilder.userNameFilterConfig; +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.junit.Assert.assertThat; + +public class UserNameFilterFactoryTest { + + @Test + public void getAllUserNamesFilter() { + UserNameFilter userNameFilter = UserNameFilterFactory.newUserNameFilter(userNameFilterConfig() + .withExcludeUserNamesSpec("John Doe") + .build(UserNameFilterType.All) + ); + assertThat(userNameFilter, instanceOf(AllUserNamesFilter.class)); + } + @Test + public void getUserNameBasedFilterFilter() { + UserNameFilter userNameFilter = UserNameFilterFactory.newUserNameFilter(userNameFilterConfig() + .withExcludeUserNamesSpec("John Doe") + .build(UserNameFilterType.NameBasedFilter)); + + assertThat(userNameFilter, instanceOf(UserNameBasedFilter.class)); + } +} diff --git a/src/test/java/com/dabsquared/gitlabjenkins/trigger/handler/PendingBuildsHandlerTest.java b/src/test/java/com/dabsquared/gitlabjenkins/trigger/handler/PendingBuildsHandlerTest.java index 58288d35e..7e3251bed 100644 --- a/src/test/java/com/dabsquared/gitlabjenkins/trigger/handler/PendingBuildsHandlerTest.java +++ b/src/test/java/com/dabsquared/gitlabjenkins/trigger/handler/PendingBuildsHandlerTest.java @@ -8,6 +8,8 @@ import com.dabsquared.gitlabjenkins.gitlab.hook.model.builder.generated.*; import com.dabsquared.gitlabjenkins.publisher.GitLabCommitStatusPublisher; import com.dabsquared.gitlabjenkins.trigger.filter.BranchFilterType; +import com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilter; +import com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilterType; import hudson.model.FreeStyleProject; import hudson.model.Item; import hudson.model.ItemGroup; @@ -132,6 +134,7 @@ private GitLabPushTrigger gitLabPushTrigger() { gitLabPushTrigger.setTriggerOnMergeRequest(true); gitLabPushTrigger.setPendingBuildName(GITLAB_BUILD_NAME); gitLabPushTrigger.setBranchFilterType(BranchFilterType.NameBasedFilter); + gitLabPushTrigger.setUserNameFilterType(UserNameFilterType.NameBasedFilter); gitLabPushTrigger.setBranchFilterName(""); return gitLabPushTrigger; } diff --git a/src/test/java/com/dabsquared/gitlabjenkins/trigger/handler/merge/MergeRequestHookTriggerHandlerImplTest.java b/src/test/java/com/dabsquared/gitlabjenkins/trigger/handler/merge/MergeRequestHookTriggerHandlerImplTest.java index 138eade8d..5ff5944f4 100644 --- a/src/test/java/com/dabsquared/gitlabjenkins/trigger/handler/merge/MergeRequestHookTriggerHandlerImplTest.java +++ b/src/test/java/com/dabsquared/gitlabjenkins/trigger/handler/merge/MergeRequestHookTriggerHandlerImplTest.java @@ -6,6 +6,8 @@ import com.dabsquared.gitlabjenkins.trigger.TriggerOpenMergeRequest; import com.dabsquared.gitlabjenkins.trigger.filter.BranchFilterFactory; import com.dabsquared.gitlabjenkins.trigger.filter.BranchFilterType; +import com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilterFactory; +import com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilterType; import hudson.Launcher; import hudson.model.AbstractBuild; import hudson.model.BuildListener; @@ -41,6 +43,7 @@ import static com.dabsquared.gitlabjenkins.gitlab.hook.model.builder.generated.UserBuilder.user; import static com.dabsquared.gitlabjenkins.trigger.filter.BranchFilterConfig.BranchFilterConfigBuilder.branchFilterConfig; import static com.dabsquared.gitlabjenkins.trigger.filter.MergeRequestLabelFilterFactory.newMergeRequestLabelFilter; +import static com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilterConfig.UserNameFilterConfigBuilder.userNameFilterConfig; import static com.dabsquared.gitlabjenkins.trigger.handler.merge.MergeRequestHookTriggerHandlerFactory.withConfig; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @@ -369,7 +372,9 @@ public boolean perform(AbstractBuild build, Launcher launcher, BuildListen .build() ) .build(), true, BranchFilterFactory.newBranchFilter(branchFilterConfig().build(BranchFilterType.All)), - newMergeRequestLabelFilter(null)); + newMergeRequestLabelFilter(null), + UserNameFilterFactory.newUserNameFilter(userNameFilterConfig().build(UserNameFilterType.All)) + ); buildTriggered.block(10000); assertThat(buildTriggered.isSignaled(), is(true)); @@ -384,7 +389,9 @@ public boolean perform(AbstractBuild build, Launcher launcher, BuildListen .build() ) .build(), true, BranchFilterFactory.newBranchFilter(branchFilterConfig().build(BranchFilterType.All)), - newMergeRequestLabelFilter(null)); + newMergeRequestLabelFilter(null), + UserNameFilterFactory.newUserNameFilter(userNameFilterConfig().build(UserNameFilterType.All)) + ); buildTriggered.block(10000); assertThat(buildTriggered.isSignaled(), is(true)); @@ -454,7 +461,9 @@ public boolean perform(AbstractBuild build, Launcher launcher, BuildListen .build() ) .build(), true, BranchFilterFactory.newBranchFilter(branchFilterConfig().build(BranchFilterType.All)), - newMergeRequestLabelFilter(null)); + newMergeRequestLabelFilter(null), + UserNameFilterFactory.newUserNameFilter(userNameFilterConfig().build(UserNameFilterType.All)) + ); buildTriggered.block(10000); return buildTriggered; @@ -475,7 +484,9 @@ public boolean perform(AbstractBuild build, Launcher launcher, BuildListen mergeRequestHookTriggerHandler.handle(project, mergeRequestHook() .withObjectAttributes(defaultMergeRequestObjectAttributes().withDescription(MRDescription).withLastCommit(commit().withMessage(lastCommitMsg).withAuthor(user().withName("test").build()).withId("testid").build()).build()) .build(), true, BranchFilterFactory.newBranchFilter(branchFilterConfig().build(BranchFilterType.All)), - newMergeRequestLabelFilter(null)); + newMergeRequestLabelFilter(null), + UserNameFilterFactory.newUserNameFilter(userNameFilterConfig().build(UserNameFilterType.All)) + ); buildTriggered.block(10000); return buildTriggered.isSignaled(); diff --git a/src/test/java/com/dabsquared/gitlabjenkins/trigger/handler/note/NoteHookTriggerHandlerImplTest.java b/src/test/java/com/dabsquared/gitlabjenkins/trigger/handler/note/NoteHookTriggerHandlerImplTest.java index 90c0a8287..44e54bed0 100644 --- a/src/test/java/com/dabsquared/gitlabjenkins/trigger/handler/note/NoteHookTriggerHandlerImplTest.java +++ b/src/test/java/com/dabsquared/gitlabjenkins/trigger/handler/note/NoteHookTriggerHandlerImplTest.java @@ -3,6 +3,8 @@ import com.dabsquared.gitlabjenkins.gitlab.hook.model.State; import com.dabsquared.gitlabjenkins.trigger.filter.BranchFilterFactory; import com.dabsquared.gitlabjenkins.trigger.filter.BranchFilterType; +import com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilterFactory; +import com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilterType; import hudson.Launcher; import hudson.model.AbstractBuild; import hudson.model.BuildListener; @@ -34,6 +36,7 @@ import static com.dabsquared.gitlabjenkins.gitlab.hook.model.builder.generated.UserBuilder.user; import static com.dabsquared.gitlabjenkins.trigger.filter.BranchFilterConfig.BranchFilterConfigBuilder.branchFilterConfig; import static com.dabsquared.gitlabjenkins.trigger.filter.MergeRequestLabelFilterFactory.newMergeRequestLabelFilter; +import static com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilterConfig.UserNameFilterConfigBuilder.userNameFilterConfig; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @@ -79,8 +82,12 @@ public boolean perform(AbstractBuild build, Launcher launcher, BuildListen .withUrl("https://gitlab.org/test/merge_requests/1#note_1") .build()) .withMergeRequest(mergeRequestObjectAttributes().withDescription("[ci-skip]").build()) - .build(), true, BranchFilterFactory.newBranchFilter(branchFilterConfig().build(BranchFilterType.All)), - newMergeRequestLabelFilter(null)); + .build(), + true, + BranchFilterFactory.newBranchFilter(branchFilterConfig().build(BranchFilterType.All)), + newMergeRequestLabelFilter(null), + UserNameFilterFactory.newUserNameFilter(userNameFilterConfig().build(UserNameFilterType.All)) + ); buildTriggered.block(10000); assertThat(buildTriggered.isSignaled(), is(false)); @@ -146,8 +153,12 @@ public boolean perform(AbstractBuild build, Launcher launcher, BuildListen .withWebUrl("https://gitlab.org/test.git") .build()) .build()) - .build(), true, BranchFilterFactory.newBranchFilter(branchFilterConfig().build(BranchFilterType.All)), - newMergeRequestLabelFilter(null)); + .build(), + true, + BranchFilterFactory.newBranchFilter(branchFilterConfig().build(BranchFilterType.All)), + newMergeRequestLabelFilter(null), + UserNameFilterFactory.newUserNameFilter(userNameFilterConfig().build(UserNameFilterType.All)) + ); buildTriggered.block(10000); assertThat(buildTriggered.isSignaled(), is(true)); diff --git a/src/test/java/com/dabsquared/gitlabjenkins/trigger/handler/pipeline/PipelineHookTriggerHandlerImplTest.java b/src/test/java/com/dabsquared/gitlabjenkins/trigger/handler/pipeline/PipelineHookTriggerHandlerImplTest.java index d7f7ab3ef..cbc946594 100644 --- a/src/test/java/com/dabsquared/gitlabjenkins/trigger/handler/pipeline/PipelineHookTriggerHandlerImplTest.java +++ b/src/test/java/com/dabsquared/gitlabjenkins/trigger/handler/pipeline/PipelineHookTriggerHandlerImplTest.java @@ -4,6 +4,7 @@ import com.dabsquared.gitlabjenkins.gitlab.hook.model.State; import com.dabsquared.gitlabjenkins.gitlab.hook.model.User; import com.dabsquared.gitlabjenkins.trigger.filter.BranchFilterType; +import com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilterType; import hudson.Launcher; import hudson.model.AbstractBuild; import hudson.model.BuildListener; @@ -31,6 +32,8 @@ import static com.dabsquared.gitlabjenkins.trigger.filter.BranchFilterConfig.BranchFilterConfigBuilder.branchFilterConfig; import static com.dabsquared.gitlabjenkins.trigger.filter.BranchFilterFactory.newBranchFilter; import static com.dabsquared.gitlabjenkins.trigger.filter.MergeRequestLabelFilterFactory.newMergeRequestLabelFilter; +import static com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilterConfig.UserNameFilterConfigBuilder.userNameFilterConfig; +import static com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilterFactory.newUserNameFilter; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @@ -108,7 +111,7 @@ public boolean perform(AbstractBuild build, Launcher launcher, BuildListen }); project.setQuietPeriod(0); pipelineHookTriggerHandler.handle(project, pipelineHook , true, newBranchFilter(branchFilterConfig().build(BranchFilterType.All)), - newMergeRequestLabelFilter(null)); + newMergeRequestLabelFilter(null), newUserNameFilter(userNameFilterConfig().build(UserNameFilterType.All))); buildTriggered.block(10000); assertThat(buildTriggered.isSignaled(), is(true)); @@ -129,7 +132,7 @@ public boolean perform(AbstractBuild build, Launcher launcher, BuildListen project.setQuietPeriod(0); pipelineHookTriggerHandler.handle(project, pipelineHook, false, newBranchFilter(branchFilterConfig().build(BranchFilterType.All)), - newMergeRequestLabelFilter(null)); + newMergeRequestLabelFilter(null), newUserNameFilter(userNameFilterConfig().build(UserNameFilterType.All))); buildTriggered.block(10000); assertThat(buildTriggered.isSignaled(), is(true)); diff --git a/src/test/java/com/dabsquared/gitlabjenkins/trigger/handler/push/PushHookTriggerHandlerImplTest.java b/src/test/java/com/dabsquared/gitlabjenkins/trigger/handler/push/PushHookTriggerHandlerImplTest.java index ca764320d..b51dd34a9 100644 --- a/src/test/java/com/dabsquared/gitlabjenkins/trigger/handler/push/PushHookTriggerHandlerImplTest.java +++ b/src/test/java/com/dabsquared/gitlabjenkins/trigger/handler/push/PushHookTriggerHandlerImplTest.java @@ -2,6 +2,7 @@ import com.dabsquared.gitlabjenkins.gitlab.hook.model.builder.generated.PushHookBuilder; import com.dabsquared.gitlabjenkins.trigger.filter.BranchFilterType; +import com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilterType; import hudson.Launcher; import hudson.model.AbstractBuild; import hudson.model.BuildListener; @@ -30,6 +31,8 @@ import static com.dabsquared.gitlabjenkins.trigger.filter.BranchFilterConfig.BranchFilterConfigBuilder.branchFilterConfig; import static com.dabsquared.gitlabjenkins.trigger.filter.BranchFilterFactory.newBranchFilter; import static com.dabsquared.gitlabjenkins.trigger.filter.MergeRequestLabelFilterFactory.newMergeRequestLabelFilter; +import static com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilterConfig.UserNameFilterConfigBuilder.userNameFilterConfig; +import static com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilterFactory.newUserNameFilter; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @@ -66,8 +69,12 @@ public boolean perform(AbstractBuild build, Launcher launcher, BuildListen pushHookTriggerHandler.handle(project, pushHook() .withCommits(Arrays.asList(commit().withMessage("some message").build(), commit().withMessage("[ci-skip]").build())) - .build(), true, newBranchFilter(branchFilterConfig().build(BranchFilterType.All)), - newMergeRequestLabelFilter(null)); + .build(), + true, + newBranchFilter(branchFilterConfig().build(BranchFilterType.All)), + newMergeRequestLabelFilter(null), + newUserNameFilter(userNameFilterConfig().build(UserNameFilterType.All)) + ); buildTriggered.block(10000); assertThat(buildTriggered.isSignaled(), is(false)); @@ -112,8 +119,12 @@ public boolean perform(AbstractBuild build, Launcher launcher, BuildListen .build()) .withAfter(commit.name()) .withRef("refs/heads/" + git.nameRev().add(head).call().get(head)) - .build(), true, newBranchFilter(branchFilterConfig().build(BranchFilterType.All)), - newMergeRequestLabelFilter(null)); + .build(), + true, + newBranchFilter(branchFilterConfig().build(BranchFilterType.All)), + newMergeRequestLabelFilter(null), + newUserNameFilter(userNameFilterConfig().build(UserNameFilterType.All)) + ); buildTriggered.block(10000); assertThat(buildTriggered.isSignaled(), is(true)); @@ -164,10 +175,10 @@ public boolean perform(AbstractBuild build, Launcher launcher, BuildListen .withAfter(commit.name()) .withRef("refs/heads/" + git.nameRev().add(head).call().get(head)); pushHookTriggerHandler.handle(project, pushHookBuilder.build(), true, newBranchFilter(branchFilterConfig().build(BranchFilterType.All)), - newMergeRequestLabelFilter(null)); + newMergeRequestLabelFilter(null), newUserNameFilter(userNameFilterConfig().build(UserNameFilterType.All))); pushHookTriggerHandler.handle(project, pushHookBuilder .but().withRef("refs/heads/" + git.nameRev().add(head).call().get(head) + "-2").build(), true, - newBranchFilter(branchFilterConfig().build(BranchFilterType.All)), newMergeRequestLabelFilter(null)); + newBranchFilter(branchFilterConfig().build(BranchFilterType.All)), newMergeRequestLabelFilter(null), newUserNameFilter(userNameFilterConfig().build(UserNameFilterType.All))); buildTriggered.block(10000); assertThat(buildTriggered.isSignaled(), is(true)); assertThat(buildCount.intValue(), is(2)); diff --git a/src/test/java/com/dabsquared/gitlabjenkins/webhook/build/MergeRequestBuildActionTest.java b/src/test/java/com/dabsquared/gitlabjenkins/webhook/build/MergeRequestBuildActionTest.java index 2f591b7c5..ecee323e2 100644 --- a/src/test/java/com/dabsquared/gitlabjenkins/webhook/build/MergeRequestBuildActionTest.java +++ b/src/test/java/com/dabsquared/gitlabjenkins/webhook/build/MergeRequestBuildActionTest.java @@ -5,6 +5,7 @@ import com.dabsquared.gitlabjenkins.cause.GitLabWebHookCause; import com.dabsquared.gitlabjenkins.gitlab.hook.model.MergeRequestHook; import com.dabsquared.gitlabjenkins.trigger.filter.BranchFilterType; +import com.dabsquared.gitlabjenkins.trigger.filter.UserNameFilterType; import hudson.model.*; import hudson.model.queue.QueueListener; import hudson.model.queue.QueueTaskFuture; @@ -90,6 +91,7 @@ public void setup() throws Exception { // some defaults of the trigger trigger.setBranchFilterType(BranchFilterType.All); + trigger.setUserNameFilterType(UserNameFilterType.All); }