diff --git a/src/main/java/com/groupon/jenkins/buildtype/dockercompose/BuildConfiguration.java b/src/main/java/com/groupon/jenkins/buildtype/dockercompose/BuildConfiguration.java index b2c164c5..a27e0a82 100644 --- a/src/main/java/com/groupon/jenkins/buildtype/dockercompose/BuildConfiguration.java +++ b/src/main/java/com/groupon/jenkins/buildtype/dockercompose/BuildConfiguration.java @@ -55,14 +55,30 @@ public BuildConfiguration(String repoName, Map config, int number) { this.config = config; } + public ShellCommands getBeforeRunCommandWithCheckoutIfPresent(Map dotCiEnvVars) { + if (!config.containsKey("before_run")) { + return null; + } + ShellCommands shellCommands = new ShellCommands(); + shellCommands.add(getCheckoutCommands(dotCiEnvVars)); + shellCommands.add(String.format("sh -xc '%s'", SHELL_ESCAPE.escape((String) config.get("before_run")))); + return shellCommands; + } + public ShellCommands getCommands(Combination combination, Map dotCiEnvVars) { String dockerComposeContainerName = combination.get("script"); String projectName = dockerComposeContainerName + this.dockerComposeProjectName; String fileName = getDockerComposeFileName(); + ShellCommands shellCommands = new ShellCommands(); shellCommands.add(getCheckoutCommands(dotCiEnvVars)); - if (config.containsKey("before")) { - shellCommands.add(String.format("sh -xc '%s'", SHELL_ESCAPE.escape((String)config.get("before")))); + if (config.containsKey("before_run") && !isParallelized()) { + shellCommands.add(String.format("sh -xc '%s'", SHELL_ESCAPE.escape((String) config.get("before_run")))); + } + + if (config.containsKey("before_each") || config.containsKey("before")) { + String beforeScript = (String) (config.containsKey("before_each") ? config.get("before_each") : config.get("before")); + shellCommands.add(String.format("sh -xc '%s'", SHELL_ESCAPE.escape(beforeScript))); } shellCommands.add(String.format("trap \"docker-compose -f %s -p %s kill; docker-compose -f %s -p %s rm -v --force; exit\" PIPE QUIT INT HUP EXIT TERM",fileName,projectName,fileName,projectName)); diff --git a/src/main/java/com/groupon/jenkins/buildtype/dockercompose/DockerComposeBuild.java b/src/main/java/com/groupon/jenkins/buildtype/dockercompose/DockerComposeBuild.java index 4fe3f6fd..db5fd256 100644 --- a/src/main/java/com/groupon/jenkins/buildtype/dockercompose/DockerComposeBuild.java +++ b/src/main/java/com/groupon/jenkins/buildtype/dockercompose/DockerComposeBuild.java @@ -35,7 +35,6 @@ import com.groupon.jenkins.dynamic.build.execution.SubBuildRunner; import com.groupon.jenkins.dynamic.build.execution.SubBuildScheduler; import com.groupon.jenkins.dynamic.buildtype.BuildType; -import com.groupon.jenkins.git.GitUrl; import com.groupon.jenkins.notifications.PostBuildNotifier; import com.groupon.jenkins.util.GroovyYamlTemplateProcessor; import hudson.Extension; @@ -49,8 +48,6 @@ import java.util.List; import java.util.Map; -import static java.lang.String.format; - @Extension public class DockerComposeBuild extends BuildType implements SubBuildRunner { private BuildConfiguration buildConfiguration; @@ -66,23 +63,30 @@ public Result runBuild(DynamicBuild build, BuildExecutionContext buildExecutionC Map config = new GroovyYamlTemplateProcessor(getDotCiYml(build), buildEnvironment).getConfig(); this.buildConfiguration = new BuildConfiguration(build.getParent().getFullName(),config,build.getNumber()); build.setAxisList(buildConfiguration.getAxisList()); - Result result ; + + Result result; if(buildConfiguration.isParallelized()){ - result = runMultiConfigbuildRunner(build, buildConfiguration, listener,launcher); + result = runParallelBuild(build, buildExecutionContext, buildConfiguration, listener); }else{ result = runSubBuild(new Combination(ImmutableMap.of("script", buildConfiguration.getOnlyRun())), buildExecutionContext, listener); } + Result pluginResult = runPlugins(build, buildConfiguration.getPlugins(), listener, launcher); Result notifierResult = runNotifiers(build, buildConfiguration.getNotifiers(), listener); - return result.combine(pluginResult).combine(notifierResult); + return result.combine(pluginResult).combine(notifierResult); } - @Override public Result runSubBuild(Combination combination, BuildExecutionContext buildExecutionContext, BuildListener listener) throws IOException, InterruptedException { + ShellCommands commands = buildConfiguration.getCommands(combination, buildExecutionContext.getBuildEnvironmentVariables()); + return runCommands(commands, buildExecutionContext, listener); + } + + private Result runCommands(ShellCommands commands, BuildExecutionContext buildExecutionContext, BuildListener listener) throws IOException, InterruptedException { ShellScriptRunner shellScriptRunner = new ShellScriptRunner(buildExecutionContext, listener); - return shellScriptRunner.runScript(buildConfiguration.getCommands(combination,buildExecutionContext.getBuildEnvironmentVariables())); + return shellScriptRunner.runScript(commands); } + private String getDotCiYml(DynamicBuild build) throws IOException { try { return build.getGithubRepositoryService().getGHFile(".ci.yml", build.getSha()).getContent(); @@ -91,7 +95,9 @@ private String getDotCiYml(DynamicBuild build) throws IOException { } } - private Result runMultiConfigbuildRunner(final DynamicBuild dynamicBuild, final BuildConfiguration buildConfiguration, final BuildListener listener, Launcher launcher) throws IOException, InterruptedException { + private Result runParallelBuild(final DynamicBuild dynamicBuild, final BuildExecutionContext buildExecutionContext, final BuildConfiguration buildConfiguration, final BuildListener listener) throws IOException, InterruptedException { + Result beforeRunResult = runBeforeCommands(buildExecutionContext, listener); + SubBuildScheduler subBuildScheduler = new SubBuildScheduler(dynamicBuild, this, new SubBuildScheduler.SubBuildFinishListener() { @Override public void runFinished(DynamicSubBuild subBuild) throws IOException { @@ -104,7 +110,7 @@ public void runFinished(DynamicSubBuild subBuild) throws IOException { try { Iterable axisList = buildConfiguration.getAxisList().list(); Result combinedResult = subBuildScheduler.runSubBuilds(axisList, listener); - dynamicBuild.setResult(combinedResult); + dynamicBuild.setResult(combinedResult.combine(beforeRunResult)); return combinedResult; } finally { try { @@ -115,6 +121,14 @@ public void runFinished(DynamicSubBuild subBuild) throws IOException { } } + private Result runBeforeCommands(final BuildExecutionContext buildExecutionContext, final BuildListener listener) throws IOException, InterruptedException { + ShellCommands beforeCommands = buildConfiguration.getBeforeRunCommandWithCheckoutIfPresent(buildExecutionContext.getBuildEnvironmentVariables()); + if (beforeCommands != null) { + return runCommands(beforeCommands, buildExecutionContext, listener); + } + return Result.SUCCESS; + } + private Result runPlugins(DynamicBuild dynamicBuild, List plugins, BuildListener listener, Launcher launcher) { boolean result = true ; for(DotCiPluginAdapter plugin : plugins){