package org.jenkinsci.plugins.github.status.sources; import com.cloudbees.jenkins.Messages; import hudson.Extension; import hudson.Util; import hudson.model.Descriptor; import hudson.model.Run; import hudson.model.TaskListener; import org.jenkinsci.plugins.github.extension.status.GitHubStatusResultSource; import org.kohsuke.github.GHCommitState; import org.kohsuke.stapler.DataBoundConstructor; import javax.annotation.Nonnull; import java.io.IOException; import static hudson.model.Result.FAILURE; import static hudson.model.Result.SUCCESS; import static hudson.model.Result.UNSTABLE; import static java.util.Arrays.asList; import static org.jenkinsci.plugins.github.status.sources.misc.AnyBuildResult.onAnyResult; import static org.jenkinsci.plugins.github.status.sources.misc.BetterThanOrEqualBuildResult.betterThanOrEqualTo; /** * Default way to report about build results. * Reports about time and build status * * @author lanwen (Merkushev Kirill) * @since 1.19.0 */ public class DefaultStatusResultSource extends GitHubStatusResultSource { @DataBoundConstructor public DefaultStatusResultSource() { } @Override public StatusResult get(@Nonnull Run<?, ?> run, @Nonnull TaskListener listener) throws IOException, InterruptedException { // We do not use `build.getDurationString()` because it appends 'and counting' (build is still running) String duration = Util.getTimeSpanString(System.currentTimeMillis() - run.getTimeInMillis()); return new ConditionalStatusResultSource(asList( betterThanOrEqualTo(SUCCESS, GHCommitState.SUCCESS, Messages.CommitNotifier_Success(run.getDisplayName(), duration)), betterThanOrEqualTo(UNSTABLE, GHCommitState.FAILURE, Messages.CommitNotifier_Unstable(run.getDisplayName(), duration)), betterThanOrEqualTo(FAILURE, GHCommitState.ERROR, Messages.CommitNotifier_Failed(run.getDisplayName(), duration)), onAnyResult(GHCommitState.PENDING, Messages.CommitNotifier_Pending(run.getDisplayName())) )).get(run, listener); } @Extension public static class DefaultResultSourceDescriptor extends Descriptor<GitHubStatusResultSource> { @Override public String getDisplayName() { return "One of default messages and statuses"; } } }