/src/main/java/com/atlassian/bamboo/plugin/dotnet/msbuild/MsBuildTaskType.java
Java | 153 lines | 120 code | 23 blank | 10 comment | 1 complexity | b26562c5cf4b4f5e5931c3948437de44 MD5 | raw file
Possible License(s): BSD-3-Clause
- package com.atlassian.bamboo.plugin.dotnet.msbuild;
-
- import com.atlassian.bamboo.build.logger.BuildLogger;
- import com.atlassian.bamboo.build.logger.interceptors.ErrorMemorisingInterceptor;
- import com.atlassian.bamboo.build.logger.interceptors.LogMemorisingInterceptor;
- import com.atlassian.bamboo.configuration.ConfigurationMap;
- import com.atlassian.bamboo.plugin.dotnet.support.DotNetLogHelper;
- import com.atlassian.bamboo.process.CommandlineStringUtils;
- import com.atlassian.bamboo.process.EnvironmentVariableAccessor;
- import com.atlassian.bamboo.process.ExternalProcessBuilder;
- import com.atlassian.bamboo.process.ProcessService;
- import com.atlassian.bamboo.task.CommonTaskContext;
- import com.atlassian.bamboo.task.CommonTaskType;
- import com.atlassian.bamboo.task.TaskException;
- import com.atlassian.bamboo.task.TaskResult;
- import com.atlassian.bamboo.task.TaskResultBuilder;
- import com.atlassian.bamboo.util.BambooAceUtils;
- import com.atlassian.bamboo.util.BambooFilenameUtils;
- import com.atlassian.bamboo.utils.SystemProperty;
- import com.atlassian.bamboo.v2.build.CurrentResult;
- import com.atlassian.bamboo.v2.build.agent.capability.Capability;
- import com.atlassian.bamboo.v2.build.agent.capability.CapabilityContext;
- import com.atlassian.bamboo.v2.build.agent.capability.CapabilityDefaultsHelper;
- import com.google.common.base.Preconditions;
- import com.google.common.collect.ImmutableList;
- import com.google.common.collect.Lists;
- import org.apache.commons.io.FileUtils;
- import org.apache.log4j.Logger;
- import org.jetbrains.annotations.NotNull;
-
- import java.io.File;
- import java.io.IOException;
- import java.util.List;
- import java.util.Map;
-
- public class MsBuildTaskType implements CommonTaskType
- {
- @SuppressWarnings("UnusedDeclaration")
- private static final Logger log = Logger.getLogger(MsBuildTaskType.class);
- // ------------------------------------------------------------------------------------------------------- Constants
- public static final String MSBUILD_CAPABILITY_PREFIX = CapabilityDefaultsHelper.CAPABILITY_BUILDER_PREFIX + ".msbuild";
- public static final String PROPERTY_USE_RESPONSE_FILE = "bamboo.plugin.dotnet.msbuild.useResponseFile";
-
- private static final int LINES_TO_PARSE_FOR_ERRORS = 200;
- // TODO next upgrade should use response file as default option
- private static final SystemProperty.BooleanSystemProperty USE_RESPONSE_FILE = new SystemProperty.BooleanSystemProperty(false, false, PROPERTY_USE_RESPONSE_FILE);
- // ------------------------------------------------------------------------------------------------- Type Properties
- // ---------------------------------------------------------------------------------------------------- Dependencies
-
- private final ProcessService processService;
- private final EnvironmentVariableAccessor environmentVariableAccessor;
- private final CapabilityContext capabilityContext;
-
- // ---------------------------------------------------------------------------------------------------- Constructors
-
- public MsBuildTaskType(final ProcessService processService,
- final EnvironmentVariableAccessor environmentVariableAccessor,
- final CapabilityContext capabilityContext)
- {
- this.processService = processService;
- this.environmentVariableAccessor = environmentVariableAccessor;
- this.capabilityContext = capabilityContext;
- }
-
- // ----------------------------------------------------------------------------------------------- Interface Methods
-
- @Override
- public TaskResult execute(@NotNull CommonTaskContext taskContext) throws TaskException
- {
- final BuildLogger buildLogger = taskContext.getBuildLogger();
- final CurrentResult currentBuildResult = taskContext.getCommonContext().getCurrentResult();
-
- LogMemorisingInterceptor recentLogLines = new LogMemorisingInterceptor(LINES_TO_PARSE_FOR_ERRORS);
- final ErrorMemorisingInterceptor errorLines = ErrorMemorisingInterceptor.newInterceptor();
-
- buildLogger.getInterceptorStack().add(recentLogLines);
- buildLogger.getInterceptorStack().add(errorLines);
-
- try
- {
- final MsBuildConfig msBuildConfig = MsBuildConfig.build(taskContext, capabilityContext, environmentVariableAccessor);
-
- if (USE_RESPONSE_FILE.getTypedValue())
- {
- return runWithResponseFile(taskContext, msBuildConfig);
- }
- else
- {
- return runWithCommandLine(taskContext, msBuildConfig);
- }
- }
- finally
- {
- currentBuildResult.addBuildErrors(errorLines.getErrorStringList());
- currentBuildResult.addBuildErrors(DotNetLogHelper.parseErrorOutput(recentLogLines.getLogEntries()));
- }
- }
-
- // -------------------------------------------------------------------------------------------------- Helper Methods
-
- private TaskResult runWithCommandLine(@NotNull CommonTaskContext taskContext, @NotNull MsBuildConfig msBuildConfig)
- {
- final List<String> command = Lists.newArrayList(msBuildConfig.getMsBuildExecutable());
- command.addAll(CommandlineStringUtils.tokeniseCommandline(msBuildConfig.getOptions()));
- command.add(msBuildConfig.getSolution());
-
- final ExternalProcessBuilder externalProcessBuilder = new ExternalProcessBuilder()
- .command(command)
- .env(msBuildConfig.getEnvironmentMap())
- .workingDirectory(taskContext.getWorkingDirectory());
-
- return TaskResultBuilder.newBuilder(taskContext)
- .checkReturnCode(processService.executeExternalProcess(taskContext, externalProcessBuilder))
- .build();
- }
-
- private TaskResult runWithResponseFile(@NotNull CommonTaskContext taskContext, @NotNull MsBuildConfig msBuildConfig) throws TaskException
- {
- final File responseFile = createResponseFile(taskContext, msBuildConfig);
- final List<String> command = Lists.newArrayList(msBuildConfig.getMsBuildExecutable(),
- "@" + responseFile.getAbsolutePath());
-
- final ExternalProcessBuilder externalProcessBuilder = new ExternalProcessBuilder()
- .command(command)
- .env(msBuildConfig.getEnvironmentMap())
- .workingDirectory(taskContext.getWorkingDirectory());
-
- return TaskResultBuilder.newBuilder(taskContext)
- .checkReturnCode(processService.executeExternalProcess(taskContext, externalProcessBuilder))
- .build();
- }
-
- private File createResponseFile(@NotNull CommonTaskContext taskContext, @NotNull MsBuildConfig msBuildConfig) throws TaskException
- {
- try
- {
- final String prefix = taskContext.getCommonContext().getResultKey().getKey() + "-" + getClass().getSimpleName() + "-";
-
- final File responseFile = File.createTempFile(prefix, ".rsp");
- FileUtils.writeLines(responseFile, ImmutableList.of("# MSBuild response file generated by Atlassian Bamboo", msBuildConfig.getOptions(), msBuildConfig.getSolution()));
- responseFile.setReadOnly();
- return responseFile;
- }
- catch (IOException e)
- {
- throw new TaskException("Error while creating temporary file for script", e);
- }
- }
-
- // -------------------------------------------------------------------------------------------------- Action Methods
- // -------------------------------------------------------------------------------------------------- Public Methods
- // -------------------------------------------------------------------------------------- Basic Accessors / Mutators
- }