package org.jfrog.bamboo.processor; import com.atlassian.bamboo.build.BuildDefinition; import com.atlassian.bamboo.build.BuildLoggerManager; import com.atlassian.bamboo.build.CustomBuildProcessor; import com.atlassian.bamboo.build.artifact.ArtifactManager; import com.atlassian.bamboo.build.logger.BuildLogger; import com.atlassian.bamboo.plan.PlanResultKey; import com.atlassian.bamboo.plan.artifact.ArtifactDefinitionContextImpl; import com.atlassian.bamboo.security.SecureToken; import com.atlassian.bamboo.task.TaskDefinition; import com.atlassian.bamboo.v2.build.BuildContext; import com.atlassian.bamboo.v2.build.task.AbstractBuildTask; import com.google.common.collect.Maps; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.jetbrains.annotations.NotNull; import org.jfrog.bamboo.context.AbstractBuildContext; import org.jfrog.bamboo.context.GradleBuildContext; import org.jfrog.bamboo.release.provider.TokenDataProvider; import org.jfrog.bamboo.util.TaskDefinitionHelper; import org.jfrog.bamboo.util.version.VcsHelper; import java.io.File; import java.util.List; import java.util.Map; /** * Copy the {@code gradle.properties} file to the artifacts folder of the build, this will be later used for detecting * the release properties and next integration properties. This applies only to {@link * org.jfrog.bamboo.task.ArtifactoryGradleTask} type builds. This is done since if a build is consistently built on a * remote agent, the server will may become out of date, and will continuously display incorrect properties and their * respective values. * * @author Tomer Cohen */ public class GradlePropertiesCopier extends AbstractBuildTask implements CustomBuildProcessor { private static final Logger log = Logger.getLogger(GradlePropertiesCopier.class); private volatile ArtifactManager artifactManager; private BuildLoggerManager buildLoggerManager; @Override @NotNull public BuildContext call() throws Exception { PlanResultKey planResultKey = buildContext.getPlanResultKey(); BuildLogger buildLogger = buildLoggerManager.getLogger(planResultKey); BuildDefinition definition = buildContext.getBuildDefinition(); File checkoutDir = VcsHelper.getCheckoutDirectory(buildContext); if (checkoutDir == null) { return buildContext; } List<TaskDefinition> taskDefinitions = definition.getTaskDefinitions(); TaskDefinition gradleDefinition = TaskDefinitionHelper.findGradleDefinition(taskDefinitions); if (gradleDefinition == null) { log.debug("Current build is not a gradle build"); return buildContext; } if (checkoutDir.exists()) { GradleBuildContext gradleBuildContext = (GradleBuildContext) AbstractBuildContext.createContextFromMap(gradleDefinition.getConfiguration()); String location = ""; String directory = gradleBuildContext.getBuildScript(); if (StringUtils.isNotBlank(directory)) { location = directory; } File gradleProps = new File(new File(checkoutDir, location), "gradle.properties"); if (gradleProps.exists()) { TaskDefinition def = TaskDefinitionHelper.findGradleDefinition(buildContext.getRuntimeTaskDefinitions()); String securityToken = buildContext.getRuntimeTaskContext() .getRuntimeContextForTask(def) .get(TokenDataProvider.SECURITY_TOKEN); ArtifactDefinitionContextImpl artifact = new ArtifactDefinitionContextImpl("gradle", false, SecureToken.createFromString(securityToken)); artifact.setLocation(location); artifact.setCopyPattern(gradleProps.getName()); Map<String, String> config = Maps.newHashMap(); artifactManager.publish(buildLogger, planResultKey, checkoutDir, artifact, config, 1); } } return buildContext; } public void setArtifactManager(ArtifactManager artifactManager) { this.artifactManager = artifactManager; } public void setBuildLoggerManager(BuildLoggerManager buildLoggerManager) { this.buildLoggerManager = buildLoggerManager; } }