Skip to content

Commit 917caa5

Browse files
authored
Merge pull request #217 from KostyaSha/surviveExceptions
Survive on job exceptions during candidate gathering
2 parents fee303e + 96b6989 commit 917caa5

9 files changed

Lines changed: 158 additions & 40 deletions

File tree

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ target/
1414
*.iml
1515

1616
## Directory-based project format:
17-
.idea/
17+
.idea/*
18+
!.idea/codeStyleSettings.xml
19+
!.idea/encodings.xml
1820

1921
## File-based project format:
2022
*.ipr

.idea/codeStyleSettings.xml

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/encodings.xml

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

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

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ protected void onEvent(GHEvent event, String payload) {
5151
try {
5252
BranchInfo ref = extractRefInfo(event, payload);
5353

54-
for (Job job : getJobs(ref.getRepo())) {
54+
for (Job job : getBranchTriggerJobs(ref.getRepo())) {
5555
GitHubBranchTrigger trigger = ghBranchTriggerFromJob(job);
5656
if (isNull(trigger)) {
5757
continue;
@@ -91,20 +91,17 @@ private BranchInfo extractRefInfo(GHEvent event, String payload) throws IOExcept
9191
}
9292
}
9393

94-
private static Set<Job> getJobs(final String repo) {
94+
static Set<Job> getBranchTriggerJobs(final String repo) {
9595
final Set<Job> ret = new HashSet<>();
9696

97-
ACL.impersonate(ACL.SYSTEM, new Runnable() {
98-
@Override
99-
public void run() {
100-
List<Job> jobs = Jenkins.getActiveInstance().getAllItems(Job.class);
101-
ret.addAll(FluentIterableWrapper.from(jobs)
102-
.filter(isBuildable())
103-
.filter(withBranchTrigger())
104-
.filter(withBranchTriggerRepo(repo))
105-
.toSet()
106-
);
107-
}
97+
ACL.impersonate(ACL.SYSTEM, () -> {
98+
List<Job> jobs = Jenkins.getActiveInstance().getAllItems(Job.class);
99+
ret.addAll(FluentIterableWrapper.from(jobs)
100+
.filter(isBuildable())
101+
.filter(withBranchTrigger())
102+
.filter(withBranchTriggerRepo(repo))
103+
.toSet()
104+
);
108105
});
109106

110107
return ret;

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

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import com.google.common.base.Predicate;
55
import com.google.common.base.Predicates;
66
import hudson.model.Job;
7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
79

810
import static com.github.kostyasha.github.integration.branch.utils.JobHelper.ghBranchTriggerFromJob;
911
import static com.google.common.base.Preconditions.checkNotNull;
@@ -52,6 +54,8 @@ public boolean apply(Job job) {
5254
}
5355

5456
private static class WithBranchTriggerRepo implements Predicate<Job> {
57+
private static final Logger LOG = LoggerFactory.getLogger(WithBranchTriggerRepo.class);
58+
5559
private final String repo;
5660

5761
WithBranchTriggerRepo(String repo) {
@@ -60,12 +64,18 @@ private static class WithBranchTriggerRepo implements Predicate<Job> {
6064

6165
@Override
6266
public boolean apply(Job job) {
63-
return equalsIgnoreCase(
64-
repo,
65-
asFullRepoName(
66-
ghBranchTriggerFromJob(job).getRepoFullName(job)
67-
)
68-
);
67+
try {
68+
return equalsIgnoreCase(
69+
repo,
70+
asFullRepoName(
71+
ghBranchTriggerFromJob(job).getRepoFullName(job)
72+
)
73+
);
74+
} catch (Exception ex) {
75+
LOG.warn("Can't get GitHub repository name for {}. Have you set correct 'GitHub Project Property'?",
76+
job.getFullName(), ex);
77+
return false;
78+
}
6979
}
7080
}
7181
}

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

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ protected void onEvent(GHEvent event, String payload) {
5656

5757
PullRequestInfo info = extractPullRequestInfo(event, payload, gh);
5858

59-
for (Job job : getJobs(info.getRepo())) {
59+
for (Job job : getPRTriggerJobs(info.getRepo())) {
6060
GitHubPRTrigger trigger = ghPRTriggerFromJob(job);
6161
GitHubPRTriggerMode triggerMode = trigger.getTriggerMode();
6262

@@ -109,20 +109,17 @@ private PullRequestInfo extractPullRequestInfo(GHEvent event, String payload, Gi
109109
}
110110
}
111111

112-
private static Set<Job> getJobs(final String repo) {
112+
static Set<Job> getPRTriggerJobs(final String repo) {
113113
final Set<Job> ret = new HashSet<>();
114114

115-
ACL.impersonate(ACL.SYSTEM, new Runnable() {
116-
@Override
117-
public void run() {
118-
List<Job> jobs = Jenkins.getActiveInstance().getAllItems(Job.class);
119-
ret.addAll(FluentIterableWrapper.from(jobs)
120-
.filter(isBuildable())
121-
.filter(withPRTrigger())
122-
.filter(withRepo(repo))
123-
.toSet()
124-
);
125-
}
115+
ACL.impersonate(ACL.SYSTEM, () -> {
116+
List<Job> jobs = Jenkins.getActiveInstance().getAllItems(Job.class);
117+
ret.addAll(FluentIterableWrapper.from(jobs)
118+
.filter(isBuildable())
119+
.filter(withPRTrigger())
120+
.filter(withRepo(repo))
121+
.toSet()
122+
);
126123
});
127124

128125
return ret;

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

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import com.google.common.base.Predicates;
55
import hudson.model.Job;
66
import org.jenkinsci.plugins.github.pullrequest.GitHubPRTrigger;
7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
79

810
import static com.google.common.base.Preconditions.checkNotNull;
911
import static java.util.Arrays.asList;
@@ -49,6 +51,8 @@ public boolean apply(Job job) {
4951
}
5052

5153
private static class WithRepo implements Predicate<Job> {
54+
public static final Logger LOG = LoggerFactory.getLogger(WithRepo.class);
55+
5256
private final String repo;
5357

5458
WithRepo(String repo) {
@@ -57,12 +61,18 @@ private static class WithRepo implements Predicate<Job> {
5761

5862
@Override
5963
public boolean apply(Job job) {
60-
return equalsIgnoreCase(
61-
repo,
62-
asFullRepoName(
63-
ghPRTriggerFromJob(job).getRepoFullName(job)
64-
)
65-
);
64+
try {
65+
return equalsIgnoreCase(
66+
repo,
67+
asFullRepoName(
68+
ghPRTriggerFromJob(job).getRepoFullName(job)
69+
)
70+
);
71+
} catch (Exception ex) {
72+
LOG.warn("Can't get GitHub repository name for {}. Have you set correct 'GitHub Project Property'?",
73+
job.getFullName(), ex);
74+
return false;
75+
}
6676
}
6777
}
6878
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.github.kostyasha.github.integration.branch.webhook;
2+
3+
import antlr.ANTLRException;
4+
import com.coravy.hudson.plugins.github.GithubProjectProperty;
5+
import com.github.kostyasha.github.integration.branch.GitHubBranchTrigger;
6+
import hudson.model.FreeStyleProject;
7+
import hudson.model.Job;
8+
import org.jenkinsci.plugins.github.pullrequest.GitHubPRTriggerMode;
9+
import org.junit.Rule;
10+
import org.junit.Test;
11+
import org.jvnet.hudson.test.JenkinsRule;
12+
13+
import java.io.IOException;
14+
import java.util.Set;
15+
16+
import static com.github.kostyasha.github.integration.branch.webhook.GHBranchSubscriber.getBranchTriggerJobs;
17+
import static java.util.Collections.emptyList;
18+
import static org.hamcrest.MatcherAssert.assertThat;
19+
import static org.hamcrest.Matchers.hasItems;
20+
import static org.hamcrest.Matchers.hasSize;
21+
22+
/**
23+
* @author Kanstantsin Shautsou
24+
*/
25+
public class GHBranchSubscriberTest {
26+
27+
@Rule
28+
public JenkinsRule jRule = new JenkinsRule();
29+
30+
@Test
31+
public void dontFailOnBadJob() throws IOException, ANTLRException {
32+
String goodRepo = "https://github.com/KostyaSha-auto/test-repo";
33+
34+
final FreeStyleProject job1 = jRule.createProject(FreeStyleProject.class, "bad job");
35+
job1.addProperty(new GithubProjectProperty("http://bad.url/deep/bad/path/"));
36+
job1.addTrigger(new GitHubBranchTrigger("", GitHubPRTriggerMode.HEAVY_HOOKS_CRON, emptyList()));
37+
38+
Set<Job> jobs = getBranchTriggerJobs(goodRepo);
39+
assertThat(jobs, hasSize(0));
40+
41+
final FreeStyleProject job2 = jRule.createProject(FreeStyleProject.class, "good job");
42+
job2.addProperty(new GithubProjectProperty(goodRepo));
43+
job2.addTrigger(new GitHubBranchTrigger("", GitHubPRTriggerMode.HEAVY_HOOKS_CRON, emptyList()));
44+
45+
jobs = getBranchTriggerJobs("KostyaSha-auto/test-repo");
46+
assertThat(jobs, hasSize(1));
47+
assertThat(jobs, hasItems(job2));
48+
}
49+
50+
}

github-pullrequest-plugin/src/test/java/org/jenkinsci/plugins/github/pullrequest/webhook/GHPullRequestSubscriberTest.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package org.jenkinsci.plugins.github.pullrequest.webhook;
22

3-
import com.cloudbees.jenkins.GitHubRepositoryName;
3+
import antlr.ANTLRException;
44
import com.coravy.hudson.plugins.github.GithubProjectProperty;
55
import hudson.model.AbstractProject;
66
import hudson.model.FreeStyleProject;
77
import hudson.model.Job;
88
import org.apache.commons.io.IOUtils;
9+
import org.hamcrest.MatcherAssert;
910
import org.jenkinsci.plugins.github.pullrequest.GitHubPRTrigger;
1011
import org.jenkinsci.plugins.github.pullrequest.GitHubPRTriggerMode;
1112
import org.jenkinsci.plugins.workflow.job.WorkflowJob;
@@ -18,10 +19,15 @@
1819
import org.mockito.runners.MockitoJUnitRunner;
1920

2021
import java.io.IOException;
22+
import java.util.Set;
2123

2224
import static com.cloudbees.jenkins.GitHubRepositoryName.create;
2325
import static com.google.common.base.Charsets.UTF_8;
26+
import static java.util.Collections.emptyList;
27+
import static org.hamcrest.Matchers.hasItems;
28+
import static org.hamcrest.Matchers.hasSize;
2429
import static org.hamcrest.core.Is.is;
30+
import static org.jenkinsci.plugins.github.pullrequest.webhook.GHPullRequestSubscriber.getPRTriggerJobs;
2531
import static org.junit.Assert.assertThat;
2632
import static org.mockito.Matchers.any;
2733
import static org.mockito.Matchers.eq;
@@ -42,6 +48,26 @@ public class GHPullRequestSubscriberTest {
4248
@Mock
4349
private GitHubPRTrigger trigger;
4450

51+
@Test
52+
public void dontFailOnBadJob() throws IOException, ANTLRException {
53+
String goodRepo = "https://github.com/KostyaSha-auto/test-repo";
54+
55+
final FreeStyleProject job1 = jenkins.createProject(FreeStyleProject.class, "bad job");
56+
job1.addProperty(new GithubProjectProperty("http://bad.url/deep/bad/path/"));
57+
job1.addTrigger(new GitHubPRTrigger("", GitHubPRTriggerMode.HEAVY_HOOKS_CRON, emptyList()));
58+
59+
Set<Job> jobs = getPRTriggerJobs(goodRepo);
60+
MatcherAssert.assertThat(jobs, hasSize(0));
61+
62+
final FreeStyleProject job2 = jenkins.createProject(FreeStyleProject.class, "good job");
63+
job2.addProperty(new GithubProjectProperty(goodRepo));
64+
job2.addTrigger(new GitHubPRTrigger("", GitHubPRTriggerMode.HEAVY_HOOKS_CRON, emptyList()));
65+
66+
jobs = getPRTriggerJobs("KostyaSha-auto/test-repo");
67+
MatcherAssert.assertThat(jobs, hasSize(1));
68+
MatcherAssert.assertThat(jobs, hasItems(job2));
69+
}
70+
4571
@Test
4672
public void shouldTriggerJobOnPullRequestOpen() throws Exception {
4773
when(trigger.getRepoFullName(any(AbstractProject.class))).thenReturn(create(REPO_URL_FROM_PAYLOAD));

0 commit comments

Comments
 (0)