Skip to content

Commit 0d62ad7

Browse files
jgangemiKostyaSha
authored andcommitted
- added dsl support for comment publishing
1 parent fd9fe0c commit 0d62ad7

9 files changed

Lines changed: 210 additions & 41 deletions

File tree

github-pullrequest-plugin/src/main/java/com/github/kostyasha/github/integration/branch/GitHubBranchTrigger.java

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,8 @@
77
import com.github.kostyasha.github.integration.generic.GitHubTrigger;
88
import com.github.kostyasha.github.integration.generic.GitHubTriggerDescriptor;
99
import hudson.Extension;
10-
import hudson.model.Item;
1110
import hudson.model.Job;
1211
import hudson.triggers.Trigger;
13-
import jenkins.model.ParameterizedJobMixIn;
14-
import jenkins.triggers.SCMTriggerItem;
15-
import net.sf.json.JSONObject;
1612
import org.jenkinsci.plugins.github.pullrequest.GitHubPRTriggerMode;
1713
import org.jenkinsci.plugins.github.pullrequest.restrictions.GitHubPRBranchRestriction;
1814
import org.jenkinsci.plugins.github.pullrequest.restrictions.GitHubPRUserRestriction;
@@ -25,7 +21,6 @@
2521
import org.kohsuke.github.GitHub;
2622
import org.kohsuke.stapler.DataBoundConstructor;
2723
import org.kohsuke.stapler.DataBoundSetter;
28-
import org.kohsuke.stapler.StaplerRequest;
2924
import org.slf4j.Logger;
3025
import org.slf4j.LoggerFactory;
3126

@@ -287,25 +282,11 @@ public DescriptorImpl() {
287282
load();
288283
}
289284

290-
@Override
291-
public boolean isApplicable(Item item) {
292-
return item instanceof Job && nonNull(SCMTriggerItem.SCMTriggerItems.asSCMTriggerItem(item))
293-
&& item instanceof ParameterizedJobMixIn.ParameterizedJob;
294-
}
295-
296285
@Override
297286
public String getDisplayName() {
298287
return "Experimental: GitHub Branches";
299288
}
300289

301-
@Override
302-
public boolean configure(StaplerRequest req, JSONObject formData) throws FormException {
303-
req.bindJSON(this, formData);
304-
305-
save();
306-
return super.configure(req, formData);
307-
}
308-
309290
// list all available descriptors for choosing in job configuration
310291
public List<GitHubBranchEventDescriptor> getEventDescriptors() {
311292
return GitHubBranchEventDescriptor.all();

github-pullrequest-plugin/src/main/java/com/github/kostyasha/github/integration/generic/GitHubTriggerDescriptor.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99
import jenkins.model.Jenkins;
1010
import jenkins.model.ParameterizedJobMixIn;
1111
import jenkins.triggers.SCMTriggerItem;
12+
import net.sf.json.JSONObject;
1213
import org.jenkinsci.plugins.github.GitHubPlugin;
1314
import org.jenkinsci.plugins.github.internal.GHPluginConfigException;
1415
import org.kohsuke.github.GitHub;
16+
import org.kohsuke.stapler.StaplerRequest;
1517

1618
import javax.annotation.Nonnull;
1719
import java.net.URI;
@@ -68,6 +70,14 @@ public static GitHub githubFor(URI uri) {
6870
}
6971
}
7072

73+
@Override
74+
public boolean configure(StaplerRequest req, JSONObject formData) throws FormException {
75+
req.bindJSON(this, formData);
76+
77+
save();
78+
return super.configure(req, formData);
79+
}
80+
7181
@Override
7282
public boolean isApplicable(Item item) {
7383
return item instanceof Job && nonNull(SCMTriggerItem.SCMTriggerItems.asSCMTriggerItem(item))

github-pullrequest-plugin/src/main/java/org/jenkinsci/plugins/github/pullrequest/GitHubPRTrigger.java

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import hudson.model.Job;
1010
import hudson.triggers.Trigger;
1111
import jenkins.model.Jenkins;
12-
import net.sf.json.JSONObject;
1312
import org.jenkinsci.plugins.github.pullrequest.events.GitHubPREvent;
1413
import org.jenkinsci.plugins.github.pullrequest.events.GitHubPREventDescriptor;
1514
import org.jenkinsci.plugins.github.pullrequest.restrictions.GitHubPRBranchRestriction;
@@ -25,7 +24,6 @@
2524
import org.kohsuke.github.GitHub;
2625
import org.kohsuke.stapler.DataBoundConstructor;
2726
import org.kohsuke.stapler.DataBoundSetter;
28-
import org.kohsuke.stapler.StaplerRequest;
2927
import org.slf4j.Logger;
3028
import org.slf4j.LoggerFactory;
3129

@@ -34,7 +32,6 @@
3432
import javax.annotation.Nullable;
3533
import java.io.IOException;
3634
import java.util.ArrayList;
37-
import java.util.Collections;
3835
import java.util.Date;
3936
import java.util.List;
4037
import java.util.Set;
@@ -45,6 +42,8 @@
4542
import static com.google.common.base.Predicates.not;
4643
import static com.google.common.base.Predicates.notNull;
4744
import static java.text.DateFormat.getDateTimeInstance;
45+
import static java.util.Collections.emptyList;
46+
import static java.util.Collections.singleton;
4847
import static org.jenkinsci.plugins.github.pullrequest.GitHubPRTriggerMode.LIGHT_HOOKS;
4948
import static org.jenkinsci.plugins.github.pullrequest.trigger.check.BranchRestrictionFilter.withBranchRestriction;
5049
import static org.jenkinsci.plugins.github.pullrequest.trigger.check.LocalRepoUpdater.updateLocalRepo;
@@ -299,7 +298,7 @@ private List<GitHubPRCause> readyToBuildCauses(@Nonnull GitHubPRRepository local
299298
return causes;
300299
} catch (IOException e) {
301300
listener.error("Can't get build causes: ", e);
302-
return Collections.emptyList();
301+
return emptyList();
303302
}
304303
}
305304

@@ -314,7 +313,7 @@ private static Set<GHPullRequest> pullRequestsToCheck(@Nullable Integer prNumber
314313
@Nonnull GHRepository remoteRepo,
315314
@Nonnull GitHubPRRepository localRepo) throws IOException {
316315
if (prNumber != null) {
317-
return Collections.singleton(remoteRepo.getPullRequest(prNumber));
316+
return singleton(remoteRepo.getPullRequest(prNumber));
318317
} else {
319318
List<GHPullRequest> remotePulls = remoteRepo.getPullRequests(GHIssueState.OPEN);
320319

@@ -347,14 +346,6 @@ public String getDisplayName() {
347346
return "Build GitHub Pull Requests";
348347
}
349348

350-
@Override
351-
public boolean configure(StaplerRequest req, JSONObject formData) throws FormException {
352-
req.bindJSON(this, formData);
353-
354-
save();
355-
return super.configure(req, formData);
356-
}
357-
358349
// list all available descriptors for choosing in job configuration
359350
public List<GitHubPREventDescriptor> getEventDescriptors() {
360351
return GitHubPREventDescriptor.all();

github-pullrequest-plugin/src/main/java/org/jenkinsci/plugins/github/pullrequest/dsl/GitHubPRJobDslExtension.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.jenkinsci.plugins.github.pullrequest.GitHubPRTrigger;
1111
import org.jenkinsci.plugins.github.pullrequest.builders.GitHubPRStatusBuilder;
1212
import org.jenkinsci.plugins.github.pullrequest.dsl.context.GitHubPRTriggerDslContext;
13+
import org.jenkinsci.plugins.github.pullrequest.dsl.context.publishers.GitHubCommentPublisherDslContext;
1314
import org.jenkinsci.plugins.github.pullrequest.dsl.context.publishers.GitHubPRStatusPublisherDslContext;
1415
import org.jenkinsci.plugins.github.pullrequest.dsl.context.steps.GitHubPRStatusStepDslContext;
1516
import org.jenkinsci.plugins.github.pullrequest.publishers.impl.GitHubPRBuildStatusPublisher;
@@ -48,6 +49,19 @@ public Object commitStatusOnGH(Runnable closure) {
4849
);
4950
}
5051

52+
@DslExtensionMethod(context = PublisherContext.class)
53+
public Object commentPullRequestOnGH() {
54+
return GitHubCommentPublisherDslContext.DEFAULT_PUBLISHER;
55+
}
56+
57+
@DslExtensionMethod(context = PublisherContext.class)
58+
public Object commentPullRequestOnGH(Runnable closure) {
59+
GitHubCommentPublisherDslContext context = new GitHubCommentPublisherDslContext();
60+
executeInContext(closure, context);
61+
62+
return context.getPublisher();
63+
}
64+
5165
@DslExtensionMethod(context = StepContext.class)
5266
public Object updateStatusOnGH(Runnable closure) {
5367
GitHubPRStatusStepDslContext context = new GitHubPRStatusStepDslContext();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package org.jenkinsci.plugins.github.pullrequest.dsl.context.publishers;
2+
3+
import hudson.model.Result;
4+
5+
import org.jenkinsci.plugins.github.pullrequest.GitHubPRMessage;
6+
import org.jenkinsci.plugins.github.pullrequest.publishers.impl.GitHubPRCommentPublisher;
7+
import org.jenkinsci.plugins.github.pullrequest.utils.PublisherErrorHandler;
8+
import org.jenkinsci.plugins.github.pullrequest.utils.StatusVerifier;
9+
10+
import javaposse.jobdsl.dsl.Context;
11+
12+
public class GitHubCommentPublisherDslContext implements Context {
13+
14+
public static final GitHubPRCommentPublisher DEFAULT_PUBLISHER = new GitHubPRCommentPublisher();
15+
16+
private PublisherErrorHandler errorHandler;
17+
18+
private GitHubPRMessage message = GitHubPRCommentPublisher.DEFAULT_COMMENT;
19+
20+
private StatusVerifier verifier;
21+
22+
public void message(String comment) {
23+
message = new GitHubPRMessage(comment);
24+
}
25+
26+
public GitHubPRCommentPublisher getPublisher() {
27+
return new GitHubPRCommentPublisher(message, verifier, errorHandler);
28+
}
29+
30+
public void commentErrorIsFailure() {
31+
errorHandler = new PublisherErrorHandler(Result.FAILURE);
32+
}
33+
34+
public void commentErrorIsUnstable() {
35+
errorHandler = new PublisherErrorHandler(Result.UNSTABLE);
36+
}
37+
38+
public void onlyFailedBuilds() {
39+
verifier = new StatusVerifier(Result.FAILURE);
40+
}
41+
42+
public void onlySuccessfulBuilds() {
43+
verifier = new StatusVerifier(Result.SUCCESS);
44+
}
45+
46+
public void onlyUnstableBuilds() {
47+
verifier = new StatusVerifier(Result.UNSTABLE);
48+
}
49+
}

github-pullrequest-plugin/src/main/java/org/jenkinsci/plugins/github/pullrequest/publishers/impl/GitHubPRCommentPublisher.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,11 @@
3030
* @author Kanstantsin Shautsou
3131
*/
3232
public class GitHubPRCommentPublisher extends GitHubPRAbstractPublisher {
33+
public static final GitHubPRMessage DEFAULT_COMMENT = new GitHubPRMessage("Build ${BUILD_NUMBER} ${BUILD_STATUS}");
34+
3335
private static final Logger LOGGER = LoggerFactory.getLogger(GitHubPRCommentPublisher.class);
3436

35-
private GitHubPRMessage comment = new GitHubPRMessage("Build ${BUILD_NUMBER} ${BUILD_RESULT}");
37+
private GitHubPRMessage comment = DEFAULT_COMMENT;
3638

3739
/**
3840
* Constructor with defaults. Only for groovy UI.

github-pullrequest-plugin/src/test/java/org/jenkinsci/plugins/github/pullrequest/dsl/DslIntegrationTest.java

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import hudson.model.Descriptor;
44
import hudson.model.FreeStyleProject;
5+
import hudson.model.Result;
56
import hudson.tasks.Builder;
67
import hudson.tasks.Publisher;
78
import hudson.triggers.Trigger;
@@ -16,6 +17,7 @@
1617
import org.jenkinsci.plugins.github.pullrequest.events.GitHubPREvent;
1718
import org.jenkinsci.plugins.github.pullrequest.events.impl.GitHubPRNumber;
1819
import org.jenkinsci.plugins.github.pullrequest.publishers.impl.GitHubPRBuildStatusPublisher;
20+
import org.jenkinsci.plugins.github.pullrequest.publishers.impl.GitHubPRCommentPublisher;
1921
import org.junit.Rule;
2022
import org.junit.Test;
2123
import org.jvnet.hudson.test.JenkinsRule;
@@ -73,14 +75,7 @@ public void shouldCreateJobWithExtendedDsl() throws Exception {
7375
((GitHubPRStatusBuilder) builders.get(0)).getStatusMessage().getContent(),
7476
equalTo(JOB_DSL_BUILDER_TEXT_CONTENT));
7577

76-
77-
DescribableList<Publisher, Descriptor<Publisher>> publishers = generated.getPublishersList();
78-
79-
assertThat("Should add publisher", publishers, hasSize(1));
80-
assertThat("Should add status publisher", publishers.get(0), instanceOf(GitHubPRBuildStatusPublisher.class));
81-
assertThat("Should add 2 packages",
82-
((GitHubPRBuildStatusPublisher) publishers.get(0)).getStatusMsg().getContent(),
83-
equalTo(JOB_DSL_PUBLISHER_TEXT_CONTENT));
78+
verifyPublishers(generated.getPublishersList());
8479

8580
Collection<Trigger<?>> triggers = generated.getTriggers().values();
8681
assertThat("Should add trigger", triggers, hasSize(1));
@@ -105,4 +100,20 @@ public void shouldCreateJobWithExtendedDsl() throws Exception {
105100
assertThat(((GitHubPRNumber) event).isSkip(), is(true));
106101
assertThat(((GitHubPRNumber) event).isMatch(), is(true));
107102
}
103+
104+
private void verifyPublishers(DescribableList<Publisher, Descriptor<Publisher>> publishers) {
105+
assertThat("Should add publisher", publishers, hasSize(2));
106+
107+
assertThat("Should add status publisher", publishers.get(0), instanceOf(GitHubPRBuildStatusPublisher.class));
108+
assertThat("Should add 2 packages",
109+
((GitHubPRBuildStatusPublisher) publishers.get(0)).getStatusMsg().getContent(),
110+
equalTo(JOB_DSL_PUBLISHER_TEXT_CONTENT));
111+
112+
assertThat("Has comment publisher", publishers.get(1), instanceOf(GitHubPRCommentPublisher.class));
113+
GitHubPRCommentPublisher commentPublisher = (GitHubPRCommentPublisher) publishers.get(1);
114+
115+
assertThat("Comment matches", commentPublisher.getComment().getContent(), equalTo("comment"));
116+
assertThat("Only failed builds", commentPublisher.getStatusVerifier().getBuildStatus(), equalTo(Result.FAILURE));
117+
assertThat("Publish marked as failure", commentPublisher.getErrorHandler().getBuildStatus(), equalTo(Result.FAILURE));
118+
}
108119
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package org.jenkinsci.plugins.github.pullrequest.dsl.context.publishers;
2+
3+
import hudson.model.Result;
4+
5+
import org.junit.Before;
6+
import org.junit.Test;
7+
8+
import static org.hamcrest.MatcherAssert.assertThat;
9+
import static org.hamcrest.Matchers.equalTo;
10+
11+
public class GitHubCommentPublisherDslContextTest {
12+
13+
private static final String COMMENT = "comment";
14+
15+
private GitHubCommentPublisherDslContext context;
16+
17+
@Before
18+
public void before() {
19+
context = new GitHubCommentPublisherDslContext();
20+
}
21+
22+
@Test
23+
public void testPublisherErrorIsFailure() {
24+
whenCommentErrorIsFailure();
25+
thenErrorHandlerHandlesFailures();
26+
}
27+
28+
@Test
29+
public void testPublisherErrorIsUnstable() {
30+
whenCommentErrorIsUnstable();
31+
thenErrorHandlerHandlesUnstable();
32+
}
33+
34+
@Test
35+
public void testOnlyFailedBuilds() {
36+
whenOnlyFailedBuilds();
37+
thenVerifyHandlesFailed();
38+
}
39+
40+
@Test
41+
public void testOnlySuccessfulBuilds() {
42+
whenOnlySuccessfulBuilds();
43+
thenVerifyHandlesSuccess();
44+
}
45+
46+
@Test
47+
public void testOnlyUnstableBuilds() {
48+
whenOnlyUnstableBuilds();
49+
thenVerifyHandlesUnstable();
50+
}
51+
52+
@Test
53+
public void testPublisherComment() {
54+
whenSetPublisherComment();
55+
thenPublisherCommentMatches();
56+
}
57+
58+
private void thenErrorHandlerHandlesFailures() {
59+
assertThat("Publish marked as failure", context.getPublisher().getErrorHandler().getBuildStatus(), equalTo(Result.FAILURE));
60+
}
61+
62+
private void thenErrorHandlerHandlesUnstable() {
63+
assertThat("Publish marked as unstable", context.getPublisher().getErrorHandler().getBuildStatus(), equalTo(Result.UNSTABLE));
64+
}
65+
66+
private void thenPublisherCommentMatches() {
67+
assertThat("Comment matches", context.getPublisher().getComment().getContent(), equalTo(COMMENT));
68+
}
69+
70+
private void thenVerifyHandlesFailed() {
71+
assertThat("Verifier handles failed", context.getPublisher().getStatusVerifier().getBuildStatus(), equalTo(Result.FAILURE));
72+
}
73+
74+
private void thenVerifyHandlesSuccess() {
75+
assertThat("Verifier handles success", context.getPublisher().getStatusVerifier().getBuildStatus(), equalTo(Result.SUCCESS));
76+
}
77+
78+
private void thenVerifyHandlesUnstable() {
79+
assertThat("Verifier handles unstable", context.getPublisher().getStatusVerifier().getBuildStatus(), equalTo(Result.UNSTABLE));
80+
}
81+
82+
private void whenCommentErrorIsFailure() {
83+
context.commentErrorIsFailure();
84+
}
85+
86+
private void whenCommentErrorIsUnstable() {
87+
context.commentErrorIsUnstable();
88+
}
89+
90+
private void whenOnlyFailedBuilds() {
91+
context.onlyFailedBuilds();
92+
}
93+
94+
private void whenOnlySuccessfulBuilds() {
95+
context.onlySuccessfulBuilds();
96+
}
97+
98+
private void whenOnlyUnstableBuilds() {
99+
context.onlyUnstableBuilds();
100+
}
101+
102+
private void whenSetPublisherComment() {
103+
context.message(COMMENT);
104+
}
105+
}

0 commit comments

Comments
 (0)