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

/src/main/java/com/atlassian/bamboo/plugin/dotnet/nant/NantTaskType.java

https://bitbucket.org/atlassian/bamboo-dotnet-plugin/
Java | 162 lines | 124 code | 29 blank | 9 comment | 2 complexity | 1555f84edffb7d11d6f4d192010f33f2 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. package com.atlassian.bamboo.plugin.dotnet.nant;
  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.plugin.dotnet.support.DotNetLogHelper;
  6. import com.atlassian.bamboo.process.CommandlineStringUtils;
  7. import com.atlassian.bamboo.process.EnvironmentVariableAccessor;
  8. import com.atlassian.bamboo.process.ExternalProcessBuilder;
  9. import com.atlassian.bamboo.process.ProcessService;
  10. import com.atlassian.bamboo.task.CommonTaskContext;
  11. import com.atlassian.bamboo.task.CommonTaskType;
  12. import com.atlassian.bamboo.task.TaskException;
  13. import com.atlassian.bamboo.task.TaskResult;
  14. import com.atlassian.bamboo.task.TaskResultBuilder;
  15. import com.atlassian.bamboo.v2.build.CurrentResult;
  16. import com.atlassian.bamboo.v2.build.agent.capability.Capability;
  17. import com.atlassian.bamboo.v2.build.agent.capability.CapabilityContext;
  18. import com.atlassian.bamboo.v2.build.agent.capability.CapabilityDefaultsHelper;
  19. import com.google.common.base.Joiner;
  20. import com.google.common.base.Preconditions;
  21. import com.google.common.collect.Lists;
  22. import org.apache.commons.lang3.StringUtils;
  23. import org.apache.commons.lang3.SystemUtils;
  24. import org.apache.log4j.Logger;
  25. import org.jetbrains.annotations.NotNull;
  26. import java.io.File;
  27. import java.util.List;
  28. import java.util.Map;
  29. public class NantTaskType implements CommonTaskType
  30. {
  31. @SuppressWarnings("unused")
  32. private static final Logger log = Logger.getLogger(NantTaskType.class);
  33. // ------------------------------------------------------------------------------------------------------- Constants
  34. public static final String NANT_CAPABILITY_PREFIX = CapabilityDefaultsHelper.CAPABILITY_BUILDER_PREFIX + ".nant";
  35. public static final String ENVIRONMENT = "environmentVariables";
  36. public static final String LABEL = "label";
  37. public static final String BUILD_FILE = "buildFile";
  38. public static final String TARGET = "target";
  39. public static final String OPTIONS = "options";
  40. public static final String EXECUTABLE_NAME = SystemUtils.IS_OS_WINDOWS ? "nant.exe" : "nant";
  41. private static final int LINES_TO_PARSE_FOR_ERRORS = 200;
  42. // ------------------------------------------------------------------------------------------------- Type Properties
  43. // ---------------------------------------------------------------------------------------------------- Dependencies
  44. private final ProcessService processService;
  45. private final EnvironmentVariableAccessor environmentVariableAccessor;
  46. private final CapabilityContext capabilityContext;
  47. // ---------------------------------------------------------------------------------------------------- Constructors
  48. public NantTaskType(final ProcessService processService, final EnvironmentVariableAccessor environmentVariableAccessor, final CapabilityContext capabilityContext)
  49. {
  50. this.processService = processService;
  51. this.environmentVariableAccessor = environmentVariableAccessor;
  52. this.capabilityContext = capabilityContext;
  53. }
  54. // ----------------------------------------------------------------------------------------------- Interface Methods
  55. @Override
  56. public TaskResult execute(@NotNull CommonTaskContext commonTaskContext) throws TaskException
  57. {
  58. final BuildLogger buildLogger = commonTaskContext.getBuildLogger();
  59. final CurrentResult currentBuildResult = commonTaskContext.getCommonContext().getCurrentResult();
  60. LogMemorisingInterceptor recentLogLines = new LogMemorisingInterceptor(LINES_TO_PARSE_FOR_ERRORS);
  61. final ErrorMemorisingInterceptor errorLines = ErrorMemorisingInterceptor.newInterceptor();
  62. buildLogger.getInterceptorStack().add(recentLogLines);
  63. buildLogger.getInterceptorStack().add(errorLines);
  64. try
  65. {
  66. final Map<String, String> environment = getCustomEnvironment(commonTaskContext);
  67. final String executable = getExecutablePath(commonTaskContext);
  68. final String buildFile = getBuildFile(commonTaskContext);
  69. final String options = getOptions(commonTaskContext);
  70. final String target = getTarget(commonTaskContext);
  71. final List<String> command = Lists.newArrayList(executable);
  72. if (StringUtils.isNotEmpty(buildFile))
  73. {
  74. command.add("-buildfile:" + buildFile);
  75. }
  76. command.addAll(CommandlineStringUtils.tokeniseCommandline(options));
  77. command.addAll(CommandlineStringUtils.tokeniseCommandline(target));
  78. return TaskResultBuilder.newBuilder(commonTaskContext)
  79. .checkReturnCode(
  80. processService.executeExternalProcess(
  81. commonTaskContext,
  82. new ExternalProcessBuilder()
  83. .env(environment)
  84. .command(command)
  85. .workingDirectory(commonTaskContext.getWorkingDirectory()))
  86. ).build();
  87. } finally
  88. {
  89. currentBuildResult.addBuildErrors(errorLines.getErrorStringList());
  90. currentBuildResult.addBuildErrors(DotNetLogHelper.parseErrorOutput(recentLogLines.getLogEntries()));
  91. }
  92. }
  93. private Map<String, String> getCustomEnvironment(final CommonTaskContext taskContext)
  94. {
  95. return environmentVariableAccessor.splitEnvironmentAssignments(taskContext.getConfigurationMap().get(ENVIRONMENT));
  96. }
  97. private String getOptions(@NotNull final CommonTaskContext commonTaskContext)
  98. {
  99. return commonTaskContext.getConfigurationMap().get(OPTIONS);
  100. }
  101. public String getTarget(@NotNull final CommonTaskContext commonTaskContext)
  102. {
  103. return commonTaskContext.getConfigurationMap().get(TARGET);
  104. }
  105. // -------------------------------------------------------------------------------------------------- Action Methods
  106. // -------------------------------------------------------------------------------------------------- Public Methods
  107. // -------------------------------------------------------------------------------------------------- Helper Methods
  108. private String getBuildFile(@NotNull final CommonTaskContext commonTaskContext)
  109. {
  110. return commonTaskContext.getConfigurationMap().get(BUILD_FILE);
  111. }
  112. String getExecutablePath(@NotNull final CommonTaskContext taskContext) throws TaskException
  113. {
  114. final File executableFile = getExecutableFile(taskContext);
  115. if (!executableFile.exists())
  116. {
  117. throw new TaskException("Executable '" + EXECUTABLE_NAME + "' does not exist at path '" + executableFile.getPath() + "'");
  118. }
  119. return executableFile.getPath();
  120. }
  121. File getExecutableFile(@NotNull final CommonTaskContext commonTaskContext)
  122. {
  123. final String label = commonTaskContext.getConfigurationMap().get(LABEL);
  124. Preconditions.checkNotNull(label, "Label");
  125. final String capabilityKey = NANT_CAPABILITY_PREFIX + "." + label;
  126. Capability capability = capabilityContext.getCapabilitySet().getCapability(capabilityKey);
  127. Preconditions.checkNotNull(capability, "Capability");
  128. final String path = Joiner.on(File.separator).join(capability.getValue(), "bin", EXECUTABLE_NAME);
  129. final File executableFile = new File(path);
  130. return executableFile.isAbsolute() ? executableFile : new File(commonTaskContext.getRootDirectory(), path);
  131. }
  132. // -------------------------------------------------------------------------------------- Basic Accessors / Mutators
  133. }