Skip to content

Commit

Permalink
feat: adding dry run mode (refs #300)
Browse files Browse the repository at this point in the history
  • Loading branch information
tomasbjerre committed Mar 24, 2024
1 parent 8af75db commit cc71adf
Show file tree
Hide file tree
Showing 5 changed files with 112 additions and 33 deletions.
12 changes: 12 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,18 @@ The token can be supplied as a:

`curl -vs -H "Authorization: Bearer abc123" "http://localhost:8080/jenkins/generic-webhook-trigger/invoke" 2>&1`

## Dry run

The dry run feature enables a user to test the plugin without actually triggering any jobs.

Dry run is enabled by supplying the `gwt-dry-run: true` header.

```sh
curl -v -H "gwt-dry-run: true"\
"http://localhost:8080/jenkins/generic-webhook-trigger/invoke?token=abc123"
```


## Cache jobs

When plugin is used in large installations it may need some time to retrieve all configured jobs. This can be cached by enabling it in the global configuration. When enabled, the plugin will cache configured jobs for a configured time. The plugin will automatically refresh the cache so that any calls will use the cached value. This means the effect of any changes to any configured job will be delayed.
Expand Down
42 changes: 37 additions & 5 deletions src/main/java/org/jenkinsci/plugins/gwt/GenericTrigger.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@

public class GenericTrigger extends Trigger<Job<?, ?>> {

public static final String HEADER_DRY_RUN = "gwt-dry-run";

private List<GenericVariable> genericVariables = newArrayList();
private String regexpFilterText;
private String regexpFilterExpression;
Expand Down Expand Up @@ -204,7 +206,9 @@ public GenericTriggerResults trigger(
final String renderedRegexpFilterText = renderText(this.regexpFilterText, resolvedVariables);
final boolean isMatching = isMatching(renderedRegexpFilterText, this.regexpFilterExpression);

hudson.model.Queue.Item item = null;
String url = null;
long id = 0;
boolean triggered = false;
if (isMatching) {
final String cause = renderText(this.causeString, resolvedVariables);
final GenericCause genericCause =
Expand All @@ -219,12 +223,40 @@ public GenericTriggerResults trigger(
final ParametersAction parameters =
createParameterAction(
parametersDefinitionProperty, resolvedVariables, this.allowSeveralTriggersPerBuild);
item =
this.retrieveScheduleJob(this.job) //
.scheduleBuild2(this.job, quietPeriod, new CauseAction(genericCause), parameters);
if (!isDryRun(headers)) {
final hudson.model.Queue.Item item =
this.retrieveScheduleJob(this.job) //
.scheduleBuild2(this.job, quietPeriod, new CauseAction(genericCause), parameters);
url = item.getUrl();
id = item.getId();
} else {
url = this.job.getAbsoluteUrl();
}
triggered = true;
}
return new GenericTriggerResults(
item, resolvedVariables, renderedRegexpFilterText, this.regexpFilterExpression);
url,
id,
triggered,
resolvedVariables,
renderedRegexpFilterText,
this.regexpFilterExpression);
}

static boolean isDryRun(final Map<String, List<String>> headers) {
if (headers == null) {
return false;
}
final List<String> dryRunHeaders = headers.get(HEADER_DRY_RUN);
if (dryRunHeaders == null) {
return false;
}
for (final String dryRunHeader : dryRunHeaders) {
if (dryRunHeader.equalsIgnoreCase("true")) {
return true;
}
}
return false;
}

@SuppressWarnings("rawtypes")
Expand Down
29 changes: 12 additions & 17 deletions src/main/java/org/jenkinsci/plugins/gwt/GenericTriggerResults.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,46 +12,41 @@ public class GenericTriggerResults {
private final boolean triggered;

public GenericTriggerResults(
final hudson.model.Queue.Item item,
final String url,
final long id,
final boolean triggered,
final Map<String, String> resolvedVariables,
final String regexpFilterText,
final String regexpFilterExpression) {
if (item != null) {
this.url = item.getUrl();
this.id = item.getId();
this.triggered = true;
} else {
this.url = null;
this.id = 0;
this.triggered = false;
}

this.url = url;
this.id = id;
this.triggered = triggered;
this.resolvedVariables = resolvedVariables;
this.regexpFilterText = regexpFilterText;
this.regexpFilterExpression = regexpFilterExpression;
}

public boolean isTriggered() {
return triggered;
return this.triggered;
}

public long getId() {
return id;
return this.id;
}

public String getUrl() {
return url;
return this.url;
}

public String getRegexpFilterExpression() {
return regexpFilterExpression;
return this.regexpFilterExpression;
}

public String getRegexpFilterText() {
return regexpFilterText;
return this.regexpFilterText;
}

public Map<String, String> getResolvedVariables() {
return resolvedVariables;
return this.resolvedVariables;
}
}
Original file line number Diff line number Diff line change
@@ -1,43 +1,40 @@
package org.jenkinsci.plugins.gwt;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import hudson.model.Queue.Item;
import java.util.Map;
import org.junit.Test;

public class GenericTriggerResultsTest {
@Test
public void testNull() {
final Item item = null;
final String url = null;
final long id = 0;
final boolean triggered = false;
final Map<String, String> resolvedVariables = null;
final String regexpFilterText = null;
final String regexpFilterExpression = null;

final GenericTriggerResults sut =
new GenericTriggerResults(
item, resolvedVariables, regexpFilterText, regexpFilterExpression);
url, id, triggered, resolvedVariables, regexpFilterText, regexpFilterExpression);

assertThat(sut) //
.isNotNull();
}

@Test
public void testNullApi() {
final Item item = mock(Item.class);
when(item.getId()) //
.thenReturn(2L);
when(item.getApi()) //
.thenReturn(null);
final String url = null;
final long id = 2L;
final boolean triggered = false;
final Map<String, String> resolvedVariables = null;
final String regexpFilterText = null;
final String regexpFilterExpression = null;

final GenericTriggerResults sut =
new GenericTriggerResults(
item, resolvedVariables, regexpFilterText, regexpFilterExpression);
url, id, triggered, resolvedVariables, regexpFilterText, regexpFilterExpression);

assertThat(sut) //
.isNotNull();
Expand Down
43 changes: 43 additions & 0 deletions src/test/java/org/jenkinsci/plugins/gwt/GenericTriggerTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package org.jenkinsci.plugins.gwt;

import static org.assertj.core.api.Assertions.assertThat;
import static org.jenkinsci.plugins.gwt.GenericTrigger.HEADER_DRY_RUN;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.junit.jupiter.api.Test;

class GenericTriggerTest {

@Test
void testDryRun() {
assertThat(GenericTrigger.isDryRun(null)).isFalse();

final Map<String, List<String>> headers = new TreeMap<String, List<String>>();
assertThat(GenericTrigger.isDryRun(headers)).isFalse();

headers.put("whatever", null);
assertThat(GenericTrigger.isDryRun(headers)).isFalse();

final List<String> headerValues = Arrays.asList("true");
headers.put("whatever", headerValues);
assertThat(GenericTrigger.isDryRun(headers)).isFalse();

headers.put(HEADER_DRY_RUN, null);
assertThat(GenericTrigger.isDryRun(headers)).isFalse();

List<String> dryRunHeaderValues = Arrays.asList("false");
headers.put(HEADER_DRY_RUN, dryRunHeaderValues);
assertThat(GenericTrigger.isDryRun(headers)).isFalse();

dryRunHeaderValues = Arrays.asList("x");
headers.put(HEADER_DRY_RUN, dryRunHeaderValues);
assertThat(GenericTrigger.isDryRun(headers)).isFalse();

dryRunHeaderValues = Arrays.asList("true");
headers.put(HEADER_DRY_RUN, dryRunHeaderValues);
assertThat(GenericTrigger.isDryRun(headers)).isTrue();
}
}

0 comments on commit cc71adf

Please sign in to comment.