/src/main/java/org/jfrog/bamboo/task/ArtifactoryNpmTask.java

https://github.com/JFrogDev/bamboo-artifactory-plugin · Java · 168 lines · 128 code · 19 blank · 21 comment · 8 complexity · be8ef565ea01230170b01e1fd0a7131a MD5 · raw file

  1. package org.jfrog.bamboo.task;
  2. import com.atlassian.bamboo.process.EnvironmentVariableAccessor;
  3. import com.atlassian.bamboo.task.*;
  4. import com.atlassian.bamboo.v2.build.BuildContext;
  5. import com.atlassian.bamboo.v2.build.agent.capability.CapabilityContext;
  6. import com.atlassian.bamboo.variable.CustomVariableContext;
  7. import com.atlassian.spring.container.ContainerManager;
  8. import org.apache.commons.lang.StringUtils;
  9. import org.jetbrains.annotations.NotNull;
  10. import org.jfrog.bamboo.admin.ServerConfig;
  11. import org.jfrog.bamboo.builder.BuildInfoHelper;
  12. import org.jfrog.bamboo.configuration.BuildParamsOverrideManager;
  13. import org.jfrog.bamboo.context.NpmBuildContext;
  14. import org.jfrog.bamboo.util.BuildInfoLog;
  15. import org.jfrog.bamboo.util.TaskUtils;
  16. import org.jfrog.build.api.Build;
  17. import org.jfrog.build.api.util.Log;
  18. import org.jfrog.build.extractor.clientConfiguration.ArtifactoryBuildInfoClientBuilder;
  19. import org.jfrog.build.extractor.clientConfiguration.ArtifactoryDependenciesClientBuilder;
  20. import org.jfrog.build.extractor.npm.extractor.NpmInstallCi;
  21. import org.jfrog.build.extractor.npm.extractor.NpmPublish;
  22. import java.io.File;
  23. import java.nio.file.Path;
  24. import java.util.Map;
  25. public class ArtifactoryNpmTask extends ArtifactoryTaskType {
  26. private static final String TASK_NAME = "artifactoryNpmTask";
  27. private static final String NPM_KEY = "system.builder.npm.";
  28. private static final String EXECUTABLE_NAME = "npm";
  29. private final EnvironmentVariableAccessor environmentVariableAccessor;
  30. private final CapabilityContext capabilityContext;
  31. private BuildParamsOverrideManager buildParamsOverrideManager;
  32. private CustomVariableContext customVariableContext;
  33. private Map<String, String> environmentVariables;
  34. private NpmBuildContext npmBuildContext;
  35. private BuildInfoHelper buildInfoHelper;
  36. private String buildNumber;
  37. private String buildName;
  38. private Path packagePath;
  39. public ArtifactoryNpmTask(EnvironmentVariableAccessor environmentVariableAccessor, final CapabilityContext capabilityContext) {
  40. this.environmentVariableAccessor = environmentVariableAccessor;
  41. this.capabilityContext = capabilityContext;
  42. ContainerManager.autowireComponent(this);
  43. }
  44. @Override
  45. protected void initTask(@NotNull CommonTaskContext context) throws TaskException {
  46. super.initTask(context);
  47. npmBuildContext = new NpmBuildContext(taskContext.getConfigurationMap());
  48. buildParamsOverrideManager = new BuildParamsOverrideManager(customVariableContext);
  49. BuildContext buildContext = ((TaskContext) context).getBuildContext();
  50. buildName = npmBuildContext.getBuildName(buildContext);
  51. buildNumber = npmBuildContext.getBuildNumber(buildContext);
  52. initBuildInfoHelper(buildContext);
  53. environmentVariables = getEnv();
  54. packagePath = getPackagePath();
  55. }
  56. @NotNull
  57. @Override
  58. public TaskResult runTask(@NotNull TaskContext taskContext) {
  59. Build build;
  60. if (npmBuildContext.isNpmCommandInstall()) {
  61. build = executeNpmInstall();
  62. } else {
  63. build = executeNpmPublish();
  64. }
  65. // Fail run if no build is returned
  66. if (build == null) {
  67. return failRun(taskContext);
  68. }
  69. // Append build info and add to context
  70. if (npmBuildContext.isCaptureBuildInfo()) {
  71. build.setName(buildName);
  72. build.setNumber(buildNumber);
  73. buildInfoHelper.addEnvVarsToBuild(npmBuildContext, build);
  74. taskBuildInfo = build;
  75. }
  76. return TaskResultBuilder.newBuilder(taskContext).success().build();
  77. }
  78. private TaskResult failRun(@NotNull CommonTaskContext taskContext) {
  79. return TaskResultBuilder.newBuilder(taskContext).failedWithError().build();
  80. }
  81. /**
  82. * Initialise a BuildInfoHelper from the appropriate parameters (deploy / resolve)
  83. */
  84. private void initBuildInfoHelper(BuildContext buildContext) {
  85. Map<String, String> runtimeContext = taskContext.getRuntimeTaskContext();
  86. if (npmBuildContext.isNpmCommandInstall()) {
  87. buildInfoHelper = BuildInfoHelper.createResolveBuildInfoHelper(buildName, buildNumber, taskContext, buildContext,
  88. environmentVariableAccessor, npmBuildContext.getResolutionArtifactoryServerId(),
  89. npmBuildContext.getOverriddenUsername(runtimeContext, buildInfoLog, false),
  90. npmBuildContext.getOverriddenPassword(runtimeContext, buildInfoLog, false), buildParamsOverrideManager);
  91. } else {
  92. buildInfoHelper = BuildInfoHelper.createDeployBuildInfoHelper(buildName, buildNumber, taskContext, buildContext,
  93. environmentVariableAccessor, npmBuildContext.getArtifactoryServerId(),
  94. npmBuildContext.getOverriddenUsername(runtimeContext, buildInfoLog, true),
  95. npmBuildContext.getOverriddenPassword(runtimeContext, buildInfoLog, true), buildParamsOverrideManager);
  96. }
  97. }
  98. /**
  99. * Handles the execution of npm Install.
  100. *
  101. * @return Build containing affected artifacts, null if execution failed.
  102. */
  103. private Build executeNpmInstall() {
  104. ServerConfig serverConfig = buildInfoHelper.getServerConfig();
  105. Log buildInfoLogger = new BuildInfoLog(log, logger);
  106. ArtifactoryDependenciesClientBuilder depsClientBuilder = TaskUtils.getArtifactoryDependenciesClientBuilder(serverConfig, buildInfoLogger);
  107. ArtifactoryBuildInfoClientBuilder buildInfoClientBuilder = TaskUtils.getArtifactoryBuildInfoClientBuilder(serverConfig, buildInfoLogger);
  108. String repo = buildInfoHelper.overrideParam(npmBuildContext.getResolutionRepo(), BuildParamsOverrideManager.OVERRIDE_ARTIFACTORY_RESOLVE_REPO);
  109. return new NpmInstallCi(depsClientBuilder, buildInfoClientBuilder, repo, npmBuildContext.getArguments(), buildInfoLog, packagePath, environmentVariables, "", buildName, false, "").execute();
  110. }
  111. /**
  112. * Handles the execution of npm Publish.
  113. *
  114. * @return Build containing affected artifacts, null if execution failed.
  115. */
  116. private Build executeNpmPublish() {
  117. String repo = buildInfoHelper.overrideParam(npmBuildContext.getPublishingRepo(), BuildParamsOverrideManager.OVERRIDE_ARTIFACTORY_DEPLOY_REPO);
  118. return new NpmPublish(buildInfoHelper.getClientBuilder(logger, log), TaskUtils.getCommonArtifactPropertiesMap(buildInfoHelper), packagePath, repo, buildInfoLog, environmentVariables, "").execute();
  119. }
  120. /**
  121. * Get package path from the root directory and append subdirectory if needed.
  122. *
  123. * @return Package path
  124. */
  125. private Path getPackagePath() {
  126. File rootDir = taskContext.getRootDirectory();
  127. String subDirectory = npmBuildContext.getWorkingSubdirectory();
  128. if (StringUtils.isNotBlank(subDirectory)) {
  129. return new File(rootDir, subDirectory).toPath();
  130. }
  131. return rootDir.toPath();
  132. }
  133. public void setCustomVariableContext(CustomVariableContext customVariableContext) {
  134. this.customVariableContext = customVariableContext;
  135. }
  136. public Map<String, String> getEnv() throws TaskException {
  137. Map<String, String> env = TaskUtils.getEnvironmentVariables(npmBuildContext, environmentVariableAccessor);
  138. // Npm commands expect the npm executable to be in "PATH".
  139. return TaskUtils.addExecutablePathToEnv(env, npmBuildContext, capabilityContext, NPM_KEY, EXECUTABLE_NAME, TASK_NAME, containerized);
  140. }
  141. @Override
  142. protected ServerConfig getUsageServerConfig() {
  143. return buildInfoHelper.getServerConfig();
  144. }
  145. @Override
  146. protected String getTaskUsageName() {
  147. return "npm";
  148. }
  149. }