PageRenderTime 46ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/src/main/java/com/atlassian/bamboo/plugin/dotnet/visualstudio/VisualStudioTaskType.java

https://bitbucket.org/atlassian/bamboo-dotnet-plugin/
Java | 150 lines | 114 code | 28 blank | 8 comment | 1 complexity | 5177391f4c78e17a524146cb4d36cc6d MD5 | raw file
Possible License(s): BSD-3-Clause
  1. package com.atlassian.bamboo.plugin.dotnet.visualstudio;
  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.TaskContext;
  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.task.TaskType;
  16. import com.atlassian.bamboo.v2.build.CurrentBuildResult;
  17. import com.atlassian.bamboo.v2.build.agent.capability.Capability;
  18. import com.atlassian.bamboo.v2.build.agent.capability.CapabilityContext;
  19. import com.atlassian.bamboo.v2.build.agent.capability.CapabilityDefaultsHelper;
  20. import com.google.common.base.Preconditions;
  21. import com.google.common.collect.ImmutableList;
  22. import com.google.common.collect.Lists;
  23. import org.apache.commons.lang3.StringUtils;
  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 VisualStudioTaskType implements TaskType
  30. {
  31. private static final Logger log = Logger.getLogger(VisualStudioTaskType.class);
  32. // ------------------------------------------------------------------------------------------------------- Constants
  33. // ------------------------------------------------------------------------------------------------- Type Properties
  34. public static final String VS_CAPABILITY_PREFIX = CapabilityDefaultsHelper.CAPABILITY_BUILDER_PREFIX + ".devenv";
  35. public static final String SOLUTION = "solution";
  36. public static final String OPTIONS = "options";
  37. public static final String LABEL = "label";
  38. public static final String VS_ENVIRONMENT = "vsEnvironment";
  39. public static final String ENVIRONMENT = "environmentVariables";
  40. private static final int LINES_TO_PARSE_FOR_ERRORS = 200;
  41. // ---------------------------------------------------------------------------------------------------- Dependencies
  42. private final ProcessService processService;
  43. private final EnvironmentVariableAccessor environmentVariableAccessor;
  44. private final CapabilityContext capabilityContext;
  45. // ---------------------------------------------------------------------------------------------------- Constructors
  46. public VisualStudioTaskType(final ProcessService processService, final EnvironmentVariableAccessor environmentVariableAccessor, final CapabilityContext capabilityContext)
  47. {
  48. this.processService = processService;
  49. this.environmentVariableAccessor = environmentVariableAccessor;
  50. this.capabilityContext = capabilityContext;
  51. }
  52. // ----------------------------------------------------------------------------------------------- Interface Methods
  53. @Override
  54. @NotNull
  55. public TaskResult execute(@NotNull final TaskContext taskContext) throws TaskException
  56. {
  57. final BuildLogger buildLogger = taskContext.getBuildLogger();
  58. final CurrentBuildResult currentBuildResult = taskContext.getBuildContext().getBuildResult();
  59. LogMemorisingInterceptor recentLogLines = new LogMemorisingInterceptor(LINES_TO_PARSE_FOR_ERRORS);
  60. final ErrorMemorisingInterceptor errorLines = ErrorMemorisingInterceptor.newInterceptor();
  61. buildLogger.getInterceptorStack().add(recentLogLines);
  62. buildLogger.getInterceptorStack().add(errorLines);
  63. try
  64. {
  65. final String runnerPath = RunnerExtractor.getDevenvRunnerPath();
  66. Preconditions.checkNotNull(runnerPath, "Visual Studio Runner");
  67. final ConfigurationMap configuration = taskContext.getConfigurationMap();
  68. String visualStudioEnvironment = configuration.get(VS_ENVIRONMENT);
  69. if (StringUtils.isEmpty(visualStudioEnvironment))
  70. {
  71. visualStudioEnvironment = VisualStudioConfigurator.DEFAULT_VS_ENVIRONMENT;
  72. }
  73. Preconditions.checkNotNull(visualStudioEnvironment, "Visual Studio Environment");
  74. final String label = configuration.get(LABEL);
  75. Preconditions.checkNotNull(label);
  76. final String solution = configuration.get(SOLUTION);
  77. Preconditions.checkNotNull(solution, "Solution");
  78. final Map<String, String> environment = getEnvironment(taskContext);
  79. Preconditions.checkNotNull(environment, "Process Environment");
  80. final String installationDirectory = getVisualStudioInstallationDirectory(label);
  81. Preconditions.checkNotNull(installationDirectory, "Could not find Visual Studio installation directory");
  82. final List<String> command = Lists.newArrayList(runnerPath,
  83. taskContext.getWorkingDirectory().getAbsolutePath(),
  84. installationDirectory,
  85. visualStudioEnvironment,
  86. solution);
  87. command.addAll(getOptions(taskContext));
  88. return TaskResultBuilder.newBuilder(taskContext)
  89. .checkReturnCode(processService.executeExternalProcess(taskContext, new ExternalProcessBuilder()
  90. .command(command)
  91. .env(environment)
  92. .workingDirectory(taskContext.getWorkingDirectory())))
  93. .build();
  94. }
  95. finally
  96. {
  97. currentBuildResult.addBuildErrors(errorLines.getErrorStringList());
  98. currentBuildResult.addBuildErrors(DotNetLogHelper.parseErrorOutput(recentLogLines.getLogEntries()));
  99. }
  100. }
  101. @NotNull
  102. private Map<String, String> getEnvironment(final TaskContext taskContext)
  103. {
  104. final String environment = taskContext.getConfigurationMap().get(ENVIRONMENT);
  105. return environmentVariableAccessor.splitEnvironmentAssignments(environment);
  106. }
  107. @NotNull
  108. List<String> getOptions(final TaskContext taskContext)
  109. {
  110. final String options = taskContext.getConfigurationMap().get(OPTIONS);
  111. return ImmutableList.copyOf(CommandlineStringUtils.tokeniseCommandline(options));
  112. }
  113. private String getVisualStudioInstallationDirectory(final String label)
  114. {
  115. final Capability capability = capabilityContext.getCapabilitySet().getCapability(VS_CAPABILITY_PREFIX + "." + label);
  116. Preconditions.checkNotNull(capability, "Capability");
  117. return new File(capability.getValue()).getParentFile().getParent();
  118. }
  119. // -------------------------------------------------------------------------------------------------- Action Methods
  120. // -------------------------------------------------------------------------------------------------- Public Methods
  121. // -------------------------------------------------------------------------------------- Basic Accessors / Mutators
  122. }