PageRenderTime 35ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/src/main/java/com/atlassian/bamboo/plugins/xcode/build/XCodeTaskType.java

https://bitbucket.org/rience/add-ocunit-parser-task
Java | 191 lines | 158 code | 33 blank | 0 comment | 21 complexity | f20016b77a50cfde35c192b716afbe71 MD5 | raw file
  1. package com.atlassian.bamboo.plugins.xcode.build;
  2. import com.atlassian.bamboo.build.logger.BuildLogger;
  3. import com.atlassian.bamboo.configuration.ConfigurationMap;
  4. import com.atlassian.bamboo.plugins.xcode.tests.OCUnitLogInterceptor;
  5. import com.atlassian.bamboo.process.EnvironmentVariableAccessor;
  6. import com.atlassian.bamboo.process.ExternalProcessBuilder;
  7. import com.atlassian.bamboo.process.ProcessService;
  8. import com.atlassian.bamboo.task.TaskContext;
  9. import com.atlassian.bamboo.task.TaskException;
  10. import com.atlassian.bamboo.task.TaskResult;
  11. import com.atlassian.bamboo.task.TaskResultBuilder;
  12. import com.atlassian.bamboo.task.TaskState;
  13. import com.atlassian.bamboo.task.TaskType;
  14. import com.atlassian.bamboo.v2.build.agent.capability.Capability;
  15. import com.atlassian.bamboo.v2.build.agent.capability.CapabilityContext;
  16. import com.atlassian.bamboo.v2.build.agent.capability.CapabilityDefaultsHelper;
  17. import com.atlassian.utils.process.ExternalProcess;
  18. import com.google.common.base.Preconditions;
  19. import com.google.common.collect.Lists;
  20. import com.google.common.collect.Sets;
  21. import org.apache.commons.io.FilenameUtils;
  22. import org.apache.commons.lang.StringUtils;
  23. import org.jetbrains.annotations.NotNull;
  24. import java.io.File;
  25. import java.util.LinkedList;
  26. import java.util.List;
  27. import java.util.Map;
  28. public class XCodeTaskType implements TaskType
  29. {
  30. public static final String XCODE_CAPABILITY_PREFIX = CapabilityDefaultsHelper.CAPABILITY_BUILDER_PREFIX + ".xcode";
  31. public static final String XCRUN_PATH = "/usr/bin/xcrun";
  32. private final ProcessService processService;
  33. private final EnvironmentVariableAccessor environmentVariableAccessor;
  34. private final CapabilityContext capabilityContext;
  35. public XCodeTaskType(final ProcessService processService, final EnvironmentVariableAccessor environmentVariableAccessor, final CapabilityContext capabilityContext)
  36. {
  37. this.processService = processService;
  38. this.environmentVariableAccessor = environmentVariableAccessor;
  39. this.capabilityContext = capabilityContext;
  40. }
  41. @NotNull
  42. public TaskResult execute(@NotNull TaskContext taskContext) throws TaskException
  43. {
  44. final OCUnitLogInterceptor ocUnitLogInterceptor = new OCUnitLogInterceptor();
  45. final TaskResultBuilder resultBuilder = TaskResultBuilder.create(taskContext);
  46. final BuildLogger buildLogger = taskContext.getBuildLogger();
  47. try
  48. {
  49. final ConfigurationMap configurationMap = taskContext.getConfigurationMap();
  50. final String project = configurationMap.get(XCodeConfigurator.PROJECT);
  51. final boolean shouldClean = configurationMap.getAsBoolean(XCodeConfigurator.CLEAN);
  52. final File workingDirectory = taskContext.getWorkingDirectory();
  53. if (shouldClean)
  54. {
  55. final List<String> arguments = Lists.newArrayList(XCodeBuild.getXcodebuildPath());
  56. if (StringUtils.isNotEmpty(project))
  57. {
  58. arguments.add("-project");
  59. arguments.add(project);
  60. }
  61. arguments.add(XCodeBuild.XCODEBUILD_ARG_CLEAN);
  62. resultBuilder.checkReturnCode(processService.executeProcess(taskContext, new ExternalProcessBuilder()
  63. .command(arguments)
  64. .workingDirectory(workingDirectory)));
  65. if (resultBuilder.getTaskState() != TaskState.SUCCESS)
  66. {
  67. return resultBuilder.build();
  68. }
  69. }
  70. final boolean buildAllTargets = configurationMap.getAsBoolean(XCodeConfigurator.ALL_TARGETS);
  71. final String target = configurationMap.get(XCodeConfigurator.TARGET);
  72. final String configuration = configurationMap.get(XCodeConfigurator.CONFIGURATION);
  73. final String sdk = configurationMap.get(XCodeConfigurator.SDK);
  74. final boolean parseOcUnitResults = configurationMap.getAsBoolean(XCodeConfigurator.OCUNIT);
  75. final List<String> arguments = new LinkedList<String>();
  76. final Capability capability = capabilityContext.getCapabilitySet().getCapability(XCODE_CAPABILITY_PREFIX + "." + sdk);
  77. Preconditions.checkNotNull(capability, "The Xcode SDK capability is missing");
  78. final String sdkLabel = capability.getValue();
  79. arguments.add(XCodeBuild.getXcodebuildPath());
  80. arguments.add("-sdk");
  81. arguments.add(sdkLabel);
  82. if (StringUtils.isNotEmpty(project))
  83. {
  84. arguments.add("-project");
  85. arguments.add(project);
  86. }
  87. if (buildAllTargets)
  88. {
  89. arguments.add("-alltargets");
  90. }
  91. else if (StringUtils.isNotEmpty(target))
  92. {
  93. arguments.add("-target");
  94. arguments.add(target);
  95. }
  96. if (StringUtils.isNotEmpty(configuration))
  97. {
  98. arguments.add("-configuration");
  99. arguments.add(configuration);
  100. }
  101. final Map<String, String> environment = environmentVariableAccessor.splitEnvironmentAssignments(configurationMap.get(XCodeConfigurator.ENVIRONMENT));
  102. if (parseOcUnitResults)
  103. {
  104. buildLogger.getInterceptorStack().add(ocUnitLogInterceptor);
  105. }
  106. final ExternalProcess externalProcess = processService.executeProcess(taskContext, new ExternalProcessBuilder()
  107. .command(arguments)
  108. .env(environment)
  109. .workingDirectory(workingDirectory));
  110. if (parseOcUnitResults)
  111. {
  112. taskContext.getBuildContext().getBuildResult().setTestResults(Sets.newHashSet(ocUnitLogInterceptor.getSuccessfulTestResults()), Sets.newHashSet(ocUnitLogInterceptor.getFailingTestResults()));
  113. resultBuilder.checkTestFailures();
  114. }
  115. else if (resultBuilder.getTaskState() == TaskState.SUCCESS)
  116. {
  117. resultBuilder.checkReturnCode(externalProcess);
  118. taskContext.getBuildContext().getBuildResult().getBuildErrors().addAll(buildLogger.getStringErrorLogs());
  119. }
  120. if (resultBuilder.getTaskState() == TaskState.SUCCESS && configurationMap.getAsBoolean(XCodeConfigurator.BUILD_IPA))
  121. {
  122. final String appPath = configurationMap.get(XCodeConfigurator.APP_PATH);
  123. final String identity = configurationMap.get(XCodeConfigurator.IDENTITY);
  124. final String embeddedProfilePath = configurationMap.get(XCodeConfigurator.EMBEDDED_PROFILE_PATH);
  125. final File appFile = new File(workingDirectory, appPath);
  126. final String outputPath = FilenameUtils.removeExtension(appFile.getAbsolutePath()) + ".ipa";
  127. final List<String> command = Lists.newArrayList(XCRUN_PATH,
  128. "-sdk", sdk,
  129. "PackageApplication",
  130. "-v", appFile.getAbsolutePath(),
  131. "-o", outputPath);
  132. if (StringUtils.isNotEmpty(embeddedProfilePath))
  133. {
  134. final File embeddedProfileFile = new File(embeddedProfilePath).isAbsolute() ? new File(embeddedProfilePath) : new File(workingDirectory, embeddedProfilePath);
  135. command.add("--embed");
  136. command.add(embeddedProfileFile.getAbsolutePath());
  137. }
  138. if (StringUtils.isNotEmpty(identity))
  139. {
  140. command.add("--sign");
  141. command.add(identity);
  142. }
  143. resultBuilder.checkReturnCode(processService.executeProcess(taskContext, new ExternalProcessBuilder()
  144. .workingDirectory(workingDirectory)
  145. .command(command)));
  146. if (resultBuilder.getTaskState() == TaskState.SUCCESS)
  147. {
  148. buildLogger.addBuildLogEntry("IPA created at '" + outputPath + "'");
  149. }
  150. }
  151. return resultBuilder.build();
  152. }
  153. finally
  154. {
  155. buildLogger.getInterceptorStack().remove(ocUnitLogInterceptor);
  156. }
  157. }
  158. }