Add Build Tracker which Listens for Build Result
Add a build tracker that is spun up when a bulid is created. The tracker will collect environment variables and wait for the build to finish before reporting the results.
This commit is contained in:
parent
b083db56ac
commit
82ed9cc10b
9 changed files with 202 additions and 27 deletions
|
@ -0,0 +1,6 @@
|
|||
package uk.xlab.teamcity.phabricator;
|
||||
|
||||
public interface IPhabricatorPluginLogger {
|
||||
public void info(String message);
|
||||
public void warn(String message, Exception e);
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
package uk.xlab.teamcity.phabricator;
|
||||
|
||||
import jetbrains.buildServer.log.Loggers;
|
||||
|
||||
public final class PhabricatorAgentLogger implements IPhabricatorPluginLogger {
|
||||
|
||||
@Override
|
||||
public void info(String message) {
|
||||
Loggers.AGENT.info(String.format("Phabricator Plugin: %s", message));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void warn(String message, Exception e) {
|
||||
Loggers.AGENT.warn(String.format("Phabricator Plugin: %s", message), e);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
package uk.xlab.teamcity.phabricator;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Holds all the parameters set on the build applied by the
|
||||
* harbormaster trigger from phabricator. It also has the
|
||||
* methods used to communicate the build result back to
|
||||
* harbormaster
|
||||
*
|
||||
* @author steven.cooney
|
||||
*
|
||||
*/
|
||||
public class PhabricatorPluginConfig {
|
||||
|
||||
private IPhabricatorPluginLogger logger;
|
||||
private Map<String, String> params;
|
||||
|
||||
/**
|
||||
* Set the appropriate logger depending if the class is
|
||||
* called from the SERVER or AGENT
|
||||
*
|
||||
* @param logger
|
||||
*/
|
||||
public void setLogger(PhabricatorServerLogger logger) {
|
||||
this.logger = logger;
|
||||
}
|
||||
|
||||
/**
|
||||
* Take a copy of all build parameters which will then
|
||||
* be parsed
|
||||
*
|
||||
* @param parameters
|
||||
*/
|
||||
public void setParameters(Map<String, String> parameters) {
|
||||
params = parameters;
|
||||
|
||||
logger.info(String.format("Looking for parameters"));
|
||||
for (String param : params.keySet()) {
|
||||
if (param != null) {
|
||||
logger.info(String.format("Found %s", param));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,22 +0,0 @@
|
|||
package uk.xlab.teamcity.phabricator;
|
||||
|
||||
import jetbrains.buildServer.log.Loggers;
|
||||
|
||||
public final class PhabricatorPluginLogger {
|
||||
|
||||
public void serverInfo(String message) {
|
||||
Loggers.SERVER.info(String.format("Phabricator Plugin: %s", message));
|
||||
}
|
||||
|
||||
public void serverWarn(String message, Exception e) {
|
||||
Loggers.SERVER.warn(message, e);
|
||||
}
|
||||
|
||||
public void agentInfo(String message) {
|
||||
Loggers.AGENT.info(String.format("Phabricator Plugin: %s", message));
|
||||
}
|
||||
|
||||
public void agentWarn(String message, Exception e) {
|
||||
Loggers.AGENT.warn(String.format("Phabricator Plugin: %s", message), e);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
package uk.xlab.teamcity.phabricator;
|
||||
|
||||
import jetbrains.buildServer.log.Loggers;
|
||||
|
||||
public final class PhabricatorServerLogger implements IPhabricatorPluginLogger {
|
||||
|
||||
@Override
|
||||
public void info(String message) {
|
||||
Loggers.SERVER.info(String.format("Phabricator Plugin: %s", message));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void warn(String message, Exception e) {
|
||||
Loggers.SERVER.warn(String.format("Phabricator Plugin: %s", message), e);
|
||||
}
|
||||
|
||||
// public void agentInfo(String message) {
|
||||
// Loggers.AGENT.info(String.format("Phabricator Plugin: %s", message));
|
||||
// }
|
||||
//
|
||||
// public void agentWarn(String message, Exception e) {
|
||||
// Loggers.AGENT.warn(String.format("Phabricator Plugin: %s", message), e);
|
||||
// }
|
||||
|
||||
}
|
|
@ -0,0 +1,64 @@
|
|||
package uk.xlab.teamcity.phabricator;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import jetbrains.buildServer.serverSide.SBuildFeatureDescriptor;
|
||||
import jetbrains.buildServer.serverSide.SRunningBuild;
|
||||
|
||||
/**
|
||||
* Class that is run in a thread once a build has started. If the build does not
|
||||
* have the phabricator build feature then the tread should come to an end
|
||||
* otherwise wait for the build to finish and report back to phabricator
|
||||
*
|
||||
* @author steven.cooney
|
||||
*
|
||||
*/
|
||||
public class BuildTracker implements Runnable {
|
||||
|
||||
private SRunningBuild build;
|
||||
private PhabricatorServerLogger logger;
|
||||
private PhabricatorPluginConfig phabricatorConfig;
|
||||
|
||||
public BuildTracker(SRunningBuild runningBuild, PhabricatorServerLogger phabLogger) {
|
||||
build = runningBuild;
|
||||
logger = phabLogger;
|
||||
|
||||
phabricatorConfig = new PhabricatorPluginConfig();
|
||||
phabricatorConfig.setLogger(logger);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
// Attempt to get the parameters set by the phabricator build feature. If non
|
||||
// are set then the feature is not turned on.
|
||||
Collection<SBuildFeatureDescriptor> phabricatorBuildFeatureParameters = build
|
||||
.getBuildFeaturesOfType(Constants.BUILD_FEATURE_TYPE);
|
||||
|
||||
// Check if the build is part of a configuration which
|
||||
// uses the phabricator build feature.
|
||||
if (!phabricatorBuildFeatureParameters.isEmpty()) {
|
||||
logger.info("Tracking build " + build.getBuildNumber());
|
||||
|
||||
// Gather together all the build and phabricator parameters
|
||||
Map<String, String> params = new HashMap<>();
|
||||
params.putAll(build.getBuildOwnParameters());
|
||||
params.putAll(phabricatorBuildFeatureParameters.iterator().next().getParameters());
|
||||
|
||||
// Setup plugin specific configuration
|
||||
// TODO: implement AppConfig as PluginConfig
|
||||
phabricatorConfig.setParameters(params);
|
||||
|
||||
while (!build.isFinished()) {
|
||||
// Wait until the build finishes
|
||||
}
|
||||
|
||||
logger.info(String.format("Build %s finished: %s", build.getBuildNumber(), build.getBuildStatus()));
|
||||
|
||||
if (build.getStatusDescriptor().isSuccessful()) {
|
||||
logger.info("Successful Build");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
package uk.xlab.teamcity.phabricator;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import jetbrains.buildServer.serverSide.BuildServerAdapter;
|
||||
import jetbrains.buildServer.serverSide.BuildServerListener;
|
||||
import jetbrains.buildServer.serverSide.SRunningBuild;
|
||||
import jetbrains.buildServer.util.EventDispatcher;
|
||||
|
||||
/**
|
||||
* Listen for builds been started and track their progress
|
||||
* with BuildTracker
|
||||
*
|
||||
* @author steven.cooney
|
||||
*
|
||||
*/
|
||||
public class PhabricatorBuildServerAdapter extends BuildServerAdapter {
|
||||
|
||||
private PhabricatorServerLogger logger;
|
||||
|
||||
public PhabricatorBuildServerAdapter(
|
||||
@NotNull final EventDispatcher<BuildServerListener> buildServerListener,
|
||||
@NotNull final PhabricatorServerLogger phabLogger
|
||||
) {
|
||||
buildServerListener.addListener(this);
|
||||
logger = phabLogger;
|
||||
|
||||
logger.info("Build server adapter registered");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void buildStarted(@NotNull SRunningBuild runningBuild) {
|
||||
super.buildStarted(runningBuild);
|
||||
|
||||
// Do the work in a separate thread to avoid blocking
|
||||
// other builds monitored by this adapter (this might be
|
||||
// a tad overkill)
|
||||
new Thread(new BuildTracker(runningBuild, logger)).start();
|
||||
}
|
||||
}
|
|
@ -10,16 +10,16 @@ import jetbrains.buildServer.web.openapi.PluginDescriptor;
|
|||
public class PhabricatorPluginBuildFeature extends BuildFeature {
|
||||
|
||||
private final String myEditUrl;
|
||||
private PhabricatorPluginLogger logger;
|
||||
private PhabricatorServerLogger logger;
|
||||
|
||||
public PhabricatorPluginBuildFeature(
|
||||
@NotNull final PluginDescriptor pluginDescriptor,
|
||||
@NotNull final PhabricatorPluginLogger logger
|
||||
@NotNull final PhabricatorServerLogger phabLogger
|
||||
) {
|
||||
myEditUrl = pluginDescriptor.getPluginResourcesPath("phabricatorBuildFeature.jsp");
|
||||
this.logger = logger;
|
||||
logger = phabLogger;
|
||||
|
||||
this.logger.serverInfo("Build feature registered");
|
||||
logger.info("Build feature registered");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -5,5 +5,6 @@
|
|||
default-autowire="constructor">
|
||||
|
||||
<bean class="uk.xlab.teamcity.phabricator.PhabricatorPluginBuildFeature" />
|
||||
<bean class="uk.xlab.teamcity.phabricator.PhabricatorPluginLogger" />
|
||||
<bean class="uk.xlab.teamcity.phabricator.PhabricatorServerLogger" />
|
||||
<bean class="uk.xlab.teamcity.phabricator.PhabricatorBuildServerAdapter" />
|
||||
</beans>
|
||||
|
|
Loading…
Reference in a new issue