Skip to content

Commit

Permalink
Branch compare feature (#73)
Browse files Browse the repository at this point in the history
* us #584005 : Branch Compare : expand Jenkins Plugin Capabilities - find common hash id
  • Loading branch information
dshmaya authored and m-seldin committed Mar 22, 2018
1 parent 39b0160 commit 36edfa9
Show file tree
Hide file tree
Showing 5 changed files with 160 additions and 34 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,16 @@
import com.hpe.application.automation.tools.octane.model.processors.builders.WorkFlowRunProcessor;
import com.hpe.application.automation.tools.octane.model.processors.parameters.ParameterProcessors;
import com.hpe.application.automation.tools.octane.model.processors.projects.JobProcessorFactory;
import com.hpe.application.automation.tools.octane.model.processors.scm.SCMProcessor;
import com.hpe.application.automation.tools.octane.model.processors.scm.SCMProcessors;
import com.hpe.application.automation.tools.octane.tests.TestListener;
import com.hpe.application.automation.tools.octane.tests.build.BuildHandlerUtils;
import hudson.Extension;
import hudson.matrix.MatrixConfiguration;
import hudson.matrix.MatrixRun;
import hudson.model.*;
import hudson.model.listeners.RunListener;
import hudson.scm.SCM;
import jenkins.model.Jenkins;

import java.util.Collection;
Expand Down Expand Up @@ -143,28 +146,25 @@ public void onStarted(final Run r, TaskListener listener) {

@Override
public void onFinalized(Run r) {
if (!ConfigurationService.getServerConfiguration().isValid()) {
return;
}
if (ConfigurationService.getModel().isSuspend()) {
return;
}
if (onFinelizedValidations()) return;

SCMProcessor.CommonOriginRevision commonOriginRevision = getCommonOriginRevision(r);

boolean hasTests = testListener.processBuild(r);

CIBuildResult result;
if (r.getResult() == Result.SUCCESS) {
result = CIBuildResult.SUCCESS;
} else if (r.getResult() == Result.ABORTED) {
result = CIBuildResult.ABORTED;
} else if (r.getResult() == Result.FAILURE) {
result = CIBuildResult.FAILURE;
} else if (r.getResult() == Result.UNSTABLE) {
result = CIBuildResult.UNSTABLE;
} else {
result = CIBuildResult.UNAVAILABLE;
result = getCiBuildResult(r);
CIEvent event = getCiEvent(r, commonOriginRevision, hasTests, result);

if (r instanceof AbstractBuild) {
event.setParameters(ParameterProcessors.getInstances(r))
.setProjectDisplayName(BuildHandlerUtils.getJobCiId(r));
}
CIEvent event = dtoFactory.newDTO(CIEvent.class)
OctaneSDK.getInstance().getEventsService().publishEvent(event);
}

private CIEvent getCiEvent(Run r, SCMProcessor.CommonOriginRevision commonOriginRevision, boolean hasTests, CIBuildResult result) {
return dtoFactory.newDTO(CIEvent.class)
.setEventType(CIEventType.FINISHED)
.setBuildCiId(BuildHandlerUtils.getBuildCiId(r))
.setNumber(String.valueOf(r.getNumber()))
Expand All @@ -174,13 +174,44 @@ public void onFinalized(Run r) {
.setCauses(CIEventCausesFactory.processCauses(extractCauses(r)))
.setResult(result)
.setDuration(r.getDuration())
.setCommonHashId(commonOriginRevision != null ? commonOriginRevision.revision : null)
.setBranchName(commonOriginRevision != null ? commonOriginRevision.branch : null)
.setTestResultExpected(hasTests);
}

if (r instanceof AbstractBuild) {
event.setParameters(ParameterProcessors.getInstances(r))
.setProjectDisplayName(BuildHandlerUtils.getJobCiId(r));
private boolean onFinelizedValidations() {
return (!ConfigurationService.getServerConfiguration().isValid() ||
ConfigurationService.getModel().isSuspend());
}

private CIBuildResult getCiBuildResult(Run r) {
CIBuildResult result;
if (r.getResult() == Result.SUCCESS) {
result = CIBuildResult.SUCCESS;
} else if (r.getResult() == Result.ABORTED) {
result = CIBuildResult.ABORTED;
} else if (r.getResult() == Result.FAILURE) {
result = CIBuildResult.FAILURE;
} else if (r.getResult() == Result.UNSTABLE) {
result = CIBuildResult.UNSTABLE;
} else {
result = CIBuildResult.UNAVAILABLE;
}
OctaneSDK.getInstance().getEventsService().publishEvent(event);
return result;
}

private SCMProcessor.CommonOriginRevision getCommonOriginRevision(Run r) {
SCMProcessor.CommonOriginRevision commonOriginRevision=null;
if(r instanceof AbstractBuild) {
final SCM scm = ((AbstractBuild) r).getProject().getScm();
if (scm != null) {
SCMProcessor scmProcessor = SCMProcessors.getAppropriate(scm.getClass().getName());
if(scmProcessor!=null) {
commonOriginRevision = scmProcessor.getCommonOriginRevision(r);
}
}
}
return commonOriginRevision;
}

// TODO: [YG] this method should be part of causes factory or something like this, it is not suitable for merged build as well
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import com.hp.octane.integrations.dto.scm.SCMRepository;
import com.hp.octane.integrations.dto.scm.SCMType;
import hudson.model.AbstractBuild;
import hudson.model.Run;
import hudson.model.User;
import hudson.model.UserProperty;
import hudson.scm.ChangeLogSet;
Expand Down Expand Up @@ -83,6 +84,11 @@ public List<SCMData> getSCMData(WorkflowRun run) {
return null;
}

@Override
public CommonOriginRevision getCommonOriginRevision(Run run) {
return null;
}

private ArrayList<SCMCommit> buildScmCommits(ChangeLogSet<ChangeLogSet.Entry> changes) {
ArrayList<SCMCommit> tmpCommits = new ArrayList<>();
ArrayList<SCMChange> tmpChanges;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,25 +34,33 @@
package com.hpe.application.automation.tools.octane.model.processors.scm;

import com.hp.octane.integrations.dto.DTOFactory;
import com.hp.octane.integrations.dto.scm.SCMChange;
import com.hp.octane.integrations.dto.scm.SCMCommit;
import com.hp.octane.integrations.dto.scm.SCMData;
import com.hp.octane.integrations.dto.scm.SCMRepository;
import com.hp.octane.integrations.dto.scm.SCMType;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
import hudson.model.User;
import hudson.model.UserProperty;
import com.hp.octane.integrations.dto.scm.*;
import hudson.FilePath;
import hudson.model.*;
import hudson.plugins.git.Branch;
import hudson.plugins.git.BranchSpec;
import hudson.plugins.git.GitChangeSet;
import hudson.plugins.git.GitSCM;
import hudson.plugins.git.util.BuildData;
import hudson.remoting.VirtualChannel;
import hudson.scm.ChangeLogSet;
import hudson.scm.SCM;
import hudson.tasks.Mailer;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.errors.NoMergeBaseException;
import org.eclipse.jgit.internal.JGitText;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.revwalk.filter.RevFilter;
import org.jenkinsci.plugins.workflow.job.WorkflowRun;

import java.io.File;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;

Expand Down Expand Up @@ -123,6 +131,77 @@ public List<SCMData> getSCMData(WorkflowRun run) {
}
return result;
}
@Override
public CommonOriginRevision getCommonOriginRevision(Run r) {
//for phase 1 this is hard coded since its not possible to calculate it, and configuration from outside will complicate the feature
//so for this phase we keep it hardcoded.
String MASTER = "refs/remotes/origin/master";
CommonOriginRevision commonOriginRevision=new CommonOriginRevision();

try {
AbstractBuild abstractBuild = (AbstractBuild) r;
File repoDir = new File(getRemoteString(abstractBuild) + File.separator +".git");
Git git = Git.open(repoDir);
Repository repo = git.getRepository();
final RevWalk walk = new RevWalk(repo);

ObjectId resolveForCurrentBranch = repo.resolve(Constants.HEAD);
RevCommit currentBranchCommit = walk.parseCommit(resolveForCurrentBranch);
ObjectId resolveForMaster = repo.resolve(MASTER);
RevCommit masterCommit = walk.parseCommit(resolveForMaster);

walk.reset();
walk.setRevFilter(RevFilter.MERGE_BASE);
walk.markStart(currentBranchCommit);
walk.markStart(masterCommit);
final RevCommit base = walk.next();
if (base == null)
return commonOriginRevision;
final RevCommit base2 = walk.next();
if (base2 != null) {
throw new NoMergeBaseException(NoMergeBaseException.MergeBaseFailureReason.MULTIPLE_MERGE_BASES_NOT_SUPPORTED,
MessageFormat.format(JGitText.get().multipleMergeBasesFor, currentBranchCommit.name(), masterCommit.name(), base.name(), base2.name()));
}
commonOriginRevision.revision=base.getId().getName();
commonOriginRevision.branch=getBranchName(r);

} catch (Exception e) {
logger.error("getLatestCommonCommit exception: " + e.getMessage(), e);
return commonOriginRevision;
}
return commonOriginRevision;
}

public String getBranchName(Run r) {
try {
SCM scm = ((AbstractBuild) r).getProject().getScm();
if (scm instanceof GitSCM) {
GitSCM git = (GitSCM) scm;
List<BranchSpec> branches = git.getBranches();
String rawBranchName = branches.get(0).toString();
String branchName = rawBranchName.substring(2); //trunk the '*/' from the '*/<branch name>' in order to get clean branch name
return branchName;
}

} catch (Exception e) {

}
return null;
}

private static String getRemoteString(AbstractBuild r){
if(r.getWorkspace().isRemote())
{
VirtualChannel vc = r.getWorkspace().getChannel();
String fp = r.getWorkspace().getRemote();
String remote = new FilePath(vc, fp).getRemote();
return remote;
}
else {
String remote = r.getWorkspace().getRemote();
return remote;
}
}

private List<SCMCommit> getCommits(ChangeLogSet<? extends ChangeLogSet.Entry> changes) {
List<SCMCommit> commits = new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@

import com.hp.octane.integrations.dto.scm.SCMData;
import hudson.model.AbstractBuild;
import hudson.model.Run;
import org.jenkinsci.plugins.workflow.job.WorkflowRun;

import java.util.List;
Expand All @@ -48,4 +49,11 @@ public interface SCMProcessor {
SCMData getSCMData(AbstractBuild build);

List<SCMData> getSCMData(WorkflowRun run);

CommonOriginRevision getCommonOriginRevision(Run run);

class CommonOriginRevision {
public String branch;
public String revision;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,7 @@
import com.hp.octane.integrations.dto.scm.SCMData;
import com.hp.octane.integrations.dto.scm.SCMRepository;
import com.hp.octane.integrations.dto.scm.SCMType;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
import hudson.model.User;
import hudson.model.UserProperty;
import hudson.model.*;
import hudson.scm.ChangeLogSet;
import hudson.scm.SubversionChangeLogSet;
import hudson.scm.SubversionSCM;
Expand Down Expand Up @@ -99,6 +96,11 @@ public List<SCMData> getSCMData(WorkflowRun run) {
return null;
}

@Override
public CommonOriginRevision getCommonOriginRevision(Run run) {
return null;
}

private ArrayList<SCMCommit> buildScmCommits(ChangeLogSet<ChangeLogSet.Entry> changes) {
ArrayList<SCMCommit> tmpCommits;
List<SCMChange> tmpChanges;
Expand Down

0 comments on commit 36edfa9

Please sign in to comment.