package org.paylogic.jenkins.gatekeeper; import hudson.EnvVars; import hudson.Extension; import hudson.Launcher; import hudson.model.AbstractBuild; import hudson.model.AbstractProject; import hudson.model.BuildListener; import hudson.tasks.BuildStepDescriptor; import hudson.tasks.Builder; import hudson.util.FormValidation; import lombok.extern.java.Log; import org.jenkinsci.plugins.envinject.EnvInjectBuilderContributionAction; import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.QueryParameter; import org.paylogic.jenkins.LogMessageSearcher; import org.paylogic.jenkins.advancedscm.AdvancedSCMManager; import org.paylogic.jenkins.advancedscm.SCMManagerFactory; import org.paylogic.jenkins.advancedscm.exceptions.AdvancedSCMException; import java.io.PrintStream; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; /** * Created by bubenkoff on 20.12.13. */ @Log public class GatekeeperCommit extends Builder { public final String commitUsername; @DataBoundConstructor public GatekeeperCommit(String commitUsername) { this.commitUsername = commitUsername; } @Override public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) { PrintStream l = listener.getLogger(); l.println("----------------------------------------------------------"); l.println("------------------- Gatekeeper commit --------------------"); l.println("----------------------------------------------------------"); try { return this.doPerform(build, launcher, listener); } catch (Exception e) { log.log(Level.SEVERE, "Exception during Gatekeeeper commit.", e); l.append("Exception occured, build aborting...\n"); LogMessageSearcher.logMessage(listener, e.toString()); return false; } } private boolean doPerform(AbstractBuild build, Launcher launcher, BuildListener listener) throws Exception { EnvVars envVars = build.getEnvironment(listener); String featureBranch = envVars.get("FEATURE_BRANCH", ""); String targetBranch = envVars.get("TARGET_BRANCH", ""); AdvancedSCMManager amm = SCMManagerFactory.getManager(build, launcher, listener); commit(amm, listener, envVars, targetBranch, featureBranch, commitUsername); // pass branches to push to later build actions Map<String, String> vars = new HashMap<String, String>(); vars.put("BRANCHES_TO_PUSH", targetBranch); build.addAction(new EnvInjectBuilderContributionAction(vars)); return true; } private void commit(AdvancedSCMManager amm, BuildListener listener, EnvVars envVars, String targetBranch, String featureBranch, String commitUsername) throws AdvancedSCMException { amm.commit("[Jenkins Integration Merge] Merged " + featureBranch + " into " + targetBranch, commitUsername); if (amm.getBranchNames(false).contains(featureBranch)) { // we have to close feature branch amm.closeBranch(featureBranch, "[Jenkins Integration Merge] Closing feature branch " + featureBranch, commitUsername); amm.update(targetBranch); } LogMessageSearcher.logMessage(listener, "Gatekeeper merge was committed."); } @Override public DescriptorImpl getDescriptor() { return (DescriptorImpl)super.getDescriptor(); } @Extension public static final class DescriptorImpl extends BuildStepDescriptor<Builder> { @Override public boolean isApplicable(Class<? extends AbstractProject> jobType) { return true; } @Override public String getDisplayName() { return "Perform Gatekeeper commit."; } public FormValidation doCheckCommitUsername(@QueryParameter String value) { if (!value.isEmpty()) { return FormValidation.ok(); } else { return FormValidation.error("Required field"); } } } }