Search in sources :

Example 1 with ConduitAPIClient

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;
}
Also used : CodeCoverageMetrics(com.uber.jenkins.phabricator.coverage.CodeCoverageMetrics) NonDifferentialHarbormasterTask(com.uber.jenkins.phabricator.tasks.NonDifferentialHarbormasterTask) Task(com.uber.jenkins.phabricator.tasks.Task) NonDifferentialBuildTask(com.uber.jenkins.phabricator.tasks.NonDifferentialBuildTask) NonDifferentialHarbormasterTask(com.uber.jenkins.phabricator.tasks.NonDifferentialHarbormasterTask) CauseOfInterruption(jenkins.model.CauseOfInterruption) Differential(com.uber.jenkins.phabricator.conduit.Differential) UberallsClient(com.uber.jenkins.phabricator.uberalls.UberallsClient) ConduitAPIException(com.uber.jenkins.phabricator.conduit.ConduitAPIException) DifferentialClient(com.uber.jenkins.phabricator.conduit.DifferentialClient) ConduitAPIClient(com.uber.jenkins.phabricator.conduit.ConduitAPIClient) Logger(com.uber.jenkins.phabricator.utils.Logger) EnvVars(hudson.EnvVars) CoverageProvider(com.uber.jenkins.phabricator.coverage.CoverageProvider) NonDifferentialBuildTask(com.uber.jenkins.phabricator.tasks.NonDifferentialBuildTask) InterruptedBuildAction(jenkins.model.InterruptedBuildAction) HashSet(java.util.HashSet)

Example 2 with ConduitAPIClient

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);
        }
    };
}
Also used : FilePath(hudson.FilePath) SendHarbormasterUriTask(com.uber.jenkins.phabricator.tasks.SendHarbormasterUriTask) ApplyPatchTask(com.uber.jenkins.phabricator.tasks.ApplyPatchTask) SendHarbormasterResultTask(com.uber.jenkins.phabricator.tasks.SendHarbormasterResultTask) Task(com.uber.jenkins.phabricator.tasks.Task) SendHarbormasterResultTask(com.uber.jenkins.phabricator.tasks.SendHarbormasterResultTask) Differential(com.uber.jenkins.phabricator.conduit.Differential) HashMap(java.util.HashMap) ConduitAPIException(com.uber.jenkins.phabricator.conduit.ConduitAPIException) DifferentialClient(com.uber.jenkins.phabricator.conduit.DifferentialClient) ConduitAPIClient(com.uber.jenkins.phabricator.conduit.ConduitAPIClient) Logger(com.uber.jenkins.phabricator.utils.Logger) SendHarbormasterUriTask(com.uber.jenkins.phabricator.tasks.SendHarbormasterUriTask) EnvVars(hudson.EnvVars) ApplyPatchTask(com.uber.jenkins.phabricator.tasks.ApplyPatchTask) HashMap(java.util.HashMap) Map(java.util.Map)

Example 3 with ConduitAPIClient

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());
}
Also used : JSONObject(net.sf.json.JSONObject) ConduitAPIClient(com.uber.jenkins.phabricator.conduit.ConduitAPIClient) Test(org.junit.Test)

Example 4 with ConduitAPIClient

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);
}
Also used : HttpEntityEnclosingRequest(org.apache.http.HttpEntityEnclosingRequest) ConduitAPIClient(com.uber.jenkins.phabricator.conduit.ConduitAPIClient) CoreMatchers.containsString(org.hamcrest.CoreMatchers.containsString)

Example 5 with ConduitAPIClient

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);
}
Also used : Set(java.util.Set) JSONObject(net.sf.json.JSONObject) LintResult(com.uber.jenkins.phabricator.lint.LintResult) ConduitAPIClient(com.uber.jenkins.phabricator.conduit.ConduitAPIClient) Test(org.junit.Test)

Aggregations

ConduitAPIClient (com.uber.jenkins.phabricator.conduit.ConduitAPIClient)5 ConduitAPIException (com.uber.jenkins.phabricator.conduit.ConduitAPIException)2 Differential (com.uber.jenkins.phabricator.conduit.Differential)2 DifferentialClient (com.uber.jenkins.phabricator.conduit.DifferentialClient)2 Task (com.uber.jenkins.phabricator.tasks.Task)2 Logger (com.uber.jenkins.phabricator.utils.Logger)2 EnvVars (hudson.EnvVars)2 JSONObject (net.sf.json.JSONObject)2 Test (org.junit.Test)2 CodeCoverageMetrics (com.uber.jenkins.phabricator.coverage.CodeCoverageMetrics)1 CoverageProvider (com.uber.jenkins.phabricator.coverage.CoverageProvider)1 LintResult (com.uber.jenkins.phabricator.lint.LintResult)1 ApplyPatchTask (com.uber.jenkins.phabricator.tasks.ApplyPatchTask)1 NonDifferentialBuildTask (com.uber.jenkins.phabricator.tasks.NonDifferentialBuildTask)1 NonDifferentialHarbormasterTask (com.uber.jenkins.phabricator.tasks.NonDifferentialHarbormasterTask)1 SendHarbormasterResultTask (com.uber.jenkins.phabricator.tasks.SendHarbormasterResultTask)1 SendHarbormasterUriTask (com.uber.jenkins.phabricator.tasks.SendHarbormasterUriTask)1 UberallsClient (com.uber.jenkins.phabricator.uberalls.UberallsClient)1 FilePath (hudson.FilePath)1 HashMap (java.util.HashMap)1