summaryrefslogtreecommitdiff
path: root/nightly
diff options
context:
space:
mode:
Diffstat (limited to 'nightly')
-rw-r--r--nightly/README.txt237
1 files changed, 194 insertions, 43 deletions
diff --git a/nightly/README.txt b/nightly/README.txt
index 6b4d79d6..464842d3 100644
--- a/nightly/README.txt
+++ b/nightly/README.txt
@@ -1,44 +1,195 @@
-
+INTRO
+-----
This directory (nightly/) contains a simple, automatic build-and-test
-system for Valgrind, intended to be run by cron.
-
-Note (importantly) it doesn't test the sources in the tree of which
-this directory is a part (viz, nightly/..). Instead it checks out
-a complete new tree, builds and tests that independently of the
-existing tree.
-
-To use, choose a tag, probably a machine name, and run
-
- bin/nightly /path/to/valgrind/nightly/ <tag>
-
-and supply the following two config files:
-
-- conf/<tag>.conf: this is sourced by the 'nightly' script, and can define
- any or all of the following environment variables:
-
- ABT_DETAILS: describes the machine in more detail, eg. the OS. The default
- is empty.
- ABT_CONFIGURE_OPTIONS: gives extra configure options. The default is empty.
- ABT_EVAL: if provided, it must be the name of a shell script that executes
- the shell command $1 with arguments $2 .. ${$#}. Allows to compile and
- run the Valgrind regression tests on another system than the system the
- 'nightly' script runs on. It is assumed that the remote system shares the
- local filesystem tree through e.g. NFS. It is the responsibility of the
- shell script to set the remote working directory such that it matches the
- local current directory ($PWD).
- ABT_RUN_REGTEST: if provided, it must be the name of an argumentless shell
- function (also specified in the tag.conf file) that will be used to run
- the tests. If not specified, the usual "perl tests/vg_regtest --all"
- will be used.
- ABT_JOBS: allows parallel builds -- it's passed as the argument to "make
- -j" when building Valgrind and the tests. The default is 1.
- [XXX: the .NOTPARALLEL that currently resides in Makefile.all.am foils
- this!]
-
-- conf/<tag>.sendmail: this should be a script that sends an email to the
- desired recipient (eg. the valgrind-developers list). It takes three
- command line arguments. The first is the email subject line, the second
- is the name of the file containing the email's body (showing the tests
- that failed, and the difference between now and 24 hours ago), the third
- is the name of the file containing all the diffs (which can be made into
- an attachment, for example).
+system for Valgrind, intended to be run nightly by cron or a similar
+program.
+
+
+BASIC OPERATIONS
+----------------
+When run, the system checks out two trees: the SVN trunk from 24 hours ago
+and the SVN trunk from now. ("24 hours ago" and "now" are determined when
+the script starts running, so if any commits happen while the tests are
+running they will not be tested.)
+
+If the two trees are different (i.e. there have been commits in the past 24
+hours) it builds ("make"), installs ("make install") and runs the regression
+tests ("make regtest") in both, and compares the results. Note that the
+"make install" isn't necessary in order to run the tests because the
+regression tests use the code built (with "make") within the tree, but it's
+worth doing because it tests that "make install" isn't totally broken.
+After checking both trees, it emails a summary of the results to a
+recipient. All this typically takes something like 30 minutes.
+
+If the two trees are identical, the tests are not run and no results are
+emailed. This avoids spamming people with uninteresting results emails when
+no commits have happened recently.
+
+
+SETTING UP
+----------
+To set up nightly testing for a machine, do the following.
+
+(1) Check out just this directory from the repository, eg:
+
+ svn co svn://svn.valgrind.org/valgrind/trunk/nightly $DIR
+
+ where $DIR is the name of the directory you want it to be in.
+
+ Note that this doesn't check out the whole Valgrind tree, just the
+ directory containing the nightly testing stuff. This is possible
+ because the testing script doesn't check the code in the tree it belongs
+ to; rather it checks out new trees (within $DIR) and tests them
+ independently.
+
+(2) Choose a tag that identifies the test results. This is usually the
+ machine name. We'll call it $TAG in what follows.
+
+(3) Create a configuration file $DIR/conf/$TAG.conf. It is sourced by the
+ 'nightly' script, and can define any or all of the following environment
+ variables. (In most cases, only ABT_DETAILS is needed.)
+
+ - ABT_DETAILS: describes the machine in more detail, eg. the OS. The
+ default is empty, but you should define it. An example:
+
+ export ABT_DETAILS="Ubuntu 9.04, Intel x86-64"
+
+ You could also use some invocation of 'uname' or something similar
+ to generate this string. Eg. on Ubuntu Linux this works nicely:
+
+ export ABT_DETAILS="`cat /etc/issue.net`, `uname -m`"
+
+ And on Mac OS X this works nicely:
+
+ export ABT_DETAILS=`uname -mrs`
+
+ The advantage of doing it like this is that if you update the OS on
+ the test machine you won't have to update ABT_DETAILS manually.
+
+ - ABT_CONFIGURE_OPTIONS: gives extra configure options. The default is
+ empty.
+
+ - ABT_EVAL: if provided, it must be the name of a shell script that
+ executes the shell command $1 with arguments $2 .. ${$#}. Allows to
+ compile and run the Valgrind regression tests on another system than
+ the system the 'nightly' script runs on. It is assumed that the remote
+ system shares the local filesystem tree through e.g. NFS. It is the
+ responsibility of the shell script to set the remote working directory
+ such that it matches the local current directory ($PWD).
+
+ - ABT_RUN_REGTEST: if provided, it must be the name of an argumentless
+ shell function (also specified in the $TAG.conf file) that will be used
+ to run the tests. If not specified, the usual "make regtest" will be
+ used.
+
+ - ABT_JOBS: allows parallel builds -- it's passed as the argument to
+ "make -j" when building Valgrind and the tests. The default is 1.
+ [XXX: the .NOTPARALLEL that currently resides in Makefile.all.am foils
+ this!]
+
+ Note that the appropriate syntax to use in this file will depend on the
+ shell from which the $DIR/bin/nightly script is run (which in turn may
+ depend on what shell is used by cron or any similar program).
+
+(4) Create a mailer script $DIR/conf/$TAG.sendmail. It must be executable.
+ It's used to send email results to the desired recipient (e.g.
+ valgrind-developers@lists.sourceforge.net) It must handle three command
+ line arguments.
+
+ - The first argument is the email subject line. It contains
+ $ABT_DETAILS plus some other stuff.
+
+ - The second argument is the name of the file containing the email's
+ body (which shows the tests that failed, and the differences between now
+ and 24 hours ago).
+
+ - The third is the name of the file containing all the diffs from
+ failing tests. Depending on the test results you get, you could
+ inline this file into the email body, or attach it, or compress and
+ attach it, or even omit it. The right choice depends on how many
+ failures you typically get -- if you get few failures, inlining the
+ results make them easier to read; if you get many failures,
+ compressing might be a good idea to minimise the size of the emails.
+
+ The best way to do this depends on how mail is set up on your machine.
+ You might be able to use /usr/bin/mail, or you might need something more
+ elaborate like using Mutt to send mail via an external account.
+
+(5) To run the tests, execute:
+
+ $DIR/bin/nightly $DIR $TAG
+
+ You probably want to put this command into a cron file or equivalent
+ so it is run regularly (preferably every night).
+
+
+OUTPUT FILES
+------------
+If the tests are run, the following files are produced:
+
+- $DIR/old.verbose and $DIR/new.verbose contain full output of the whole
+ process for each of the two trees.
+
+- $DIR/old.short and $DIR/new.short contain summary output of the process
+ for each of the two trees. The diff between these two files goes in
+ $DIR/diff.short.
+
+- $DIR/final contains the overall summary, constructed from $DIR/old.short,
+ $DIR/new.short, $DIR/diff.short and some other bits and pieces. (The name
+ of this file is what's passed as the second argument to
+ $DIR/conf/$TAG.sendmail.)
+
+- $DIR/diffs holds the diffs from all the failing tests in the newer tree,
+ concatenated together; the diff from each failure is truncated at 100
+ lines to minimise possible size blow-outs. (The name of this file is
+ what's passed as the third argument to $DIR/conf/$TAG.sendmail.)
+
+- $DIR/sendmail.log contains the output (stdout and stderr) from
+ $DIR/conf/$TAG.sendmail goes in $DIR/sendmail.log.
+
+- $DIR/valgrind/ contains the tested tree (and $DIR/valgrind/Inst/ contains
+ the installed code). It is used for both trees and so after the tests
+ have completed it will contain the newer tree.
+
+If the tests aren't run, the following file is produced:
+
+- $DIR/unchanged.log is created only if no tests were run because the two
+ trees were identical. It will contain a short explanatory message.
+
+Each time the tests are run, all files from previous runs are deleted.
+
+
+TROUBLESHOOTING
+---------------
+If something goes wrong, looking at the output files can be useful. For
+example, if no email was sent but you expected one, check sendmail.log to
+see if the mailer script had a problem. Or check if unchanged.log exists.
+
+Occasionally the SVN server isn't available when the tests runs, for either
+or both trees. When this happens the email will be sent but it won't be
+very informative. Usually it's just a temporary server problem and it'll
+run fine the next time without you having to do anything.
+
+Note that the test suite is imperfect:
+- There are very few machines where all tests pass; that's why the old/new
+ diff is produced. Some of the tests may not be as portable as intended.
+- Some tests are non-deterministic, and so may pass one day and fail the
+ next.
+
+Improving the test suite to avoid these problems is a long-term goal but it
+isn't easy.
+
+
+MAINTENANCE
+-----------
+The scripts in the nightly/ directory occasionally get updated. If that
+happens, you can just "svn update" within $DIR to get the updated versions,
+which will then be used the next time the tests run. (It's possible that
+the scripts will be changed in a way that requires changes to the files in
+$DIR/conf/, but we try to avoid this.)
+
+If you want such updates to happen automatically, you could write a script
+that does all the steps in SETTING UP above, and instead run that script
+from cron.
+
+