package org.jfrog.bamboo.release.action;
import com.atlassian.bamboo.build.BuildLoggerManager;
import com.atlassian.bamboo.build.CustomPreBuildAction;
import com.atlassian.bamboo.build.logger.BuildLogger;
import com.atlassian.bamboo.credentials.CredentialsAccessor;
import com.atlassian.bamboo.task.TaskDefinition;
import com.atlassian.bamboo.v2.build.BuildContext;
import com.atlassian.bamboo.variable.CustomVariableContext;
import org.apache.log4j.Logger;
import org.jetbrains.annotations.NotNull;
import org.jfrog.bamboo.context.AbstractBuildContext;
import org.jfrog.bamboo.release.provider.AbstractReleaseProvider;
import org.jfrog.bamboo.release.provider.ReleaseProvider;
import org.jfrog.bamboo.util.TaskDefinitionHelper;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* This event is fired <b>before</b> the actual build starts. It will determine if this is a valid build for release
* (Maven/Gradle) and will determine if this is build is running in release mode, if it is it will fire the appropriate
* events.
*
* @author Tomer Cohen
*/
public class ArtifactoryPreBuildAction extends AbstractBuildAction implements CustomPreBuildAction {
private static final Logger log = Logger.getLogger(ArtifactoryPreBuildAction.class);
private BuildLoggerManager buildLoggerManager;
private CustomVariableContext customVariableContext;
private CredentialsAccessor credentialsAccessor;
@Override
@NotNull
public BuildContext call() throws Exception {
BuildLogger logger = buildLoggerManager.getLogger(buildContext.getPlanResultKey());
setBuildLogger(logger);
List<TaskDefinition> taskDefinitions = buildContext.getBuildDefinition().getTaskDefinitions();
if (taskDefinitions.isEmpty()) {
log("No task definitions found for this build");
return buildContext;
}
TaskDefinition mavenOrGradleDefinition = TaskDefinitionHelper.findMavenOrGradleDefinition(taskDefinitions);
if (mavenOrGradleDefinition == null) {
log.debug("[RELEASE] Build is not a Maven or Gradle build");
return buildContext;
}
Map<String, String> configuration = mavenOrGradleDefinition.getConfiguration();
BuildContext parentBuildContext = buildContext.getParentBuildContext();
if (parentBuildContext == null) {
log.debug("[RELEASE] Release management is not active, resuming normally");
return buildContext;
}
Map<String, String> customBuildData = parentBuildContext.getBuildResult().getCustomBuildData();
configuration.putAll(customBuildData);
AbstractBuildContext config = AbstractBuildContext.createContextFromMap(configuration);
if ((config == null) || !config.releaseManagementContext.isActivateReleaseManagement() || !config.releaseManagementContext.isReleaseMgmtEnabled()) {
log.debug("[RELEASE] Release management is not active, resuming normally");
return buildContext;
}
ReleaseProvider provider = AbstractReleaseProvider.createReleaseProvider(config, buildContext, logger, customVariableContext, credentialsAccessor);
if (provider == null) {
String message = "Release Provider could not be built";
log.error(logger.addBuildLogEntry(message));
buildContext.getBuildResult().addBuildErrors(Arrays.asList(message));
return buildContext;
}
log.info(logger.addBuildLogEntry("[RELEASE] Release Build Active"));
provider.prepare();
provider.beforeReleaseVersionChange();
boolean modified = provider.transformDescriptor(configuration, true);
customBuildData.put(ReleaseProvider.MODIFIED_FILES_FOR_RELEASE, String.valueOf(modified));
customBuildData.put(ReleaseProvider.CURRENT_CHECKOUT_BRANCH, provider.getCurrentCheckoutBranch());
customBuildData.put(ReleaseProvider.CURRENT_WORKING_BRANCH, provider.getCurrentWorkingBranch());
customBuildData.put(ReleaseProvider.BASE_COMMIT_ISH, provider.getBaseCommitIsh());
customBuildData.put(ReleaseProvider.RELEASE_BRANCH_CREATED, String.valueOf(provider.isReleaseBranchCreated()));
customBuildData.put(ReleaseProvider.CURRENT_CHANGE_LIST_ID, String.valueOf(provider.getCurrentChangeListId()));
return buildContext;
}
public void setBuildLoggerManager(BuildLoggerManager buildLoggerManager) {
this.buildLoggerManager = buildLoggerManager;
}
public void setCustomVariableContext(CustomVariableContext customVariableContext) {
this.customVariableContext = customVariableContext;
}
public void setCredentialsAccessor(CredentialsAccessor credentialsAccessor) {
this.credentialsAccessor = credentialsAccessor;
}
}