use of com.uber.jenkins.phabricator.conduit.ConduitAPIClient in project phabricator-jenkins-plugin by uber.
the class PhabricatorNotifier method perform.
@Override
public final boolean perform(final AbstractBuild<?, ?> build, final Launcher launcher, final BuildListener listener) throws InterruptedException, IOException {
EnvVars environment = build.getEnvironment(listener);
Logger logger = new Logger(listener.getLogger());
final String branch = environment.get("GIT_BRANCH");
final String gitUrl = environment.get("GIT_URL");
final UberallsClient uberallsClient = getUberallsClient(logger, gitUrl, branch);
final boolean needsDecoration = build.getActions(PhabricatorPostbuildAction.class).size() == 0;
final String diffID = environment.get(PhabricatorPlugin.DIFFERENTIAL_ID_FIELD);
final String phid = environment.get(PhabricatorPlugin.PHID_FIELD);
final boolean isDifferential = !CommonUtils.isBlank(diffID);
InterruptedBuildAction action = build.getAction(InterruptedBuildAction.class);
if (action != null) {
List<CauseOfInterruption> causes = action.getCauses();
for (CauseOfInterruption cause : causes) {
if (cause instanceof PhabricatorCauseOfInterruption) {
logger.warn(ABORT_TAG, "Skipping notification step since this build was interrupted" + " by a newer build with the same differential revision");
return true;
}
}
}
CoverageProvider coverageProvider;
// So only skip build result processing if both are blank (e.g. master runs to update coverage data)
if (CommonUtils.isBlank(phid) && !isDifferential) {
if (needsDecoration) {
build.addAction(PhabricatorPostbuildAction.createShortText(branch, null));
}
coverageProvider = getCoverageProvider(build, listener, Collections.<String>emptySet());
CodeCoverageMetrics coverageResult = null;
if (coverageProvider != null) {
coverageResult = coverageProvider.getMetrics();
}
NonDifferentialBuildTask nonDifferentialBuildTask = new NonDifferentialBuildTask(logger, uberallsClient, coverageResult, uberallsEnabled, environment.get("GIT_COMMIT"));
// Ignore the result.
nonDifferentialBuildTask.run();
return true;
}
ConduitAPIClient conduitClient;
try {
conduitClient = getConduitClient(build.getParent());
} catch (ConduitAPIException e) {
e.printStackTrace(logger.getStream());
logger.warn(CONDUIT_TAG, e.getMessage());
return false;
}
final String buildUrl = environment.get("BUILD_URL");
if (!isDifferential) {
// Process harbormaster for non-differential builds
Task.Result result = new NonDifferentialHarbormasterTask(logger, phid, conduitClient, build.getResult(), buildUrl).run();
return result == Task.Result.SUCCESS;
}
DifferentialClient diffClient = new DifferentialClient(diffID, conduitClient);
Differential diff;
try {
diff = new Differential(diffClient.fetchDiff());
} catch (ConduitAPIException e) {
e.printStackTrace(logger.getStream());
logger.warn(CONDUIT_TAG, "Unable to fetch differential from Conduit API");
logger.warn(CONDUIT_TAG, e.getMessage());
return true;
}
if (needsDecoration) {
diff.decorate(build, this.getPhabricatorURL(build.getParent()));
}
Set<String> includeFileNames = new HashSet<String>();
for (String file : diff.getChangedFiles()) {
includeFileNames.add(FilenameUtils.getName(file));
}
coverageProvider = getCoverageProvider(build, listener, includeFileNames);
CodeCoverageMetrics coverageResult = null;
if (coverageProvider != null) {
coverageResult = coverageProvider.getMetrics();
}
BuildResultProcessor resultProcessor = new BuildResultProcessor(logger, build, diff, diffClient, environment.get(PhabricatorPlugin.PHID_FIELD), coverageResult, buildUrl, preserveFormatting, coverageCheckSettings);
if (uberallsEnabled) {
boolean passBuildOnUberalls = resultProcessor.processParentCoverage(uberallsClient);
if (!passBuildOnUberalls) {
build.setResult(Result.FAILURE);
}
}
// Add in comments about the build result
resultProcessor.processBuildResult(commentOnSuccess, commentWithConsoleLinkOnFailure);
// Process unit tests results to send to Harbormaster
resultProcessor.processUnitResults(getUnitProvider(build, listener));
// Read coverage data to send to Harbormaster
resultProcessor.processCoverage(coverageProvider);
if (processLint) {
// Read lint results to send to Harbormaster
resultProcessor.processLintResults(lintFile, lintFileSize);
}
// Fail the build if we can't report to Harbormaster
if (!resultProcessor.processHarbormaster()) {
return false;
}
resultProcessor.processRemoteComment(commentFile, commentSize);
resultProcessor.sendComment(commentWithConsoleLinkOnFailure);
return true;
}
use of com.uber.jenkins.phabricator.conduit.ConduitAPIClient in project phabricator-jenkins-plugin by uber.
the class PhabricatorBuildWrapper method setUp.
/**
* {@inheritDoc}
*/
@Override
public Environment setUp(AbstractBuild build, Launcher launcher, BuildListener listener) throws IOException, InterruptedException {
EnvVars environment = build.getEnvironment(listener);
Logger logger = new Logger(listener.getLogger());
if (environment == null) {
return this.ignoreBuild(logger, "No environment variables found?!");
}
final Map<String, String> envAdditions = new HashMap<String, String>();
String phid = environment.get(PhabricatorPlugin.PHID_FIELD);
String diffID = environment.get(PhabricatorPlugin.DIFFERENTIAL_ID_FIELD);
if (CommonUtils.isBlank(diffID)) {
this.addShortText(build);
this.ignoreBuild(logger, "No differential ID found.");
return new Environment() {
};
}
FilePath arcWorkPath;
if (this.workDir != null && this.workDir.length() > 0) {
arcWorkPath = build.getWorkspace().child(workDir);
} else {
arcWorkPath = build.getWorkspace();
}
LauncherFactory starter = new LauncherFactory(launcher, environment, listener.getLogger(), arcWorkPath);
ConduitAPIClient conduitClient;
try {
conduitClient = getConduitClient(build.getParent(), logger);
} catch (ConduitAPIException e) {
e.printStackTrace(logger.getStream());
logger.warn(CONDUIT_TAG, e.getMessage());
return null;
}
DifferentialClient diffClient = new DifferentialClient(diffID, conduitClient);
if (!CommonUtils.isBlank(phid)) {
logger.info("harbormaster", "Sending Harbormaster BUILD_URL via PHID: " + phid);
String buildUrl = environment.get("BUILD_URL");
Task.Result sendUriResult = new SendHarbormasterUriTask(logger, diffClient, phid, buildUrl).run();
if (sendUriResult != Task.Result.SUCCESS) {
logger.info("harbormaster", "Unable to send BUILD_URL to Harbormaster");
}
}
Differential diff;
try {
diff = new Differential(diffClient.fetchDiff());
diff.setCommitMessage(diffClient.getCommitMessage(diff.getRevisionID(false)));
diff.decorate(build, this.getPhabricatorURL(build.getParent()));
logger.info(CONDUIT_TAG, "Fetching differential from Conduit API");
envAdditions.put(DIFFERENTIAL_AUTHOR, diff.getAuthorEmail());
envAdditions.put(DIFFERENTIAL_BASE_COMMIT, diff.getBaseCommit());
envAdditions.put(DIFFERENTIAL_BRANCH, diff.getBranch());
envAdditions.put(DIFFERENTIAL_SUMMARY, diff.getCommitMessage());
} catch (ConduitAPIException e) {
e.printStackTrace(logger.getStream());
logger.warn(CONDUIT_TAG, "Unable to fetch differential from Conduit API");
logger.warn(CONDUIT_TAG, e.getMessage());
return null;
}
String baseCommit = "origin/master";
if (!applyToMaster) {
baseCommit = diff.getBaseCommit();
}
final String conduitToken = this.getConduitToken(build.getParent(), logger);
Task.Result result = new ApplyPatchTask(logger, starter, baseCommit, diffID, conduitToken, getArcPath(), DEFAULT_GIT_PATH, createCommit, skipForcedClean, createBranch, patchWithForceFlag, scmType).run();
if (result != Task.Result.SUCCESS) {
logger.warn("arcanist", "Error applying arc patch; got non-zero exit code " + result);
Task.Result failureResult = new SendHarbormasterResultTask(logger, diffClient, phid, false, null, null, null).run();
if (failureResult != Task.Result.SUCCESS) {
// such failure, very broke
logger.warn("arcanist", "Unable to notify harbormaster of patch failure");
}
// Indicate failure
return null;
}
return new Environment() {
@Override
public void buildEnvVars(Map<String, String> env) {
EnvVars envVars = new EnvVars(env);
envVars.putAll(envAdditions);
env.putAll(envVars);
}
};
}
use of com.uber.jenkins.phabricator.conduit.ConduitAPIClient in project phabricator-jenkins-plugin by uber.
the class BuildResultProcessorTest method testProcessLintViolationsWithNonJsonLines.
@Test
public void testProcessLintViolationsWithNonJsonLines() throws Exception {
String content = "{ \"name\": \"PotentialLeak\", \"code\": \"\", \"severity\": \"error\", \"path\": \"Main.java\", \"line\": 21, \"char\": 5, \"description\": \"Potential leak detected.\n" + "Features should only be in memory when they are attached.\" }\n" + "{ \"name\": \"PotentialLeak\", \"code\": \"\", \"severity\": \"error\", \"path\": \"App.java\", \"line\": 22, \"char\": 5, \"description\": \"Potential leak detected.\n" + "Features should only be in memory when they are attached.\" }\n";
ConduitAPIClient conduitAPIClient = new ConduitAPIClient(null, null) {
@Override
public JSONObject perform(String action, JSONObject params) throws IOException, ConduitAPIException {
// Do nothing.
return new JSONObject();
}
};
BuildResultProcessor buildResultProcessor = runProcessLintViolationsTest(content, conduitAPIClient);
assertEquals(2, buildResultProcessor.getLintResults().getResults().size());
}
use of com.uber.jenkins.phabricator.conduit.ConduitAPIClient in project phabricator-jenkins-plugin by uber.
the class BuildIntegrationTest method assertConduitRequest.
protected void assertConduitRequest(JSONObject expectedRequestParams, String actualRequestBody) throws IOException, ConduitAPIException {
String conduitTestServerAddress = TestUtils.getTestServerAddress(conduit.getServer());
ConduitAPIClient conduitTestClient = new ConduitAPIClient(conduitTestServerAddress, TestUtils.TEST_CONDUIT_TOKEN);
HttpEntityEnclosingRequest request = (HttpEntityEnclosingRequest) conduitTestClient.createRequest("", expectedRequestParams);
String expectedRequestBody = EntityUtils.toString(request.getEntity());
assertEquals(expectedRequestBody, actualRequestBody);
}
use of com.uber.jenkins.phabricator.conduit.ConduitAPIClient in project phabricator-jenkins-plugin by uber.
the class BuildResultProcessorTest method testProcessLintViolations.
@Test
public void testProcessLintViolations() throws Exception {
String content = "{\"name\": \"Syntax Error\"," + "\"code\": \"EXAMPLE\"," + "\"severity\": \"error\"," + "\"path\": \"path/to/example\"," + "\"line\": 17," + "\"char\": 3}";
final LintResult result = new LintResult("Syntax Error", "EXAMPLE", "error", "path/to/example", 17, 3, "");
ConduitAPIClient conduitAPIClient = new ConduitAPIClient(null, null) {
@Override
public JSONObject perform(String action, JSONObject params) throws IOException, ConduitAPIException {
if (action == "harbormaster.sendmessage") {
JSONObject json = (JSONObject) ((JSONArray) params.get("lint")).get(0);
JSONObject parsed = result.toHarbormaster();
assertNotNull(parsed);
assertNotNull(json);
for (String key : (Set<String>) params.keySet()) {
assertEquals("mismatch in expected json key: " + key, parsed.get(key), json.get(key));
}
return result.toHarbormaster();
}
return new JSONObject();
}
};
runProcessLintViolationsTest(content, conduitAPIClient);
}
Aggregations