Skip to content

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" #61

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -65,7 +64,7 @@ class BitbucketBuildStatusHelper {
private static final BitbucketHostValidator hostValidator = new BitbucketHostValidator();

private static List<BitbucketBuildStatusResource> createBuildStatusResources(final SCM scm,
final Run<?, ?> build) throws Exception {
final Run<?, ?> build, String commitId) throws Exception {
List<BitbucketBuildStatusResource> buildStatusResources = new ArrayList<BitbucketBuildStatusResource>();

if (scm == null) {
Expand Down Expand Up @@ -118,7 +117,9 @@ private static List<BitbucketBuildStatusResource> 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;
Expand All @@ -130,19 +131,19 @@ private static List<BitbucketBuildStatusResource> createBuildStatusResources(fin
return buildStatusResources;
}

public static List<BitbucketBuildStatusResource> createBuildStatusResources(final Run<?, ?> build) throws Exception {
public static List<BitbucketBuildStatusResource> createBuildStatusResources(final Run<?, ?> build, String commitId) throws Exception {
Job<?, ?> project = build.getParent();
List<BitbucketBuildStatusResource> buildStatusResources = new ArrayList<BitbucketBuildStatusResource>();

if (project instanceof WorkflowJob) {
Collection<? extends SCM> 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;
Expand Down Expand Up @@ -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<BitbucketBuildStatusResource> buildStatusResources = createBuildStatusResources(build);
List<BitbucketBuildStatusResource> buildStatusResources = createBuildStatusResources(build, commitId);

Run<?, ?> prevBuild = build.getPreviousBuild();
List<BitbucketBuildStatusResource> prevBuildStatusResources = new ArrayList<BitbucketBuildStatusResource>();
if (prevBuild != null && prevBuild.getResult() != null && prevBuild.getResult() == Result.ABORTED) {
prevBuildStatusResources = createBuildStatusResources(prevBuild);
prevBuildStatusResources = createBuildStatusResources(prevBuild, commitId);
}

for (BitbucketBuildStatusResource buildStatusResource : buildStatusResources) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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() {
Expand All @@ -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());
Expand All @@ -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());
Expand All @@ -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());
Expand All @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,7 @@
<c:select />
</f:entry>
</f:advanced>
<f:entry title="${%Override commit ID from environment variable}" field="overrideCommitIdVar">
<f:textbox />
</f:entry>
</j:jelly>
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<div>
<p>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.</p>
</div>