Skip to content

Commit

Permalink
Merge pull request #100 from lanwen/expandable
Browse files Browse the repository at this point in the history
[FIXES JENKINS-27154] configurable build context and message in status builder and notifier
  • Loading branch information
lanwen committed Dec 14, 2015
2 parents 1ed2edd + a8c28c4 commit 8b9535d
Show file tree
Hide file tree
Showing 20 changed files with 495 additions and 122 deletions.
23 changes: 15 additions & 8 deletions pom.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
Expand Down Expand Up @@ -124,6 +125,12 @@
<version>1.1</version>
</dependency>

<dependency>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>token-macro</artifactId>
<version>1.11</version>
</dependency>

<dependency><!-- exists in the core -->
<groupId>org.jenkins-ci.modules</groupId>
<artifactId>instance-identity</artifactId>
Expand All @@ -132,6 +139,13 @@
</dependency>

<!--TEST DEPS-->
<dependency>
<groupId>com.jayway.restassured</groupId>
<artifactId>rest-assured</artifactId>
<version>2.4.0</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
Expand All @@ -153,13 +167,6 @@
<scope>test</scope>
</dependency>

<dependency>
<groupId>com.jayway.restassured</groupId>
<artifactId>rest-assured</artifactId>
<version>2.4.0</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.jenkins-ci.plugins.workflow</groupId>
<artifactId>workflow-job</artifactId>
Expand Down
138 changes: 93 additions & 45 deletions src/main/java/com/cloudbees/jenkins/GitHubCommitNotifier.java
Expand Up @@ -13,19 +13,27 @@
import hudson.tasks.Publisher;
import hudson.util.ListBoxModel;
import org.eclipse.jgit.lib.ObjectId;
import org.jenkinsci.plugins.github.common.ExpandableMessage;
import org.jenkinsci.plugins.github.util.BuildDataHelper;
import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.github.GHCommitState;
import org.kohsuke.github.GHRepository;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.DataBoundSetter;

import javax.annotation.Nonnull;
import java.io.IOException;

import static com.cloudbees.jenkins.Messages.GitHubCommitNotifier_DisplayName;
import static com.cloudbees.jenkins.Messages.GitHubCommitNotifier_SettingCommitStatus;
import static com.coravy.hudson.plugins.github.GithubProjectProperty.displayNameFor;
import static hudson.model.Result.FAILURE;
import static hudson.model.Result.SUCCESS;
import static hudson.model.Result.UNSTABLE;
import static java.lang.String.format;
import static org.apache.commons.lang3.StringUtils.defaultIfEmpty;
import static org.apache.commons.lang3.StringUtils.trimToEmpty;

/**
* Create commit status notifications on the commits based on the outcome of the build.
Expand All @@ -34,9 +42,16 @@
*/
public class GitHubCommitNotifier extends Notifier {

private ExpandableMessage statusMessage = new ExpandableMessage("");

private final String resultOnFailure;
private static final Result[] SUPPORTED_RESULTS = {FAILURE, UNSTABLE, SUCCESS};

@Restricted(NoExternalUse.class)
public GitHubCommitNotifier() {
this(getDefaultResultOnFailure().toString());
}

/**
* @since 1.10
*/
Expand All @@ -45,9 +60,19 @@ public GitHubCommitNotifier(String resultOnFailure) {
this.resultOnFailure = resultOnFailure;
}

@Deprecated
public GitHubCommitNotifier() {
this(getDefaultResultOnFailure().toString());
/**
* @since 1.14.1
*/
public ExpandableMessage getStatusMessage() {
return statusMessage;
}

/**
* @since 1.14.1
*/
@DataBoundSetter
public void setStatusMessage(ExpandableMessage statusMessage) {
this.statusMessage = statusMessage;
}

/**
Expand All @@ -60,22 +85,12 @@ public String getResultOnFailure() {

@Nonnull
public static Result getDefaultResultOnFailure() {
return SUPPORTED_RESULTS[0];
return FAILURE;
}


@Nonnull
/*package*/ Result getEffectiveResultOnFailure() {
if (resultOnFailure == null) {
return getDefaultResultOnFailure();
}

for (Result result : SUPPORTED_RESULTS) {
if (result.toString().equals(resultOnFailure)) {
return result;
}
}
return getDefaultResultOnFailure();
return Result.fromString(trimToEmpty(resultOnFailure));
}

public BuildStepMonitor getRequiredMonitorService() {
Expand All @@ -91,16 +106,14 @@ public boolean perform(AbstractBuild<?, ?> build,
return true;
} catch (IOException error) {
final Result buildResult = getEffectiveResultOnFailure();
if (buildResult.equals(Result.FAILURE)) {
if (buildResult.equals(FAILURE)) {
throw error;
} else {
listener.error(format("[GitHub Commit Notifier] - %s", error.getMessage()));
if (buildResult.isWorseThan(build.getResult())) {
listener.getLogger().println(
format("[GitHub Commit Notifier] - Build result will be set to %s", buildResult)
);
build.setResult(buildResult);
}
listener.getLogger().println(
format("[GitHub Commit Notifier] - Build result will be set to %s", buildResult)
);
build.setResult(buildResult);
}
}
return true;
Expand All @@ -109,38 +122,74 @@ public boolean perform(AbstractBuild<?, ?> build,
private void updateCommitStatus(@Nonnull AbstractBuild<?, ?> build,
@Nonnull BuildListener listener) throws InterruptedException, IOException {
final String sha1 = ObjectId.toString(BuildDataHelper.getCommitSHA1(build));

StatusResult status = statusFrom(build);
String message = defaultIfEmpty(statusMessage.expandAll(build, listener), status.getMsg());
String contextName = displayNameFor(build.getProject());

for (GitHubRepositoryName name : GitHubRepositoryNameContributor.parseAssociatedNames(build.getProject())) {
for (GHRepository repository : name.resolve()) {
GHCommitState state;
String msg;

// We do not use `build.getDurationString()` because it appends 'and counting' (build is still running)
final String duration = Util.getTimeSpanString(System.currentTimeMillis() - build.getTimeInMillis());

Result result = build.getResult();
if (result == null) { // Build is ongoing
state = GHCommitState.PENDING;
msg = Messages.CommitNotifier_Pending(build.getDisplayName());
} else if (result.isBetterOrEqualTo(SUCCESS)) {
state = GHCommitState.SUCCESS;
msg = Messages.CommitNotifier_Success(build.getDisplayName(), duration);
} else if (result.isBetterOrEqualTo(UNSTABLE)) {
state = GHCommitState.FAILURE;
msg = Messages.CommitNotifier_Unstable(build.getDisplayName(), duration);
} else {
state = GHCommitState.ERROR;
msg = Messages.CommitNotifier_Failed(build.getDisplayName(), duration);
}

listener.getLogger().println(
GitHubCommitNotifier_SettingCommitStatus(repository.getHtmlUrl() + "/commit/" + sha1)
);

repository.createCommitStatus(
sha1, state, build.getAbsoluteUrl(), msg, build.getProject().getFullName());
sha1, status.getState(), build.getAbsoluteUrl(),
message,
contextName
);
}
}
}

private static StatusResult statusFrom(@Nonnull AbstractBuild<?, ?> build) {
Result result = build.getResult();

// We do not use `build.getDurationString()` because it appends 'and counting' (build is still running)
String duration = Util.getTimeSpanString(System.currentTimeMillis() - build.getTimeInMillis());

if (result == null) { // Build is ongoing
return new StatusResult(
GHCommitState.PENDING,
Messages.CommitNotifier_Pending(build.getDisplayName())
);
} else if (result.isBetterOrEqualTo(SUCCESS)) {
return new StatusResult(
GHCommitState.SUCCESS,
Messages.CommitNotifier_Success(build.getDisplayName(), duration)
);
} else if (result.isBetterOrEqualTo(UNSTABLE)) {
return new StatusResult(
GHCommitState.FAILURE,
Messages.CommitNotifier_Unstable(build.getDisplayName(), duration)
);
} else {
return new StatusResult(
GHCommitState.ERROR,
Messages.CommitNotifier_Failed(build.getDisplayName(), duration)
);
}
}

private static class StatusResult {
private GHCommitState state;
private String msg;

public StatusResult(GHCommitState state, String msg) {
this.state = state;
this.msg = msg;
}

public GHCommitState getState() {
return state;
}

public String getMsg() {
return msg;
}
}

@Extension
public static class DescriptorImpl extends BuildStepDescriptor<Publisher> {

Expand All @@ -149,7 +198,7 @@ public boolean isApplicable(Class<? extends AbstractProject> aClass) {
}

public String getDisplayName() {
return "Set build status on GitHub commit";
return GitHubCommitNotifier_DisplayName();
}

public ListBoxModel doFillResultOnFailureItems() {
Expand All @@ -160,5 +209,4 @@ public ListBoxModel doFillResultOnFailureItems() {
return items;
}
}

}
Expand Up @@ -8,26 +8,53 @@
import hudson.tasks.BuildStepDescriptor;
import hudson.tasks.Builder;
import org.eclipse.jgit.lib.ObjectId;
import org.jenkinsci.plugins.github.common.ExpandableMessage;
import org.jenkinsci.plugins.github.util.BuildDataHelper;
import org.kohsuke.github.GHCommitState;
import org.kohsuke.github.GHRepository;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.DataBoundSetter;

import java.io.IOException;

import static com.cloudbees.jenkins.Messages.GitHubCommitNotifier_SettingCommitStatus;
import static com.coravy.hudson.plugins.github.GithubProjectProperty.displayNameFor;
import static org.apache.commons.lang3.StringUtils.defaultIfEmpty;

@Extension
public class GitHubSetCommitStatusBuilder extends Builder {
private ExpandableMessage statusMessage = new ExpandableMessage("");

@DataBoundConstructor
public GitHubSetCommitStatusBuilder() {
}

/**
* @since 1.14.1
*/
public ExpandableMessage getStatusMessage() {
return statusMessage;
}

/**
* @since 1.14.1
*/
@DataBoundSetter
public void setStatusMessage(ExpandableMessage statusMessage) {
this.statusMessage = statusMessage;
}

@Override
public boolean perform(AbstractBuild<?, ?> build,
Launcher launcher,
BuildListener listener) throws InterruptedException, IOException {
final String sha1 = ObjectId.toString(BuildDataHelper.getCommitSHA1(build));
String message = defaultIfEmpty(
statusMessage.expandAll(build, listener),
Messages.CommitNotifier_Pending(build.getDisplayName())
);
String contextName = displayNameFor(build.getProject());

for (GitHubRepositoryName name : GitHubRepositoryNameContributor.parseAssociatedNames(build.getProject())) {
for (GHRepository repository : name.resolve()) {
listener.getLogger().println(
Expand All @@ -36,8 +63,8 @@ public boolean perform(AbstractBuild<?, ?> build,
repository.createCommitStatus(sha1,
GHCommitState.PENDING,
build.getAbsoluteUrl(),
Messages.CommitNotifier_Pending(build.getDisplayName()),
build.getProject().getFullName());
message,
contextName);
}
}
return true;
Expand All @@ -52,7 +79,7 @@ public boolean isApplicable(Class<? extends AbstractProject> jobType) {

@Override
public String getDisplayName() {
return "Set build status to \"pending\" on GitHub commit";
return Messages.GitHubSetCommitStatusBuilder_DisplayName();
}
}
}

0 comments on commit 8b9535d

Please sign in to comment.