Skip to content

Commit

Permalink
[FIXED JENKINS-41815] Expose event origin to listeners
Browse files Browse the repository at this point in the history
  • Loading branch information
stephenc committed Feb 10, 2017
1 parent e3f026a commit ba6431b
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 60 deletions.
4 changes: 2 additions & 2 deletions pom.xml
Expand Up @@ -35,7 +35,7 @@
<dependency>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>scm-api</artifactId>
<version>2.0.2</version>
<version>2.0.3</version>
</dependency>
<dependency>
<groupId>org.jenkins-ci.plugins</groupId>
Expand All @@ -62,7 +62,7 @@
<dependency>
<groupId>com.coravy.hudson.plugins.github</groupId>
<artifactId>github</artifactId>
<version>1.25.1</version>
<version>1.26.0</version>
</dependency>
<dependency>
<groupId>org.jenkins-ci.plugins</groupId>
Expand Down
Expand Up @@ -44,6 +44,7 @@
import jenkins.scm.api.SCMSourceEvent;
import jenkins.util.Timer;
import org.jenkinsci.plugins.github.extension.GHEventsSubscriber;
import org.jenkinsci.plugins.github.extension.GHSubscriberEvent;
import org.kohsuke.github.GHEvent;
import org.kohsuke.github.GHEventPayload;
import org.kohsuke.github.GitHub;
Expand Down Expand Up @@ -83,18 +84,16 @@ protected Set<GHEvent> events() {
return immutableEnumSet(REPOSITORY);
}

/**
* @param event only REPOSITORY event
* @param payload payload of gh-event. Never blank
*/
@Override
protected void onEvent(GHEvent event, String payload) {
protected void onEvent(GHSubscriberEvent event) {
try {
final GHEventPayload.Repository p = GitHub.offline()
.parseEventPayload(new StringReader(payload), GHEventPayload.Repository.class);
.parseEventPayload(new StringReader(event.getPayload()), GHEventPayload.Repository.class);
String action = p.getAction();
String repoUrl = p.getRepository().getHtmlUrl().toExternalForm();
LOGGER.log(Level.FINE, "Received {0} for {1}", new Object[]{event, repoUrl});
LOGGER.log(Level.FINE, "Received {0} for {1} from {2}",
new Object[]{event.getGHEvent(), repoUrl, event.getOrigin()}
);
boolean fork = p.getRepository().isFork();
Matcher matcher = REPOSITORY_NAME_PATTERN.matcher(repoUrl);
if (matcher.matches()) {
Expand All @@ -113,7 +112,7 @@ protected void onEvent(GHEvent event, String payload) {
repo.getRepositoryName());
return;
}
final NewSCMSourceEvent e = new NewSCMSourceEvent(p, repo);
final NewSCMSourceEvent e = new NewSCMSourceEvent(event.getTimestamp(), event.getOrigin(), p, repo);
// Delaying the indexing for some seconds to avoid GitHub cache
Timer.get().schedule(new Runnable() {
@Override
Expand All @@ -125,8 +124,8 @@ public void run() {
LOGGER.log(WARNING, "Malformed repository URL {0}", repoUrl);
}
} catch (IOException e) {
LogRecord lr = new LogRecord(Level.WARNING, "Could not parse {0} event with payload: {1}");
lr.setParameters(new Object[]{event, payload});
LogRecord lr = new LogRecord(Level.WARNING, "Could not parse {0} event from {1} with payload: {2}");
lr.setParameters(new Object[]{event.getGHEvent(), event.getOrigin(), event.getPayload()});
lr.setThrown(e);
LOGGER.log(lr);
}
Expand All @@ -137,8 +136,9 @@ private static class NewSCMSourceEvent extends SCMSourceEvent<GHEventPayload.Rep
private final String repoOwner;
private final String repository;

public NewSCMSourceEvent(GHEventPayload.Repository event, GitHubRepositoryName repo) {
super(Type.CREATED, event);
public NewSCMSourceEvent(long timestamp, String origin, GHEventPayload.Repository event,
GitHubRepositoryName repo) {
super(Type.CREATED, timestamp, event, origin);
this.repoHost = repo.getHost();
this.repoOwner = event.getRepository().getOwnerName();
this.repository = event.getRepository().getName();
Expand Down
Expand Up @@ -28,7 +28,6 @@
import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.Extension;
import hudson.model.Item;
import hudson.model.Job;
import hudson.scm.SCM;
import java.io.IOException;
import java.io.StringReader;
Expand All @@ -53,6 +52,7 @@
import jenkins.scm.api.SCMSourceOwner;
import jenkins.util.Timer;
import org.jenkinsci.plugins.github.extension.GHEventsSubscriber;
import org.jenkinsci.plugins.github.extension.GHSubscriberEvent;
import org.kohsuke.github.GHEvent;
import org.kohsuke.github.GHEventPayload;
import org.kohsuke.github.GHPullRequest;
Expand Down Expand Up @@ -102,18 +102,16 @@ protected Set<GHEvent> events() {
return immutableEnumSet(PULL_REQUEST);
}

/**
* @param event only PULL_REQUEST event
* @param payload payload of gh-event. Never blank
*/
@Override
protected void onEvent(GHEvent event, String payload) {
protected void onEvent(GHSubscriberEvent event) {
try {
final GHEventPayload.PullRequest p = GitHub.offline()
.parseEventPayload(new StringReader(payload), GHEventPayload.PullRequest.class);
.parseEventPayload(new StringReader(event.getPayload()), GHEventPayload.PullRequest.class);
String action = p.getAction();
String repoUrl = p.getRepository().getHtmlUrl().toExternalForm();
LOGGER.log(Level.INFO, "Received {0} for {1}", new Object[]{event, repoUrl});
LOGGER.log(Level.INFO, "Received {0} for {1} from {2}",
new Object[]{event.getGHEvent(), repoUrl, event.getOrigin()}
);
Matcher matcher = REPOSITORY_NAME_PATTERN.matcher(repoUrl);
if (matcher.matches()) {
final GitHubRepositoryName changedRepository = GitHubRepositoryName.create(repoUrl);
Expand All @@ -123,45 +121,57 @@ protected void onEvent(GHEvent event, String payload) {
}

if ("opened".equals(action)) {
Timer.get().schedule(new Runnable() {

@Override
public void run() {
SCMHeadEvent.fireNow(new SCMHeadEventImpl(SCMEvent.Type.CREATED, p, changedRepository));
}
}, 5, TimeUnit.SECONDS);
fireAfterDelay(new SCMHeadEventImpl(
SCMEvent.Type.CREATED,
event.getTimestamp(),
p,
changedRepository,
event.getOrigin()
));
} else if ("reopened".equals(action) || "synchronize".equals(action)) {
Timer.get().schedule(new Runnable() {
@Override
public void run() {
SCMHeadEvent.fireNow(new SCMHeadEventImpl(SCMEvent.Type.UPDATED, p, changedRepository));
}
}, 5, TimeUnit.SECONDS);
fireAfterDelay(new SCMHeadEventImpl(
SCMEvent.Type.UPDATED,
event.getTimestamp(),
p,
changedRepository,
event.getOrigin()
));
} else if ("closed".equals(action)) {
Timer.get().schedule(new Runnable() {
@Override
public void run() {
SCMHeadEvent.fireNow(new SCMHeadEventImpl(SCMEvent.Type.REMOVED, p, changedRepository));
}
}, 5, TimeUnit.SECONDS);
fireAfterDelay(new SCMHeadEventImpl(
SCMEvent.Type.REMOVED,
event.getTimestamp(),
p,
changedRepository,
event.getOrigin()
));
}
}

} catch (IOException e) {
LogRecord lr = new LogRecord(Level.WARNING, "Could not parse {0} event with payload: {1}");
lr.setParameters(new Object[]{event, payload});
LogRecord lr = new LogRecord(Level.WARNING, "Could not parse {0} event from {1} with payload: {2}");
lr.setParameters(new Object[]{event.getGHEvent(), event.getOrigin(), event.getPayload()});
lr.setThrown(e);
LOGGER.log(lr);
}
}

private void fireAfterDelay(final SCMHeadEventImpl e) {
Timer.get().schedule(new Runnable() {
@Override
public void run() {
SCMHeadEvent.fireNow(e);
}
}, 5, TimeUnit.SECONDS);
}

private static class SCMHeadEventImpl extends SCMHeadEvent<GHEventPayload.PullRequest> {
private final String repoHost;
private final String repoOwner;
private final String repository;

public SCMHeadEventImpl(Type type, GHEventPayload.PullRequest pullRequest, GitHubRepositoryName repo) {
super(type, pullRequest);
public SCMHeadEventImpl(Type type, long timestamp, GHEventPayload.PullRequest pullRequest, GitHubRepositoryName repo,
String origin) {
super(type, timestamp, pullRequest, origin);
this.repoHost = repo.getHost();
this.repoOwner = pullRequest.getRepository().getOwnerName();
this.repository = pullRequest.getRepository().getName();
Expand Down
Expand Up @@ -28,7 +28,6 @@
import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.Extension;
import hudson.model.Item;
import hudson.model.Job;
import hudson.scm.SCM;
import java.io.StringReader;
import java.util.Collections;
Expand All @@ -51,6 +50,7 @@
import jenkins.scm.api.SCMSourceOwner;
import jenkins.util.Timer;
import org.jenkinsci.plugins.github.extension.GHEventsSubscriber;
import org.jenkinsci.plugins.github.extension.GHSubscriberEvent;
import org.kohsuke.github.GHEvent;
import org.kohsuke.github.GHEventPayload;
import org.kohsuke.github.GHRepository;
Expand Down Expand Up @@ -99,17 +99,15 @@ protected Set<GHEvent> events() {
return immutableEnumSet(PUSH);
}

/**
* @param event only PULL_REQUEST event
* @param payload payload of gh-event. Never blank
*/
@Override
protected void onEvent(GHEvent event, String payload) {
protected void onEvent(GHSubscriberEvent event) {
try {
final GHEventPayload.Push p = GitHub.offline()
.parseEventPayload(new StringReader(payload), GHEventPayload.Push.class);
.parseEventPayload(new StringReader(event.getPayload()), GHEventPayload.Push.class);
String repoUrl = p.getRepository().getHtmlUrl().toExternalForm();
LOGGER.log(Level.INFO, "Received {0} for {1}", new Object[]{event, repoUrl});
LOGGER.log(Level.INFO, "Received {0} for {1} from {2}",
new Object[]{event.getGHEvent(), repoUrl, event.getOrigin()}
);
Matcher matcher = REPOSITORY_NAME_PATTERN.matcher(repoUrl);
if (matcher.matches()) {
final GitHubRepositoryName changedRepository = GitHubRepositoryName.create(repoUrl);
Expand All @@ -119,20 +117,38 @@ protected void onEvent(GHEvent event, String payload) {
}

if (p.isCreated()) {
fireAfterDelay(new SCMHeadEventImpl(SCMEvent.Type.CREATED, p, changedRepository));
fireAfterDelay(new SCMHeadEventImpl(
SCMEvent.Type.CREATED,
event.getTimestamp(),
p,
changedRepository,
event.getOrigin()
));
} else if (p.isDeleted()) {
fireAfterDelay(new SCMHeadEventImpl(SCMEvent.Type.REMOVED, p, changedRepository));
fireAfterDelay(new SCMHeadEventImpl(
SCMEvent.Type.REMOVED,
event.getTimestamp(),
p,
changedRepository,
event.getOrigin()
));
} else {
fireAfterDelay(new SCMHeadEventImpl(SCMEvent.Type.UPDATED, p, changedRepository));
fireAfterDelay(new SCMHeadEventImpl(
SCMEvent.Type.UPDATED,
event.getTimestamp(),
p,
changedRepository,
event.getOrigin()
));
}
} else {
LOGGER.log(Level.WARNING, "{0} does not match expected repository name pattern", repoUrl);
}
} catch (Error e) {
throw e;
} catch (Throwable e) {
LogRecord lr = new LogRecord(Level.WARNING, "Could not parse {0} event with payload: {1}");
lr.setParameters(new Object[]{event, payload});
LogRecord lr = new LogRecord(Level.WARNING, "Could not parse {0} event from {1} with payload: {2}");
lr.setParameters(new Object[]{event.getGHEvent(), event.getOrigin(), event.getPayload()});
lr.setThrown(e);
LOGGER.log(lr);
}
Expand All @@ -152,8 +168,8 @@ private static class SCMHeadEventImpl extends SCMHeadEvent<GHEventPayload.Push>
private final String repoOwner;
private final String repository;

public SCMHeadEventImpl(Type type, GHEventPayload.Push pullRequest, GitHubRepositoryName repo) {
super(type, pullRequest);
public SCMHeadEventImpl(Type type, long timestamp, GHEventPayload.Push pullRequest, GitHubRepositoryName repo, String origin) {
super(type, timestamp, pullRequest, origin);
this.repoHost = repo.getHost();
this.repoOwner = pullRequest.getRepository().getOwnerName();
this.repository = pullRequest.getRepository().getName();
Expand Down

0 comments on commit ba6431b

Please sign in to comment.