Skip to content

Commit

Permalink
feat: adding allowSeveralTriggersPerBuild configuration (refs #64 #116
Browse files Browse the repository at this point in the history
  • Loading branch information
tomasbjerre committed Dec 19, 2022
1 parent 699cac8 commit aa6370b
Show file tree
Hide file tree
Showing 6 changed files with 58 additions and 15 deletions.
7 changes: 1 addition & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
4 changes: 2 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@
<findbugs.failOnError>false</findbugs.failOnError>
<maven.javadoc.skip>true</maven.javadoc.skip>
<violations.version>1.50.4</violations.version>
<changelog>1.95.3</changelog>
<changelog>1.95.4</changelog>
</properties>

<artifactId>generic-webhook-trigger</artifactId>
<version>1.85.3-SNAPSHOT</version>
<version>1.86.0-SNAPSHOT</version>
<name>Generic Webhook Trigger Plugin</name>
<description>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.</description>
<url>https://github.com/jenkinsci/generic-webhook-trigger-plugin</url>
Expand Down
13 changes: 12 additions & 1 deletion src/main/java/org/jenkinsci/plugins/gwt/GenericTrigger.java
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ public class GenericTrigger extends Trigger<Job<?, ?>> {
private boolean silentResponse;
private boolean overrideQuietPeriod;
private boolean shouldNotFlattern;
private boolean allowSeveralTriggersPerBuild;

@Symbol("GenericTrigger")
public static class GenericDescriptor extends TriggerDescriptor {
Expand Down Expand Up @@ -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")
Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<String, String> resolvedVariables) {
final Map<String, String> resolvedVariables,
final boolean allowSeveralTriggersPerBuild) {
final List<ParameterValue> 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);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,13 @@
</f:description>
</f:entry>

<f:entry title="Allow several triggers per build" field="allowSeveralTriggersPerBuild">
<f:checkbox/>
<f:description>
If checked, the plugin will allow one build to have several triggers. If not checked, the plugin will trigger exactly one job when invoked.
</f:description>
</f:entry>

<f:entry title="Silent response" field="silentResponse">
<f:checkbox/>
<f:description>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -24,7 +25,7 @@ public void testThatStringKeepsItsDefaultValueWhenNoParameterSupplied() {
.build();

final ParametersAction actual =
createParameterAction(parametersDefinitionProperty, resolvedVariables);
createParameterAction(parametersDefinitionProperty, resolvedVariables, true);

assertThat(actual) //
.hasSize(1);
Expand All @@ -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);
Expand All @@ -62,7 +63,7 @@ public void testThatBooleanKeepsItsDefaultValueWhenNoParameterSupplied() {
.build();

final ParametersAction actual =
createParameterAction(parametersDefinitionProperty, resolvedVariables);
createParameterAction(parametersDefinitionProperty, resolvedVariables, true);

assertThat(actual) //
.hasSize(1);
Expand All @@ -81,7 +82,7 @@ public void testThatBooleanDoesNotKeepItsDefaultValueWhenParameterSuppliedAndFal
"name", "false");

final ParametersAction actual =
createParameterAction(parametersDefinitionProperty, resolvedVariables);
createParameterAction(parametersDefinitionProperty, resolvedVariables, true);

assertThat(actual) //
.hasSize(1);
Expand All @@ -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<String, String> 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();
}
}

0 comments on commit aa6370b

Please sign in to comment.