From a300d9928e69cfe2f4352d0452b1d9c999eb60e0 Mon Sep 17 00:00:00 2001 From: krad Date: Tue, 19 Jan 2016 15:33:20 -0800 Subject: [PATCH] Added sandcastle pre-commit Test Plan: Lately we have been breaking our builds too often. This changes adds the capability to schedule tests in sandcastle for every diff created. This will help us increase the pre-commit testing bar. This patch will dispatch signals to sandcastle to start running tests on the diff. The test failures are reported to the user via email. The user can also manually check the progress of test in sandcastle via the URL provided. Reviewers: sdong, rven Subscribers: dhruba, leveldb Differential Revision: https://reviews.facebook.net/D53001 --- .../config/FacebookArcanistConfiguration.php | 103 +++++++++++++++++- 1 file changed, 101 insertions(+), 2 deletions(-) diff --git a/arcanist_util/config/FacebookArcanistConfiguration.php b/arcanist_util/config/FacebookArcanistConfiguration.php index c3454903b..e9f4b0828 100644 --- a/arcanist_util/config/FacebookArcanistConfiguration.php +++ b/arcanist_util/config/FacebookArcanistConfiguration.php @@ -10,13 +10,112 @@ class FacebookArcanistConfiguration extends ArcanistConfiguration { ArcanistBaseWorkflow $workflow, $error_code) { if ($command == 'diff' && !$workflow->isRawDiffSource()) { - $this->maybePushToJenkins($workflow); + $this->startTestsInJenkins($workflow); + $this->startTestsInSandcastle($workflow); } } + ////////////////////////////////////////////////////////////////////// + /* Run tests in sandcastle */ + function getSteps($diffID, $username) { + $arcrc_content = exec("cat ~/.arcrc | base64 -w0"); + + $setup = array( + "name" => "Setup arcrc", + "shell" => "echo " . $arcrc_content . " | base64 --decode > ~/.arcrc", + "user" => "root" + ); + + $fix_permission = array( + "name" => "Fix environment", + "shell" => "chmod 600 ~/.arcrc", + "user" => "root" + ); + + $fix_git_ignore = array( + "name" => "Fix git ignore", + "shell" => "echo fbcode >> .git/info/exclude", + "user" => "root" + ); + + $patch = array( + "name" => "Patch " . $diffID, + "shell" => "HTTPS_PROXY=fwdproxy:8080 arc --arcrc-file ~/.arcrc " + . "patch D" . $diffID . " || rm -f ~/.arcrc", + "user" => "root" + ); + + $cleanup = array( + "name" => "Arc cleanup", + "shell" => "rm -f ~/.arcrc", + "user" => "root" + ); + + $steps[] = $setup; + $steps[] = $fix_permission; + $steps[] = $fix_git_ignore; + $steps[] = $patch; + $steps[] = $cleanup; + + $tests = array( + "unit", "clang_unit", "tsan", "asan", "valgrind" + ); + + foreach ($tests as $test) { + $run_test = array( + "name" => "Run " . $test, + "shell" => "EMAIL=" . $username . "@fb.com " + . "./build_tools/rocksdb-lego-determinator " . $test, + "user" => "root", + "determinator" => true + ); + + $steps[] = $run_test; + } + + return $steps; + } + + function startTestsInSandcastle($workflow) { + $diffID = $workflow->getDiffId(); + $username = exec("whoami"); + + if ($diffID == null || $username == null) { + return; + } + + $arg = array( + "name" => "RocksDB diff D" . $diffID . "testing for " . $username, + "steps" => $this->getSteps($diffID, $username) + ); + + $url = 'https://interngraph.intern.facebook.com/sandcastle/generate?' + .'command=SandcastleUniversalCommand' + .'&vcs=rocksdb-git&revision=origin%2Fmaster&type=lego' + .'&user=krad&alias=ci-util' + .'&command-args=' . urlencode(json_encode($arg)); + + $cmd = 'https_proxy= HTTPS_PROXY= curl -s -k -F app=659387027470559 ' + . '-F token=AeO_3f2Ya3TujjnxGD4 "' . $url . '"'; + + echo "\n====================================================== \n"; + echo "Scheduling sandcastle job for D" . $diffID . " for " . $username; + echo "\n"; + echo "Please follow the URL for details on the job. \n"; + echo "An email will be sent to " . $username . "@fb.com on failure. \n"; + echo "\n"; + echo "Job details: \n"; + + $output = shell_exec($cmd); + + echo $output; + + echo "\n====================================================== \n"; + } + ////////////////////////////////////////////////////////////////////// /* Send off builds to jenkins */ - function maybePushToJenkins($workflow) { + function startTestsInJenkins($workflow) { $diffID = $workflow->getDiffID(); if ($diffID === null) { return;