Skip to content

Commit 5f4d76b

Browse files
committed
fix: include target ref in GitHubPushCause
1 parent 7134d0a commit 5f4d76b

File tree

8 files changed

+101
-35
lines changed

8 files changed

+101
-35
lines changed

src/main/java/com/cloudbees/jenkins/GitHubPushCause.java

+15-8
Original file line numberDiff line numberDiff line change
@@ -19,38 +19,45 @@ public class GitHubPushCause extends SCMTriggerCause {
1919
* The name of the user who pushed to GitHub.
2020
*/
2121
private String pushedBy;
22+
/**
23+
* The target ref of the triggering GitHub push.
24+
*/
25+
private String ref;
2226

23-
public GitHubPushCause(String pusher) {
24-
this("", pusher);
27+
public GitHubPushCause(String pusher, String ref) {
28+
this("", pusher, ref);
2529
}
2630

27-
public GitHubPushCause(String pollingLog, String pusher) {
31+
public GitHubPushCause(String pollingLog, String pusher, String ref) {
2832
super(pollingLog);
29-
pushedBy = pusher;
33+
this.pushedBy = pusher;
34+
this.ref = ref;
3035
}
3136

32-
public GitHubPushCause(File pollingLog, String pusher) throws IOException {
37+
public GitHubPushCause(File pollingLog, String pusher, String ref) throws IOException {
3338
super(pollingLog);
34-
pushedBy = pusher;
39+
this.pushedBy = pusher;
40+
this.ref = ref;
3541
}
3642

3743
@Override
3844
public String getShortDescription() {
39-
return format("Started by GitHub push by %s", trimToEmpty(pushedBy));
45+
return format("Started by GitHub push to %s by %s", trimToEmpty(ref), trimToEmpty(pushedBy));
4046
}
4147

4248
@Override
4349
public boolean equals(Object o) {
4450
return o instanceof GitHubPushCause
4551
&& Objects.equals(this.pushedBy, ((GitHubPushCause) o).pushedBy)
52+
&& Objects.equals(this.ref, ((GitHubPushCause) o).ref)
4653
&& super.equals(o);
4754
}
4855

4956
@Override
5057
public int hashCode() {
5158
int hash = super.hashCode();
5259
hash = 89 * hash + Objects.hash(this.pushedBy);
60+
hash = 89 * hash + Objects.hash(this.ref);
5361
return hash;
5462
}
5563
}
56-

src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java

+5-3
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,11 @@ public void onPost() {
8383
/**
8484
* Called when a POST is made.
8585
*/
86-
public void onPost(String triggeredByUser) {
86+
public void onPost(String triggeredByUser, String triggeredByRef) {
8787
onPost(GitHubTriggerEvent.create()
8888
.withOrigin(SCMEvent.originOf(Stapler.getCurrentRequest()))
8989
.withTriggeredByUser(triggeredByUser)
90+
.withTriggeredByRef(triggeredByRef)
9091
.build()
9192
);
9293
}
@@ -102,6 +103,7 @@ public void onPost(final GitHubTriggerEvent event) {
102103
Job<?, ?> currentJob = notNull(job, "Job can't be null");
103104

104105
final String pushBy = event.getTriggeredByUser();
106+
final String ref = event.getTriggeredByRef();
105107
DescriptorImpl d = getDescriptor();
106108
d.checkThreadPoolSizeAndUpdateIfNecessary();
107109
d.queue.execute(new Runnable() {
@@ -150,10 +152,10 @@ public void run() {
150152
if (runPolling()) {
151153
GitHubPushCause cause;
152154
try {
153-
cause = new GitHubPushCause(getLogFileForJob(currentJob), pushBy);
155+
cause = new GitHubPushCause(getLogFileForJob(currentJob), pushBy, ref);
154156
} catch (IOException e) {
155157
LOGGER.warn("Failed to parse the polling log", e);
156-
cause = new GitHubPushCause(pushBy);
158+
cause = new GitHubPushCause(pushBy, ref);
157159
}
158160

159161
if (asParameterizedJobMixIn(currentJob).scheduleBuild(cause)) {

src/main/java/com/cloudbees/jenkins/GitHubRepositoryNameContributor.java

+17-1
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ public void parseAssociatedNames(AbstractProject<?, ?> job, Collection<GitHubRep
112112
getClass(),
113113
"parseAssociatedBranches",
114114
AbstractProject.class,
115-
Collection.class
115+
Collection.class
116116
)) {
117117
// if this impl is legacy, it cannot contribute to non-projects, so not an error
118118
if (item instanceof AbstractProject) {
@@ -151,6 +151,22 @@ public static Collection<GitHubRepositoryName> parseAssociatedNames(Item item) {
151151
return names;
152152
}
153153

154+
/**
155+
* @deprecated Use {@link #parseAssociatedBranches(Job)}
156+
*/
157+
@Deprecated
158+
public static Collection<GitHubBranch> parseAssociatedBranches(AbstractProject<?, ?> job) {
159+
return parseAssociatedBranches((Item) job);
160+
}
161+
162+
/**
163+
* @deprecated Use {@link #parseAssociatedBranches(Item)}
164+
*/
165+
@Deprecated
166+
public static Collection<GitHubBranch> parseAssociatedBranches(Job<?, ?> job) {
167+
return parseAssociatedBranches((Item) job);
168+
}
169+
154170
public static Collection<GitHubBranch> parseAssociatedBranches(Item item) {
155171
Set<GitHubBranch> names = new HashSet<GitHubBranch>();
156172
for (GitHubRepositoryNameContributor c : all()) {

src/main/java/com/cloudbees/jenkins/GitHubTrigger.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public interface GitHubTrigger {
2323
void onPost();
2424

2525
// TODO: document me
26-
void onPost(String triggeredByUser);
26+
void onPost(String triggeredByUser, String triggeredByRef);
2727

2828
/**
2929
* Obtains the list of the repositories that this trigger is looking at.

src/main/java/com/cloudbees/jenkins/GitHubTriggerEvent.java

+24-3
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,16 @@ public class GitHubTriggerEvent {
2121
* The user that the event was provided by.
2222
*/
2323
private final String triggeredByUser;
24+
/**
25+
* The target ref that the push event was for.
26+
*/
27+
private final String triggeredByRef;
2428

25-
private GitHubTriggerEvent(long timestamp, String origin, String triggeredByUser) {
29+
private GitHubTriggerEvent(long timestamp, String origin, String triggeredByUser, String triggeredByRef) {
2630
this.timestamp = timestamp;
2731
this.origin = origin;
2832
this.triggeredByUser = triggeredByUser;
33+
this.triggeredByRef = triggeredByRef;
2934
}
3035

3136
public static Builder create() {
@@ -44,6 +49,10 @@ public String getTriggeredByUser() {
4449
return triggeredByUser;
4550
}
4651

52+
public String getTriggeredByRef() {
53+
return triggeredByRef;
54+
}
55+
4756
@Override
4857
public boolean equals(Object o) {
4958
if (this == o) {
@@ -61,14 +70,18 @@ public boolean equals(Object o) {
6170
if (origin != null ? !origin.equals(that.origin) : that.origin != null) {
6271
return false;
6372
}
64-
return triggeredByUser != null ? triggeredByUser.equals(that.triggeredByUser) : that.triggeredByUser == null;
73+
if (triggeredByUser != null ? !triggeredByUser.equals(that.triggeredByUser) : that.triggeredByUser != null) {
74+
return false;
75+
}
76+
return triggeredByRef != null ? triggeredByRef.equals(that.triggeredByRef) : that.triggeredByRef == null;
6577
}
6678

6779
@Override
6880
public int hashCode() {
6981
int result = (int) (timestamp ^ (timestamp >>> 32));
7082
result = 31 * result + (origin != null ? origin.hashCode() : 0);
7183
result = 31 * result + (triggeredByUser != null ? triggeredByUser.hashCode() : 0);
84+
result = 31 * result + (triggeredByRef != null ? triggeredByRef.hashCode() : 0);
7285
return result;
7386
}
7487

@@ -78,6 +91,7 @@ public String toString() {
7891
+ "timestamp=" + timestamp
7992
+ ", origin='" + origin + '\''
8093
+ ", triggeredByUser='" + triggeredByUser + '\''
94+
+ ", triggeredByRef='" + triggeredByRef + '\''
8195
+ '}';
8296
}
8397

@@ -88,6 +102,7 @@ public static class Builder {
88102
private long timestamp;
89103
private String origin;
90104
private String triggeredByUser;
105+
private String triggeredByRef;
91106

92107
private Builder() {
93108
timestamp = System.currentTimeMillis();
@@ -108,8 +123,13 @@ public Builder withTriggeredByUser(String triggeredByUser) {
108123
return this;
109124
}
110125

126+
public Builder withTriggeredByRef(String triggeredByRef) {
127+
this.triggeredByRef = triggeredByRef;
128+
return this;
129+
}
130+
111131
public GitHubTriggerEvent build() {
112-
return new GitHubTriggerEvent(timestamp, origin, triggeredByUser);
132+
return new GitHubTriggerEvent(timestamp, origin, triggeredByUser, triggeredByRef);
113133
}
114134

115135
@Override
@@ -118,6 +138,7 @@ public String toString() {
118138
+ "timestamp=" + timestamp
119139
+ ", origin='" + origin + '\''
120140
+ ", triggeredByUser='" + triggeredByUser + '\''
141+
+ ", triggeredByRef='" + triggeredByRef + '\''
121142
+ '}';
122143
}
123144
}

src/main/java/org/jenkinsci/plugins/github/webhook/subscriber/DefaultPushGHEventSubscriber.java

+34-18
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.slf4j.Logger;
2323
import org.slf4j.LoggerFactory;
2424

25+
import java.util.Collection;
2526
import java.util.Set;
2627

2728
import static com.google.common.collect.Sets.immutableEnumSet;
@@ -66,6 +67,9 @@ protected Set<GHEvent> events() {
6667
* @param event only PUSH event
6768
*/
6869
@Override
70+
@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
71+
value = "SIC_INNER_SHOULD_BE_STATIC_ANON", justification = "anonymous inner class is acceptable"
72+
)
6973
protected void onEvent(final GHSubscriberEvent event) {
7074
GHEventPayload.Push push;
7175
try {
@@ -77,7 +81,7 @@ protected void onEvent(final GHSubscriberEvent event) {
7781
URL repoUrl = push.getRepository().getUrl();
7882
final String pusherName = push.getPusher().getName();
7983
final String ref = push.getRef();
80-
LOGGER.info("Received PushEvent for {} from {}", repoUrl, event.getOrigin());
84+
LOGGER.info("Received PushEvent for {} {} from {}", repoUrl, ref, event.getOrigin());
8185
GitHubRepositoryName fromEventRepository = GitHubRepositoryName.create(repoUrl.toExternalForm());
8286

8387
if (fromEventRepository == null) {
@@ -94,12 +98,8 @@ protected void onEvent(final GHSubscriberEvent event) {
9498
}
9599

96100
final GitHubRepositoryName changedRepository = fromEventRepository;
97-
98101
if (changedRepository != null) {
99-
// run in high privilege to see all the projects anonymous users don't see.
100-
// this is safe because when we actually schedule a build, it's a build that can
101-
// happen at some random time anyway.
102-
Runnable body = new Runnable() {
102+
final Runnable body = new Runnable() {
103103
@Override
104104
public void run() {
105105
for (Item job : Jenkins.get().getAllItems(Item.class)) {
@@ -109,32 +109,48 @@ public void run() {
109109
}
110110
String fullDisplayName = job.getFullDisplayName();
111111
LOGGER.debug("Considering to poke {}", fullDisplayName);
112-
if (!GitHubRepositoryNameContributor.parseAssociatedNames(job).contains(changedRepository)) {
113-
LOGGER.debug("Skipped {} because it doesn't have a matching repository.", fullDisplayName);
112+
final Collection<GitHubRepositoryName> names =
113+
GitHubRepositoryNameContributor.parseAssociatedNames(job);
114+
if (!names.contains(changedRepository)) {
115+
LOGGER.debug(
116+
"Skipped {} because {} doesn't have a matching repository for {}.",
117+
fullDisplayName, names, changedRepository);
114118
continue;
115119
}
116-
boolean foundBranch = false;
117-
for (GitHubBranch branch : GitHubRepositoryNameContributor.parseAssociatedBranches(job)) {
118-
if (branch.matches(changedRepository, ref)) {
119-
foundBranch = true;
120-
break;
120+
try {
121+
final Collection<GitHubBranch> branchSpecs =
122+
GitHubRepositoryNameContributor.parseAssociatedBranches(job);
123+
if (!branchSpecs.isEmpty()) {
124+
boolean foundBranch = false;
125+
for (GitHubBranch branch : branchSpecs) {
126+
if (branch.matches(changedRepository, ref)) {
127+
foundBranch = true;
128+
break;
129+
}
130+
}
131+
if (!foundBranch) {
132+
LOGGER.debug("Skipped {} because it doesn't have a matching branch specifier.",
133+
job.getFullDisplayName());
134+
continue;
135+
}
121136
}
122-
}
123-
if (!foundBranch) {
124-
LOGGER.debug("Skipped {} because it doesn't have a matching branch specifier.",
125-
job.getFullDisplayName());
126-
continue;
137+
} catch (Exception e) {
138+
LOGGER.error("parseAssociatedBranches threw exception", e);
127139
}
128140
LOGGER.info("Poked {}", fullDisplayName);
129141
trigger.onPost(GitHubTriggerEvent.create()
130142
.withTimestamp(event.getTimestamp())
131143
.withOrigin(event.getOrigin())
132144
.withTriggeredByUser(pusherName)
145+
.withTriggeredByRef(ref)
133146
.build()
134147
);
135148
}
136149
}
137150
};
151+
// run in high privilege to see all the projects anonymous users don't see.
152+
// this is safe because when we actually schedule a build, it's a build that can
153+
// happen at some random time anyway.
138154
ACL.impersonate(ACL.SYSTEM, body);
139155

140156
for (GitHubWebHook.Listener listener : ExtensionList.lookup(GitHubWebHook.Listener.class)) {

src/test/java/com/cloudbees/jenkins/GitHubPushTriggerTest.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import static org.hamcrest.MatcherAssert.assertThat;
2727
import static org.hamcrest.Matchers.is;
2828
import static org.jenkinsci.plugins.github.webhook.subscriber.DefaultPushGHEventListenerTest.TRIGGERED_BY_USER_FROM_RESOURCE;
29+
import static org.jenkinsci.plugins.github.webhook.subscriber.DefaultPushGHEventListenerTest.TRIGGERED_BY_REF_FROM_RESOURCE;
2930

3031
/**
3132
* @author lanwen (Merkushev Kirill)
@@ -69,7 +70,7 @@ public void shouldStartWorkflowByTrigger() throws Exception {
6970
buildData.buildsByBranchName = new HashMap<String, Build>();
7071
buildData.getLastBuiltRevision().setSha1(ObjectId.zeroId());
7172

72-
trigger.onPost(TRIGGERED_BY_USER_FROM_RESOURCE);
73+
trigger.onPost(TRIGGERED_BY_USER_FROM_RESOURCE, TRIGGERED_BY_REF_FROM_RESOURCE);
7374

7475
TimeUnit.SECONDS.sleep(job.getQuietPeriod());
7576
jRule.waitUntilNoActivity();

src/test/java/org/jenkinsci/plugins/github/webhook/subscriber/DefaultPushGHEventListenerTest.java

+3
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public class DefaultPushGHEventListenerTest {
2929

3030
public static final GitSCM GIT_SCM_FROM_RESOURCE = new GitSCM("ssh://[email protected]/lanwen/test.git");
3131
public static final String TRIGGERED_BY_USER_FROM_RESOURCE = "lanwen";
32+
public static final String TRIGGERED_BY_REF_FROM_RESOURCE = "refs/heads/master";
3233

3334
@Rule
3435
public JenkinsRule jenkins = new JenkinsRule();
@@ -62,6 +63,7 @@ public void shouldParsePushPayload() throws Exception {
6263
.withTimestamp(subscriberEvent.getTimestamp())
6364
.withOrigin("shouldParsePushPayload")
6465
.withTriggeredByUser(TRIGGERED_BY_USER_FROM_RESOURCE)
66+
.withTriggeredByRef(TRIGGERED_BY_REF_FROM_RESOURCE)
6567
.build()
6668
));
6769
}
@@ -85,6 +87,7 @@ public void shouldReceivePushHookOnWorkflow() throws Exception {
8587
.withTimestamp(subscriberEvent.getTimestamp())
8688
.withOrigin("shouldReceivePushHookOnWorkflow")
8789
.withTriggeredByUser(TRIGGERED_BY_USER_FROM_RESOURCE)
90+
.withTriggeredByRef(TRIGGERED_BY_REF_FROM_RESOURCE)
8891
.build()
8992
));
9093
}

0 commit comments

Comments
 (0)