package org.jfrog.bamboo.task;
import com.atlassian.bamboo.build.logger.BuildLogger;
import com.atlassian.bamboo.task.*;
import com.atlassian.bamboo.variable.CustomVariableContext;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.jetbrains.annotations.NotNull;
import org.jfrog.bamboo.admin.ServerConfig;
import org.jfrog.bamboo.admin.ServerConfigManager;
import org.jfrog.bamboo.configuration.BuildParamsOverrideManager;
import org.jfrog.bamboo.context.GenericContext;
import org.jfrog.bamboo.util.BuildInfoLog;
import org.jfrog.bamboo.util.TaskDefinitionHelper;
import org.jfrog.bamboo.util.generic.GenericArtifactsResolver;
import org.jfrog.bamboo.util.generic.GenericData;
import org.jfrog.build.api.Dependency;
import org.jfrog.build.api.dependency.BuildDependency;
import org.jfrog.build.extractor.BuildInfoExtractorUtils;
import org.jfrog.build.extractor.clientConfiguration.client.ArtifactoryDependenciesClient;
import java.io.IOException;
import java.util.List;
/**
* @author Lior Hasson
*/
public class ArtifactoryGenericResolveTask implements TaskType {
private static final Logger log = Logger.getLogger(ArtifactoryGenericResolveTask.class);
private BuildLogger logger;
private BuildParamsOverrideManager buildParamsOverrideManager;
public ArtifactoryGenericResolveTask(CustomVariableContext customVariableContext) {
this.buildParamsOverrideManager = new BuildParamsOverrideManager(customVariableContext);
}
@NotNull
@Override
public TaskResult execute(@NotNull TaskContext taskContext) throws TaskException {
logger = taskContext.getBuildLogger();
List<? extends TaskDefinition> taskDefinitions = taskContext.getBuildContext().getRuntimeTaskDefinitions();
/**
*In case generic deploy exists in the user job, and the publish build info flag is on, we need to
* capture all the resolution data for the build info, and prepare it to the deploy task.
*/
String buildinfoFlag = "false";
TaskDefinition genericDeployDefinition = TaskDefinitionHelper.findGenericDeployDefinition(taskDefinitions);
if (genericDeployDefinition != null)
buildinfoFlag = genericDeployDefinition.getConfiguration().get("artifactory.generic.publishBuildInfo");
GenericContext genericContext = new GenericContext(taskContext.getConfigurationMap());
ArtifactoryDependenciesClient client = getArtifactoryDependenciesClient(genericContext);
try {
org.jfrog.build.api.util.Log bambooBuildInfoLog = new BuildInfoLog(log, logger);
GenericArtifactsResolver resolver = new GenericArtifactsResolver(taskContext, client,
genericContext.getResolvePattern(), bambooBuildInfoLog);
List<BuildDependency> buildDependencies = resolver.retrieveBuildDependencies();
List<Dependency> dependencies = resolver.retrievePublishedDependencies();
if (buildinfoFlag.equals("true")) {
/**
* Add dependencies for the Generic deploy task, if exists!
* */
addDependenciesToContext(taskContext, buildDependencies, dependencies);
}
} catch (IOException e) {
String message = "Exception occurred while executing task";
logger.addErrorLogEntry(message, e);
log.error(message, e);
return TaskResultBuilder.newBuilder(taskContext).failedWithError().build();
} catch (InterruptedException ie) {
String message = "Exception occurred while executing task";
logger.addErrorLogEntry(message, ie);
log.error(message, ie);
return TaskResultBuilder.newBuilder(taskContext).failedWithError().build();
}
return TaskResultBuilder.newBuilder(taskContext).success().build();
}
private void addDependenciesToContext(TaskContext taskContext, List<BuildDependency> buildDependencies, List<Dependency> dependencies) throws IOException {
GenericData gd = new GenericData();
gd.setBuildDependencies(buildDependencies);
gd.setDependencies(dependencies);
String json = BuildInfoExtractorUtils.buildInfoToJsonString(gd);
taskContext.getBuildContext().getParentBuildContext().getBuildResult().
getCustomBuildData().put("genericJson", json);
}
private ArtifactoryDependenciesClient getArtifactoryDependenciesClient(GenericContext genericContext) {
ServerConfigManager serverConfigManager = ServerConfigManager.getInstance();
ServerConfig serverConfig = serverConfigManager.getServerConfigById(genericContext.getSelectedServerId());
if (serverConfig == null) {
throw new IllegalArgumentException("Could not find Artifactpry server. Please check the Artifactory server in the task configuration.");
}
String username = overrideParam(serverConfigManager.substituteVariables(genericContext.getUsername()), BuildParamsOverrideManager.OVERRIDE_ARTIFACTORY_RESOLVER_USERNAME);
if (StringUtils.isBlank(username)) {
username = serverConfigManager.substituteVariables(serverConfig.getUsername());
}
String password = overrideParam(serverConfigManager.substituteVariables(genericContext.getPassword()), BuildParamsOverrideManager.OVERRIDE_ARTIFACTORY_RESOLVER_PASSWORD);
if (StringUtils.isBlank(password)) {
password = serverConfigManager.substituteVariables(serverConfig.getPassword());
}
String serverUrl = serverConfigManager.substituteVariables(serverConfig.getUrl());
return new ArtifactoryDependenciesClient(serverUrl, username, password, new BuildInfoLog(log));
}
public String overrideParam(String originalValue, String overrideKey) {
String overriddenValue = buildParamsOverrideManager.getOverrideValue(overrideKey);
return overriddenValue.isEmpty() ? originalValue : overriddenValue;
}
}