package com.cloudbees.jenkins; import edu.umd.cs.findbugs.annotations.NonNull; import hudson.Extension; import hudson.FilePath; import hudson.Launcher; import hudson.model.AbstractProject; import hudson.model.Run; import hudson.model.TaskListener; import hudson.tasks.BuildStepDescriptor; import hudson.tasks.Builder; import jenkins.tasks.SimpleBuildStep; import org.jenkinsci.plugins.github.common.ExpandableMessage; import org.jenkinsci.plugins.github.extension.status.GitHubStatusContextSource; import org.jenkinsci.plugins.github.extension.status.StatusErrorHandler; import org.jenkinsci.plugins.github.extension.status.misc.ConditionalResult; import org.jenkinsci.plugins.github.status.GitHubCommitStatusSetter; import org.jenkinsci.plugins.github.status.err.ShallowAnyErrorHandler; import org.jenkinsci.plugins.github.status.sources.AnyDefinedRepositorySource; import org.jenkinsci.plugins.github.status.sources.BuildDataRevisionShaSource; import org.jenkinsci.plugins.github.status.sources.ConditionalStatusResultSource; import org.jenkinsci.plugins.github.status.sources.DefaultCommitContextSource; import org.kohsuke.github.GHCommitState; import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.DataBoundSetter; import java.io.IOException; import java.util.Collections; import static com.google.common.base.Objects.firstNonNull; import static org.apache.commons.lang3.StringUtils.defaultIfEmpty; import static org.jenkinsci.plugins.github.status.sources.misc.AnyBuildResult.onAnyResult; @Extension public class GitHubSetCommitStatusBuilder extends Builder implements SimpleBuildStep { private static final ExpandableMessage DEFAULT_MESSAGE = new ExpandableMessage(""); private ExpandableMessage statusMessage = DEFAULT_MESSAGE; private GitHubStatusContextSource contextSource = new DefaultCommitContextSource(); @DataBoundConstructor public GitHubSetCommitStatusBuilder() { } /** * @since 1.14.1 */ public ExpandableMessage getStatusMessage() { return statusMessage; } /** * @return Context provider * @since 1.24.0 */ public GitHubStatusContextSource getContextSource() { return contextSource; } /** * @since 1.14.1 */ @DataBoundSetter public void setStatusMessage(ExpandableMessage statusMessage) { this.statusMessage = statusMessage; } /** * @since 1.24.0 */ @DataBoundSetter public void setContextSource(GitHubStatusContextSource contextSource) { this.contextSource = contextSource; } @Override public void perform(@NonNull Run<?, ?> build, @NonNull FilePath workspace, @NonNull Launcher launcher, @NonNull TaskListener listener) throws InterruptedException, IOException { GitHubCommitStatusSetter setter = new GitHubCommitStatusSetter(); setter.setReposSource(new AnyDefinedRepositorySource()); setter.setCommitShaSource(new BuildDataRevisionShaSource()); setter.setContextSource(contextSource); setter.setErrorHandlers(Collections.<StatusErrorHandler>singletonList(new ShallowAnyErrorHandler())); setter.setStatusResultSource(new ConditionalStatusResultSource( Collections.<ConditionalResult>singletonList( onAnyResult( GHCommitState.PENDING, defaultIfEmpty(firstNonNull(statusMessage, DEFAULT_MESSAGE).getContent(), Messages.CommitNotifier_Pending(build.getDisplayName())) ) ))); setter.perform(build, workspace, launcher, listener); } public Object readResolve() { if (getContextSource() == null) { setContextSource(new DefaultCommitContextSource()); } return this; } @Extension public static class Descriptor extends BuildStepDescriptor<Builder> { @Override public boolean isApplicable(Class<? extends AbstractProject> jobType) { return true; } @Override public String getDisplayName() { return Messages.GitHubSetCommitStatusBuilder_DisplayName(); } } }