PageRenderTime 45ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/src/main/java/com/atlassian/bamboo/plugin/dotnet/msbuild/MsBuildTaskType.java

https://bitbucket.org/lmeyer/bamboo-dotnet-plugin
Java | 153 lines | 120 code | 23 blank | 10 comment | 1 complexity | b26562c5cf4b4f5e5931c3948437de44 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. package com.atlassian.bamboo.plugin.dotnet.msbuild;
  2. import com.atlassian.bamboo.build.logger.BuildLogger;
  3. import com.atlassian.bamboo.build.logger.interceptors.ErrorMemorisingInterceptor;
  4. import com.atlassian.bamboo.build.logger.interceptors.LogMemorisingInterceptor;
  5. import com.atlassian.bamboo.configuration.ConfigurationMap;
  6. import com.atlassian.bamboo.plugin.dotnet.support.DotNetLogHelper;
  7. import com.atlassian.bamboo.process.CommandlineStringUtils;
  8. import com.atlassian.bamboo.process.EnvironmentVariableAccessor;
  9. import com.atlassian.bamboo.process.ExternalProcessBuilder;
  10. import com.atlassian.bamboo.process.ProcessService;
  11. import com.atlassian.bamboo.task.CommonTaskContext;
  12. import com.atlassian.bamboo.task.CommonTaskType;
  13. import com.atlassian.bamboo.task.TaskException;
  14. import com.atlassian.bamboo.task.TaskResult;
  15. import com.atlassian.bamboo.task.TaskResultBuilder;
  16. import com.atlassian.bamboo.util.BambooAceUtils;
  17. import com.atlassian.bamboo.util.BambooFilenameUtils;
  18. import com.atlassian.bamboo.utils.SystemProperty;
  19. import com.atlassian.bamboo.v2.build.CurrentResult;
  20. import com.atlassian.bamboo.v2.build.agent.capability.Capability;
  21. import com.atlassian.bamboo.v2.build.agent.capability.CapabilityContext;
  22. import com.atlassian.bamboo.v2.build.agent.capability.CapabilityDefaultsHelper;
  23. import com.google.common.base.Preconditions;
  24. import com.google.common.collect.ImmutableList;
  25. import com.google.common.collect.Lists;
  26. import org.apache.commons.io.FileUtils;
  27. import org.apache.log4j.Logger;
  28. import org.jetbrains.annotations.NotNull;
  29. import java.io.File;
  30. import java.io.IOException;
  31. import java.util.List;
  32. import java.util.Map;
  33. public class MsBuildTaskType implements CommonTaskType
  34. {
  35. @SuppressWarnings("UnusedDeclaration")
  36. private static final Logger log = Logger.getLogger(MsBuildTaskType.class);
  37. // ------------------------------------------------------------------------------------------------------- Constants
  38. public static final String MSBUILD_CAPABILITY_PREFIX = CapabilityDefaultsHelper.CAPABILITY_BUILDER_PREFIX + ".msbuild";
  39. public static final String PROPERTY_USE_RESPONSE_FILE = "bamboo.plugin.dotnet.msbuild.useResponseFile";
  40. private static final int LINES_TO_PARSE_FOR_ERRORS = 200;
  41. // TODO next upgrade should use response file as default option
  42. private static final SystemProperty.BooleanSystemProperty USE_RESPONSE_FILE = new SystemProperty.BooleanSystemProperty(false, false, PROPERTY_USE_RESPONSE_FILE);
  43. // ------------------------------------------------------------------------------------------------- Type Properties
  44. // ---------------------------------------------------------------------------------------------------- Dependencies
  45. private final ProcessService processService;
  46. private final EnvironmentVariableAccessor environmentVariableAccessor;
  47. private final CapabilityContext capabilityContext;
  48. // ---------------------------------------------------------------------------------------------------- Constructors
  49. public MsBuildTaskType(final ProcessService processService,
  50. final EnvironmentVariableAccessor environmentVariableAccessor,
  51. final CapabilityContext capabilityContext)
  52. {
  53. this.processService = processService;
  54. this.environmentVariableAccessor = environmentVariableAccessor;
  55. this.capabilityContext = capabilityContext;
  56. }
  57. // ----------------------------------------------------------------------------------------------- Interface Methods
  58. @Override
  59. public TaskResult execute(@NotNull CommonTaskContext taskContext) throws TaskException
  60. {
  61. final BuildLogger buildLogger = taskContext.getBuildLogger();
  62. final CurrentResult currentBuildResult = taskContext.getCommonContext().getCurrentResult();
  63. LogMemorisingInterceptor recentLogLines = new LogMemorisingInterceptor(LINES_TO_PARSE_FOR_ERRORS);
  64. final ErrorMemorisingInterceptor errorLines = ErrorMemorisingInterceptor.newInterceptor();
  65. buildLogger.getInterceptorStack().add(recentLogLines);
  66. buildLogger.getInterceptorStack().add(errorLines);
  67. try
  68. {
  69. final MsBuildConfig msBuildConfig = MsBuildConfig.build(taskContext, capabilityContext, environmentVariableAccessor);
  70. if (USE_RESPONSE_FILE.getTypedValue())
  71. {
  72. return runWithResponseFile(taskContext, msBuildConfig);
  73. }
  74. else
  75. {
  76. return runWithCommandLine(taskContext, msBuildConfig);
  77. }
  78. }
  79. finally
  80. {
  81. currentBuildResult.addBuildErrors(errorLines.getErrorStringList());
  82. currentBuildResult.addBuildErrors(DotNetLogHelper.parseErrorOutput(recentLogLines.getLogEntries()));
  83. }
  84. }
  85. // -------------------------------------------------------------------------------------------------- Helper Methods
  86. private TaskResult runWithCommandLine(@NotNull CommonTaskContext taskContext, @NotNull MsBuildConfig msBuildConfig)
  87. {
  88. final List<String> command = Lists.newArrayList(msBuildConfig.getMsBuildExecutable());
  89. command.addAll(CommandlineStringUtils.tokeniseCommandline(msBuildConfig.getOptions()));
  90. command.add(msBuildConfig.getSolution());
  91. final ExternalProcessBuilder externalProcessBuilder = new ExternalProcessBuilder()
  92. .command(command)
  93. .env(msBuildConfig.getEnvironmentMap())
  94. .workingDirectory(taskContext.getWorkingDirectory());
  95. return TaskResultBuilder.newBuilder(taskContext)
  96. .checkReturnCode(processService.executeExternalProcess(taskContext, externalProcessBuilder))
  97. .build();
  98. }
  99. private TaskResult runWithResponseFile(@NotNull CommonTaskContext taskContext, @NotNull MsBuildConfig msBuildConfig) throws TaskException
  100. {
  101. final File responseFile = createResponseFile(taskContext, msBuildConfig);
  102. final List<String> command = Lists.newArrayList(msBuildConfig.getMsBuildExecutable(),
  103. "@" + responseFile.getAbsolutePath());
  104. final ExternalProcessBuilder externalProcessBuilder = new ExternalProcessBuilder()
  105. .command(command)
  106. .env(msBuildConfig.getEnvironmentMap())
  107. .workingDirectory(taskContext.getWorkingDirectory());
  108. return TaskResultBuilder.newBuilder(taskContext)
  109. .checkReturnCode(processService.executeExternalProcess(taskContext, externalProcessBuilder))
  110. .build();
  111. }
  112. private File createResponseFile(@NotNull CommonTaskContext taskContext, @NotNull MsBuildConfig msBuildConfig) throws TaskException
  113. {
  114. try
  115. {
  116. final String prefix = taskContext.getCommonContext().getResultKey().getKey() + "-" + getClass().getSimpleName() + "-";
  117. final File responseFile = File.createTempFile(prefix, ".rsp");
  118. FileUtils.writeLines(responseFile, ImmutableList.of("# MSBuild response file generated by Atlassian Bamboo", msBuildConfig.getOptions(), msBuildConfig.getSolution()));
  119. responseFile.setReadOnly();
  120. return responseFile;
  121. }
  122. catch (IOException e)
  123. {
  124. throw new TaskException("Error while creating temporary file for script", e);
  125. }
  126. }
  127. // -------------------------------------------------------------------------------------------------- Action Methods
  128. // -------------------------------------------------------------------------------------------------- Public Methods
  129. // -------------------------------------------------------------------------------------- Basic Accessors / Mutators
  130. }