Remote agent support

This commit is contained in:
Carolyn Van Slyck 2015-06-19 13:40:54 -05:00
parent 110f3368ca
commit abb7f6225f
7 changed files with 91 additions and 26 deletions

View file

@ -7,7 +7,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.carolynvs</groupId>
<artifactId>gitallthethings</artifactId>
<version>0.9.0.0</version>
<version>0.9.0.1</version>
<organization>
<name>Carolyn Van Slyck</name>
@ -67,12 +67,7 @@
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20140107</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>

View file

@ -1,6 +1,5 @@
package com.carolynvs.gitallthethings.task;
import com.atlassian.activeobjects.external.ActiveObjects;
import com.atlassian.bamboo.admin.configuration.AdministrationConfigurationService;
import com.atlassian.bamboo.build.BuildLoggerManager;
import com.atlassian.bamboo.build.CustomBuildProcessorServer;
@ -12,19 +11,17 @@ import com.carolynvs.gitallthethings.PullRequestBuildContext;
import com.carolynvs.gitallthethings.webhook.*;
import org.jetbrains.annotations.NotNull;
import java.util.Map;
public class PullRequestReportStatusTask implements TaskType, CustomBuildProcessorServer
{
private final PluginDataManager pluginData;
private final BambooLinkBuilder bambooLinkBuilder;
private final GitHubCommunicator github;
private final BuildLoggerManager buildLoggerManager;
private BuildContext finalBuildContext;
public PullRequestReportStatusTask(AdministrationConfigurationService administrationConfigurationService, BuildLoggerManager buildLoggerManager, ActiveObjects ao)
public PullRequestReportStatusTask(BuildLoggerManager buildLoggerManager)
{
this.buildLoggerManager = buildLoggerManager;
this.pluginData = new PluginDataManager(ao);
this.bambooLinkBuilder = new BambooLinkBuilder(administrationConfigurationService);
this.github = new GitHubCommunicator();
}
@ -49,16 +46,17 @@ public class PullRequestReportStatusTask implements TaskType, CustomBuildProcess
public BuildContext call()
throws Exception
{
if(!shouldReportPullRequestStatus())
TaskDefinition taskDefinition = getTaskDefinitionFromBuild();
if(taskDefinition == null)
return finalBuildContext;
String planKey = finalBuildContext.getPlanKey();
BuildState buildState = finalBuildContext.getBuildResult().getBuildState();
PullRequestBuildContext pullRequestBuildContext = new PullRequestBuildContext();
BuildLogger logger = buildLoggerManager.getLogger(finalBuildContext.getResultKey());
String token = pluginData.getOAuthToken(planKey);
String buildResultUrl = bambooLinkBuilder.getBuildUrl(finalBuildContext.getBuildResultKey());
final Map<String, String> taskData = finalBuildContext.getRuntimeTaskContext().getRuntimeContextForTask(taskDefinition);
String token = taskData.get(PullRequestReportStatusTaskDataProvider.TOKEN_KEY);
String buildResultUrl = taskData.get(PullRequestReportStatusTaskDataProvider.BUILD_RESULT_URL_KEY);
String status = buildState == BuildState.SUCCESS ? GitHubCommitState.Success : GitHubCommitState.Failure;
String description = buildState == BuildState.SUCCESS ? "The build succeeded." : "The build failed.";
GitHubSetCommitStatusRequest statusRequest = new GitHubSetCommitStatusRequest(status, description, buildResultUrl);
@ -81,13 +79,13 @@ public class PullRequestReportStatusTask implements TaskType, CustomBuildProcess
return finalBuildContext;
}
private boolean shouldReportPullRequestStatus()
private TaskDefinition getTaskDefinitionFromBuild()
{
for (TaskDefinition taskDefinition : finalBuildContext.getBuildDefinition().getTaskDefinitions())
{
if(taskDefinition.getPluginKey().equals("com.carolynvs.gitallthethings:PullRequestReportStatusTask"))
return true;
return taskDefinition;
}
return false;
return null;
}
}

View file

@ -0,0 +1,50 @@
package com.carolynvs.gitallthethings.task;
import com.atlassian.activeobjects.external.ActiveObjects;
import com.atlassian.bamboo.admin.configuration.AdministrationConfigurationService;
import com.atlassian.bamboo.task.RuntimeTaskDataProvider;
import com.atlassian.bamboo.task.TaskDefinition;
import com.atlassian.bamboo.task.runtime.RuntimeTaskDefinition;
import com.atlassian.bamboo.v2.build.BuildContext;
import com.atlassian.bamboo.v2.build.CommonContext;
import com.carolynvs.gitallthethings.admin.GitThingsConfig;
import com.carolynvs.gitallthethings.webhook.BambooLinkBuilder;
import com.carolynvs.gitallthethings.webhook.PluginDataManager;
import org.jetbrains.annotations.NotNull;
import java.util.HashMap;
import java.util.Map;
public class PullRequestReportStatusTaskDataProvider implements RuntimeTaskDataProvider
{
public static final String TOKEN_KEY = "token";
public static final String BUILD_RESULT_URL_KEY = "build_result_url";
private final PluginDataManager pluginData;
private final BambooLinkBuilder bambooLinkBuilder;
public PullRequestReportStatusTaskDataProvider(ActiveObjects ao, AdministrationConfigurationService administrationConfigurationService)
{
this.pluginData = new PluginDataManager(ao);
this.bambooLinkBuilder = new BambooLinkBuilder(administrationConfigurationService);
}
@NotNull
@Override
public Map<String, String> populateRuntimeTaskData(@NotNull TaskDefinition taskDefinition, @NotNull CommonContext commonContext)
{
Map<String, String> taskData = new HashMap<String, String>();
BuildContext buildContext = (BuildContext)commonContext;
GitThingsConfig config = pluginData.getConfig(buildContext.getPlanKey());
taskData.put(TOKEN_KEY, config.getToken());
taskData.put(BUILD_RESULT_URL_KEY, bambooLinkBuilder.getBuildUrl(buildContext.getParentBuildContext().getPlanResultKey().toString()));
return taskData;
}
@Override
public void processRuntimeTaskData(@NotNull TaskDefinition taskDefinition, @NotNull CommonContext commonContext) { }
@Override
public void processRuntimeTaskData(@NotNull RuntimeTaskDefinition runtimeTaskDefinition, @NotNull CommonContext commonContext) { }
}

View file

@ -31,7 +31,7 @@ public class PullRequestBuilder
User triggerUser = pluginData.getAssociatedUser(planKey, pullRequestEvent);
String buildResultUrl = planTrigger.execute(PlanKeys.getPlanKey(planKey), triggerUser, variables);
String token = pluginData.getOAuthToken(planKey);
String token = pluginData.getConfig(planKey).getToken();
GitHubSetCommitStatusRequest statusRequest = new GitHubSetCommitStatusRequest(GitHubCommitState.Pending, "The build is running", buildResultUrl);
github.setPullRequestStatus(token, pullRequestEvent.PullRequest, statusRequest);

View file

@ -40,7 +40,7 @@ public class PullRequestTriggerResource
if(pullRequestEvent == null)
return Response.status(Response.Status.BAD_REQUEST).build();
String webHookSecret = pluginData.getWebHookSecret(planKey);
String webHookSecret = pluginData.getConfig(planKey).getSecret();
if(!github.validWebHook(webHookSecret, jsonBody, signature))
return Response.status(Response.Status.UNAUTHORIZED).build();

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:osgi="http://www.springframework.org/schema/osgi"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/osgi
http://www.springframework.org/schema/osgi/spring-osgi.xsd"
default-autowire="autodetect">
<osgi:reference id="capabilityContext">
<osgi:interfaces>
<value>com.atlassian.bamboo.v2.build.agent.capability.CapabilityContext</value>
</osgi:interfaces>
</osgi:reference>
<osgi:reference id="buildLoggerManager">
<osgi:interfaces>
<value>com.atlassian.bamboo.build.BuildLoggerManager</value>
</osgi:interfaces>
</osgi:reference>
</beans>

View file

@ -31,6 +31,7 @@
<taskType key="PullRequestReportStatusTask" name="Pull Request Report Status" class="com.carolynvs.gitallthethings.task.PullRequestReportStatusTask">
<description>Indicate that the status of the build should be reported when the build completes</description>
<category name="repository"/>
<runtimeTaskDataProvider class="com.carolynvs.gitallthethings.task.PullRequestReportStatusTaskDataProvider"/>
<resource type="download" name="icon" location="images/pullrequest.png"/>
</taskType>
@ -58,9 +59,9 @@
</xwork>
<component-import key="ao" name="Active Objects service" interface="com.atlassian.activeobjects.external.ActiveObjects" />
<component-import key="CapabilityContext" interface="com.atlassian.bamboo.v2.build.agent.capability.CapabilityContext" />
<component-import key="AdministrationConfigurationService" interface="com.atlassian.bamboo.admin.configuration.AdministrationConfigurationService" />
<component-import key="PlanExecutionManager" interface="com.atlassian.bamboo.plan.PlanExecutionManager" />
<component-import key="PlanManager" interface="com.atlassian.bamboo.plan.PlanManager" />
<component-import key="capabilityContext" interface="com.atlassian.bamboo.v2.build.agent.capability.CapabilityContext"/>
<component-import key="administrationConfigurationService" interface="com.atlassian.bamboo.admin.configuration.AdministrationConfigurationService" />
<component-import key="planExecutionManager" interface="com.atlassian.bamboo.plan.PlanExecutionManager" />
<component-import key="planManager" interface="com.atlassian.bamboo.plan.PlanManager" />
</atlassian-plugin>