From 3791dfd36a369f8004ec3e280ae9d9562a9f713b Mon Sep 17 00:00:00 2001 From: Wim van Ravesteijn Date: Mon, 16 Jan 2023 17:47:19 +0100 Subject: [PATCH] JENKINS-53232 Add possibility to take commit ID from environment variable in case the actual one is incorrect (for example due to "Merge before build" --- .../bitbucket/BitbucketBuildStatusHelper.java | 21 ++++++------ .../BitbucketBuildStatusNotifier.java | 33 +++++++++++++++++-- .../BitbucketBuildStatusNotifier/config.jelly | 3 ++ .../help-overrideCommitIdVar.html | 4 +++ 4 files changed, 48 insertions(+), 13 deletions(-) create mode 100644 src/main/resources/org/jenkinsci/plugins/bitbucket/BitbucketBuildStatusNotifier/help-overrideCommitIdVar.html diff --git a/src/main/java/org/jenkinsci/plugins/bitbucket/BitbucketBuildStatusHelper.java b/src/main/java/org/jenkinsci/plugins/bitbucket/BitbucketBuildStatusHelper.java index 16c1d8b..4cd96d8 100644 --- a/src/main/java/org/jenkinsci/plugins/bitbucket/BitbucketBuildStatusHelper.java +++ b/src/main/java/org/jenkinsci/plugins/bitbucket/BitbucketBuildStatusHelper.java @@ -46,7 +46,6 @@ import org.apache.commons.codec.digest.DigestUtils; import org.eclipse.jgit.transport.URIish; - import org.jenkinsci.plugins.bitbucket.api.BitbucketApi; import org.jenkinsci.plugins.bitbucket.api.BitbucketApiService; import org.jenkinsci.plugins.bitbucket.model.BitbucketBuildStatus; @@ -65,7 +64,7 @@ class BitbucketBuildStatusHelper { private static final BitbucketHostValidator hostValidator = new BitbucketHostValidator(); private static List createBuildStatusResources(final SCM scm, - final Run build) throws Exception { + final Run build, String commitId) throws Exception { List buildStatusResources = new ArrayList(); if (scm == null) { @@ -118,7 +117,9 @@ private static List createBuildStatusResources(fin continue; } - String commitId = commitRepoPair.getKey(); + if (commitId == null) { + commitId = commitRepoPair.getKey(); + } if (commitId == null) { logger.log(Level.INFO, "Commit ID could not be found!"); continue; @@ -130,7 +131,7 @@ private static List createBuildStatusResources(fin return buildStatusResources; } - public static List createBuildStatusResources(final Run build) throws Exception { + public static List createBuildStatusResources(final Run build, String commitId) throws Exception { Job project = build.getParent(); List buildStatusResources = new ArrayList(); @@ -138,11 +139,11 @@ public static List createBuildStatusResources(fina Collection scms = ((WorkflowJob)project).getSCMs(); for (SCM scm : scms) { - buildStatusResources.addAll(createBuildStatusResources(scm, build)); + buildStatusResources.addAll(createBuildStatusResources(scm, build, commitId)); } } else if (project instanceof AbstractProject) { SCM scm = ((AbstractProject)project).getScm(); - buildStatusResources = createBuildStatusResources(scm, build); + buildStatusResources = createBuildStatusResources(scm, build, commitId); } return buildStatusResources; @@ -220,20 +221,20 @@ private static String guessBitbucketBuildState(final Result result) { } public static void notifyBuildStatus(UsernamePasswordCredentials credentials, boolean overrideLatestBuild, - final Run build, final TaskListener listener) throws Exception { - notifyBuildStatus(credentials, overrideLatestBuild, build, listener, createBitbucketBuildStatusFromBuild(build, overrideLatestBuild), null, null); + final Run build, final TaskListener listener, String commitId) throws Exception { + notifyBuildStatus(credentials, overrideLatestBuild, build, listener, createBitbucketBuildStatusFromBuild(build, overrideLatestBuild), null, commitId); } public static void notifyBuildStatus(UsernamePasswordCredentials credentials, boolean overrideLatestBuild, final Run build, final TaskListener listener, BitbucketBuildStatus buildStatus, String repoSlug, String commitId) throws Exception { - List buildStatusResources = createBuildStatusResources(build); + List buildStatusResources = createBuildStatusResources(build, commitId); Run prevBuild = build.getPreviousBuild(); List prevBuildStatusResources = new ArrayList(); if (prevBuild != null && prevBuild.getResult() != null && prevBuild.getResult() == Result.ABORTED) { - prevBuildStatusResources = createBuildStatusResources(prevBuild); + prevBuildStatusResources = createBuildStatusResources(prevBuild, commitId); } for (BitbucketBuildStatusResource buildStatusResource : buildStatusResources) { diff --git a/src/main/java/org/jenkinsci/plugins/bitbucket/BitbucketBuildStatusNotifier.java b/src/main/java/org/jenkinsci/plugins/bitbucket/BitbucketBuildStatusNotifier.java index 19f2065..0e99412 100644 --- a/src/main/java/org/jenkinsci/plugins/bitbucket/BitbucketBuildStatusNotifier.java +++ b/src/main/java/org/jenkinsci/plugins/bitbucket/BitbucketBuildStatusNotifier.java @@ -39,11 +39,14 @@ import hudson.tasks.Publisher; import hudson.util.FormValidation; import hudson.util.ListBoxModel; +import hudson.util.LogTaskListener; +import java.io.IOException; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import jenkins.model.Jenkins; import net.sf.json.JSONObject; +import org.apache.commons.lang.StringUtils; import org.jenkinsci.plugins.bitbucket.api.BitbucketApi; import org.jenkinsci.plugins.bitbucket.api.BitbucketApiService; import org.kohsuke.stapler.AncestorInPath; @@ -60,15 +63,18 @@ public class BitbucketBuildStatusNotifier extends Notifier { private final boolean notifyFinish; private final boolean overrideLatestBuild; private final String credentialsId; + private final String overrideCommitIdVar; @DataBoundConstructor public BitbucketBuildStatusNotifier(final boolean notifyStart, final boolean notifyFinish, - final boolean overrideLatestBuild, final String credentialsId) { + final boolean overrideLatestBuild, final String credentialsId, + final String overrideCommitIdVar) { super(); this.notifyStart = notifyStart; this.notifyFinish = notifyFinish; this.overrideLatestBuild = overrideLatestBuild; this.credentialsId = credentialsId; + this.overrideCommitIdVar = overrideCommitIdVar; } public boolean getNotifyStart() { @@ -87,6 +93,10 @@ public String getCredentialsId() { return this.credentialsId != null ? this.credentialsId : this.getDescriptor().getGlobalCredentialsId(); } + public String getOverrideCommitIdVar() { + return overrideCommitIdVar; + } + private StandardUsernamePasswordCredentials getCredentials(AbstractBuild build) { StandardUsernamePasswordCredentials credentials = BitbucketBuildStatusHelper .getCredentials(getCredentialsId(), build.getProject()); @@ -106,7 +116,7 @@ public boolean prebuild(AbstractBuild build, BuildListener listener) { try { - BitbucketBuildStatusHelper.notifyBuildStatus(this.getCredentials(build), this.getOverrideLatestBuild(), build, listener); + BitbucketBuildStatusHelper.notifyBuildStatus(this.getCredentials(build), this.getOverrideLatestBuild(), build, listener, getCommitId(build)); } catch (Exception e) { listener.getLogger().println("Bitbucket notify on start failed: " + e.getMessage()); e.printStackTrace(listener.getLogger()); @@ -125,7 +135,7 @@ public boolean perform(AbstractBuild build, Launcher launcher, BuildListen logger.info("Bitbucket notify on finish"); try { - BitbucketBuildStatusHelper.notifyBuildStatus(this.getCredentials(build), this.getOverrideLatestBuild(), build, listener); + BitbucketBuildStatusHelper.notifyBuildStatus(this.getCredentials(build), this.getOverrideLatestBuild(), build, listener, getCommitId(build)); } catch (Exception e) { logger.log(Level.INFO, "Bitbucket notify on finish failed: " + e.getMessage(), e); listener.getLogger().println("Bitbucket notify on finish failed: " + e.getMessage()); @@ -137,6 +147,23 @@ public boolean perform(AbstractBuild build, Launcher launcher, BuildListen return true; } + private String getCommitId(AbstractBuild build) { + if (StringUtils.isBlank(overrideCommitIdVar)) { + return null; + } else { + try { + String commitId = build.getEnvironment(new LogTaskListener(logger, Level.INFO)).get(overrideCommitIdVar); + logger.info("Overriding commitId with " + commitId); + return commitId; + } catch (IOException e) { + logger.warning(e.getMessage()); + } catch (InterruptedException e) { + logger.warning(e.getMessage()); + } + return null; + } + } + @Override public BuildStepMonitor getRequiredMonitorService() { return BuildStepMonitor.NONE; diff --git a/src/main/resources/org/jenkinsci/plugins/bitbucket/BitbucketBuildStatusNotifier/config.jelly b/src/main/resources/org/jenkinsci/plugins/bitbucket/BitbucketBuildStatusNotifier/config.jelly index 96383b8..804d6b4 100644 --- a/src/main/resources/org/jenkinsci/plugins/bitbucket/BitbucketBuildStatusNotifier/config.jelly +++ b/src/main/resources/org/jenkinsci/plugins/bitbucket/BitbucketBuildStatusNotifier/config.jelly @@ -14,4 +14,7 @@ + + + diff --git a/src/main/resources/org/jenkinsci/plugins/bitbucket/BitbucketBuildStatusNotifier/help-overrideCommitIdVar.html b/src/main/resources/org/jenkinsci/plugins/bitbucket/BitbucketBuildStatusNotifier/help-overrideCommitIdVar.html new file mode 100644 index 0000000..346add9 --- /dev/null +++ b/src/main/resources/org/jenkinsci/plugins/bitbucket/BitbucketBuildStatusNotifier/help-overrideCommitIdVar.html @@ -0,0 +1,4 @@ +
+

When using for example "Merge before build", and a merge commit is performed, Bitbucket is notified with the commit ID of the merge commit + performed by Jenkins, which is unknown by Bitbucket. Specify here an environment variable containing the correct commit ID.

+
\ No newline at end of file