From aa6370b2930ac940ad7a210bff56ecf1aa129c2a Mon Sep 17 00:00:00 2001 From: Tomas Bjerre Date: Mon, 19 Dec 2022 10:26:54 +0100 Subject: [PATCH] feat: adding allowSeveralTriggersPerBuild configuration (refs #64 #116 #126 #162 #171 #252) --- README.md | 7 +--- pom.xml | 4 +-- .../jenkinsci/plugins/gwt/GenericTrigger.java | 13 +++++++- .../plugins/gwt/ParameterActionUtil.java | 10 +++++- .../plugins/gwt/GenericTrigger/config.jelly | 7 ++++ .../plugins/gwt/ParameterActionUtilTest.java | 32 ++++++++++++++++--- 6 files changed, 58 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index d1ae14a..82bfb8f 100644 --- a/README.md +++ b/README.md @@ -76,12 +76,7 @@ The token can be supplied as a: ## Trigger exactly one build -Jenkins will batch builds of a job if those builds have same parameters. If this plugin gets invoked by many webhooks at the same time it may trigger only one build and it will have many *Generic Cause* as causes. This has been reported in many issues [#64](/../../issues/64) [#116](/../../issues/116) [#126](/../../issues/126) [#162](/../../issues/162) [#171](/../../issues/171). - -You can solve this by making the one job parameterized. Resolve one of the parameters with something unique from the webhook. This will make each trigger unique and Jenkins will not batch the builds into one build. - -The section on *Default values* explains the parameters. - +Until version `1.85.2` of this plugin, it would batch builds with same parameters. The `1.86.0` adds an option, `allowSeveralTriggersPerBuild`, that, if checked, will keep this behavior. If not checked, the plugin will trigger exactly one job when invoked. ## Whitelist hosts diff --git a/pom.xml b/pom.xml index d59d468..e2e6a44 100644 --- a/pom.xml +++ b/pom.xml @@ -12,11 +12,11 @@ false true 1.50.4 - 1.95.3 + 1.95.4 generic-webhook-trigger - 1.85.3-SNAPSHOT + 1.86.0-SNAPSHOT Generic Webhook Trigger Plugin Can receive any HTTP request, extract any values from JSON or XML and trigger a job with those values available as variables. Works with GitHub, GitLab, Bitbucket, Jira and many more. https://github.com/jenkinsci/generic-webhook-trigger-plugin diff --git a/src/main/java/org/jenkinsci/plugins/gwt/GenericTrigger.java b/src/main/java/org/jenkinsci/plugins/gwt/GenericTrigger.java index 1ea0fd4..7506b85 100644 --- a/src/main/java/org/jenkinsci/plugins/gwt/GenericTrigger.java +++ b/src/main/java/org/jenkinsci/plugins/gwt/GenericTrigger.java @@ -42,6 +42,7 @@ public class GenericTrigger extends Trigger> { private boolean silentResponse; private boolean overrideQuietPeriod; private boolean shouldNotFlattern; + private boolean allowSeveralTriggersPerBuild; @Symbol("GenericTrigger") public static class GenericDescriptor extends TriggerDescriptor { @@ -152,6 +153,15 @@ public String getTokenCredentialId() { return this.tokenCredentialId; } + @DataBoundSetter + public void setAllowSeveralTriggersPerBuild(final boolean allowSeveralTriggersPerBuild) { + this.allowSeveralTriggersPerBuild = allowSeveralTriggersPerBuild; + } + + public boolean getAllowSeveralTriggersPerBuild() { + return this.allowSeveralTriggersPerBuild; + } + @Extension public static final GenericDescriptor DESCRIPTOR = new GenericDescriptor(); @SuppressWarnings("static-access") @@ -188,7 +198,8 @@ public GenericTriggerResults trigger( final ParametersDefinitionProperty parametersDefinitionProperty = this.job.getProperty(ParametersDefinitionProperty.class); final ParametersAction parameters = - createParameterAction(parametersDefinitionProperty, resolvedVariables); + createParameterAction( + parametersDefinitionProperty, resolvedVariables, this.allowSeveralTriggersPerBuild); item = this.retrieveScheduleJob(this.job) // .scheduleBuild2(this.job, quietPeriod, new CauseAction(genericCause), parameters); diff --git a/src/main/java/org/jenkinsci/plugins/gwt/ParameterActionUtil.java b/src/main/java/org/jenkinsci/plugins/gwt/ParameterActionUtil.java index 231c1b0..e1c93ef 100644 --- a/src/main/java/org/jenkinsci/plugins/gwt/ParameterActionUtil.java +++ b/src/main/java/org/jenkinsci/plugins/gwt/ParameterActionUtil.java @@ -12,14 +12,22 @@ import hudson.model.StringParameterValue; import java.util.List; import java.util.Map; +import java.util.UUID; public class ParameterActionUtil { public static ParametersAction createParameterAction( final ParametersDefinitionProperty parametersDefinitionProperty, - final Map resolvedVariables) { + final Map resolvedVariables, + final boolean allowSeveralTriggersPerBuild) { final List parameterList = getParametersWithRespectToDefaultValues(parametersDefinitionProperty, resolvedVariables); + final boolean triggerOneBuildPerInvocation = !allowSeveralTriggersPerBuild; + if (triggerOneBuildPerInvocation) { + parameterList.add( + new StringParameterValue( + "jenkins-generic-webhook-trigger-plugin_uuid", UUID.randomUUID().toString(), null)); + } return new ParametersAction(parameterList); } diff --git a/src/main/resources/org/jenkinsci/plugins/gwt/GenericTrigger/config.jelly b/src/main/resources/org/jenkinsci/plugins/gwt/GenericTrigger/config.jelly index 29c4094..1c43c0a 100644 --- a/src/main/resources/org/jenkinsci/plugins/gwt/GenericTrigger/config.jelly +++ b/src/main/resources/org/jenkinsci/plugins/gwt/GenericTrigger/config.jelly @@ -82,6 +82,13 @@ + + + + If checked, the plugin will allow one build to have several triggers. If not checked, the plugin will trigger exactly one job when invoked. + + + diff --git a/src/test/java/org/jenkinsci/plugins/gwt/ParameterActionUtilTest.java b/src/test/java/org/jenkinsci/plugins/gwt/ParameterActionUtilTest.java index b3aedd1..0f14204 100644 --- a/src/test/java/org/jenkinsci/plugins/gwt/ParameterActionUtilTest.java +++ b/src/test/java/org/jenkinsci/plugins/gwt/ParameterActionUtilTest.java @@ -8,6 +8,7 @@ import hudson.model.ParametersAction; import hudson.model.ParametersDefinitionProperty; import hudson.model.StringParameterDefinition; +import java.util.HashMap; import java.util.Map; import org.junit.Test; @@ -24,7 +25,7 @@ public void testThatStringKeepsItsDefaultValueWhenNoParameterSupplied() { .build(); final ParametersAction actual = - createParameterAction(parametersDefinitionProperty, resolvedVariables); + createParameterAction(parametersDefinitionProperty, resolvedVariables, true); assertThat(actual) // .hasSize(1); @@ -43,7 +44,7 @@ public void testThatStringDoesNotKeepItsDefaultValueWhenParameterSupplied() { "name", "this is supplied"); final ParametersAction actual = - createParameterAction(parametersDefinitionProperty, resolvedVariables); + createParameterAction(parametersDefinitionProperty, resolvedVariables, true); assertThat(actual) // .hasSize(1); @@ -62,7 +63,7 @@ public void testThatBooleanKeepsItsDefaultValueWhenNoParameterSupplied() { .build(); final ParametersAction actual = - createParameterAction(parametersDefinitionProperty, resolvedVariables); + createParameterAction(parametersDefinitionProperty, resolvedVariables, true); assertThat(actual) // .hasSize(1); @@ -81,7 +82,7 @@ public void testThatBooleanDoesNotKeepItsDefaultValueWhenParameterSuppliedAndFal "name", "false"); final ParametersAction actual = - createParameterAction(parametersDefinitionProperty, resolvedVariables); + createParameterAction(parametersDefinitionProperty, resolvedVariables, true); assertThat(actual) // .hasSize(1); @@ -100,11 +101,32 @@ public void testThatBooleanDoesNotKeepItsDefaultValueWhenParameterSuppliedAndTru "name", "true"); final ParametersAction actual = - createParameterAction(parametersDefinitionProperty, resolvedVariables); + createParameterAction(parametersDefinitionProperty, resolvedVariables, true); assertThat(actual) // .hasSize(1); assertThat(actual.getAllParameters().get(0).getValue()) // .isEqualTo(true); } + + @Test + public void testThatUniqueParameterIsAddedWhenallowSeveralTriggersPerBuildFalse() { + final ParametersDefinitionProperty parametersDefinitionProperty = + new ParametersDefinitionProperty(); + final Map resolvedVariables = new HashMap<>(); + + final ParametersAction actualWithTrue = + createParameterAction(parametersDefinitionProperty, resolvedVariables, true); + + assertThat(actualWithTrue) // + .hasSize(0); + + final ParametersAction actualWithFalse = + createParameterAction(parametersDefinitionProperty, resolvedVariables, false); + + assertThat(actualWithFalse) // + .hasSize(1); + assertThat(actualWithFalse.getAllParameters().get(0).getValue()) // + .isNotNull(); + } }