Put pointer to BuildingDocs page
[buildfarm-client-wiki.git] / Installation.md
index 1c910cef887c0220d84bcdf86238e5935ac07eab..a4a1863a2a54095e575554fa09078f6717c7936f 100644 (file)
@@ -3,7 +3,7 @@ So you want to give back to the Exim project but don't know how?  Being a member
 
 This Installation page works on the assumption that you have already submitted your [Exim BuildFarm Application](http://eximbuild.mrball.net/cgi-bin/register-form.pl) and the BuildFarm administration has sent you an email with your machine alias (aka _animal_) and secret password, which you will enter in step 9 below.  If you just want to run the build farm client and never submit the results, you call simply run everything with the --test option and it will still work.  If you ever run it without --test, it will still work, but the server will reject the feedback because it's from an unknown _animal_.
 
-If you want to run more than one instance of the build farm to test multiple different configurations, such as one with OpenSSL and one with GnuTLS, simply start at step 9.  More details on the extra configuration required to keep it separate from the main build are at the end of this page.
+If you want to run more than one instance of the build farm to test multiple different configurations, such as one with OpenSSL and one with GnuTLS, for each subsequent animal simply start at step 9.  More details on the extra configuration required to keep it separate from the main build are at the end of this page.
 
 ## Install Steps
 1. Make sure that all required packages for Exim to build successfully are installed. The minimal package requirements are the basic suite of compiler tools and basic libraries.  You will also need to install the ccache package.
@@ -22,25 +22,33 @@ This will create the repo checkout in the directory *~/code/*.
 9. Edit the *build-farm.conf* file and adjust to your local configuration.  The only options that absolutely require changing are the _animal_ and _secret_ configuration settings.  Your machine's sysname alias must be assigned to *animal* and the secret key assigned to *secret*.  The rest of the default build configuration should work to build a basic Exim configuration with no added features/capabilities and it will run the test suite.
 10. Whatever directory is set as the *build_root* must exist before anything will run.  If you didn't change it, this will be all that's needed:
 `mkdir $HOME/buildfarm`
-11. Directory permissions must be lax enough for the **exim** user running the test suite to be able to access the files that user farm has checked out.  Make the **farm** user's home directory be world readable and world searchable:
-`chmod o+rx $HOME`
-12. Test the configure process by running `./run_build.pl --test --verbose=2 --only-steps=configure`. If there are errors, you'll need to correct them until the process succeeds (ends with OK).  You can repeat this as many times as necessary because test mode does not store the status of the git repo or the status of each stage of the build.
-13. Test the build process by running `./run_build.pl --test --verbose=2 --only-steps=configure,make`. If there are build errors, make adjustments, install additional packages, etc, and repeat the test.
-14. Test the test suite by running `./run_build.pl --test --verbose=2 --only-steps=configure,make,test --override range_num_tests='1 2'`.  If there are build errors when building the test suite, or runtime errors trying to run the test suite, you may need to install additional packages (you shouldn't though).
-15. If you enabled the documentation building process in the *build-farm.conf*, then you can try to build it with `./run_build.pl --test --verbose=2 --only-steps=configure,make-doc`.  For documentation generation to succeed, it will require extra packages to be installed to support xml, xslt, pdf, and a few other things.
-16. If you can get past each of these steps, then your build farm system meets the minimum requirements.
-17. The official process can be kicked off by running `/home/farm/code/run_cron.sh --run-all`.  This will run the default build configuration, keep track of the git repository status, and upload the build results to the server.
-18. Once that command runs with no complaints, add it to the **farm** user crontab.  You can run it at whatever frequency you choose, I suggest 1 hour.  If a previous instantiation is still running, the script will detect the lockfile and exit so as not to step on each other.
-19. I had a problem running the *run_cron.sh* script in that cron gives a highly sanitized path to the script when it runs it.  I made a second wrapper script to call the first one so I could put path elements in that were needed:
+11. Directory permissions must be lax enough for the **exim** user running the test suite to be able to access the files that user farm has checked out.  One recommendation that we know works is to make the **farm** user's home directory be both group and world readable and group and world searchable:
+`chmod og+rx $HOME`.  Additionally, every subdirectory between */* and *$HOME/buildfarm* should have this permissive access.  One thing that these tighter permissions will break, for example, is test 0005, because the sudo'd exim process in the test suite will be unable to read that test config file.
+12. Make sure that your umask is 0022: `umask 0022`.  This also will need to be set in any script you call the run_build.pl script.
+13. Test the configure process by running `./run_build.pl --test --verbose=2 --only-steps=configure`. If there are errors, you'll need to correct them until the process succeeds (ends with OK).  You can repeat this as many times as necessary because test mode does not store the status of the git repo or the status of each stage of the build.
+14. Test the build process by running `./run_build.pl --test --verbose=2 --only-steps=configure,make`. If there are build errors, make adjustments, install additional packages, etc, and repeat the test.
+15. Test the test suite by running `./run_build.pl --test --verbose=2 --only-steps=configure,make,test --override range_num_tests='1 2'`.  If there are build errors when building the test suite, or runtime errors trying to run the test suite, you may need to install additional packages (you shouldn't though).
+16. If you enabled the documentation building process in the *build-farm.conf*, then you can try to build it with `./run_build.pl --test --verbose=2 --only-steps=configure,make-doc`.  For documentation generation to succeed, it will require extra packages to be installed to support xml, xslt, pdf, and a few other things. Please see the comments on the [Building Documentation](https://github.com/mrballcb/exim-build-farm-client/wiki/BuildingDocs) page.
+17. If you can get past each of these steps, then your build farm system meets the minimum requirements.
+18. The official process can be kicked off by running `/home/farm/code/run_cron.sh --run-all`.  This will run the default build configuration, keep track of the git repository status, and upload the build results to the server.
+19. Once that command runs with no complaints, add it to the **farm** user crontab.  You can run it at whatever frequency you choose, I suggest 1 hour.  If a previous instantiation is still running, the script will detect the lockfile and exit so as not to step on each other.
+20. I had a problem running the *run_cron.sh* script in that cron gives a highly sanitized path to the script when it runs it.  I made a second wrapper script to call the first one so I could put path elements in that were needed:
 <pre><code>$ more /home/farm/bin/build_farm.sh
 #!/bin/bash
 export PATH="/usr/local/bin:/sbin:/usr/sbin:$PATH"
 $HOME/code/run_cron.sh --run-all $@
 </code></pre>
-Then I make my cronjob call: `6 * * * * $HOME/bin/build_farm.sh`
-20. My cronjob ran great for a couple weeks.  Then another problem popped up running the cron job in that the test portion suddenly started failing with an odd error:
+Then I make my cronjob call: `6 * * * * $HOME/bin/build_farm.sh` .... but ...
+21. My cronjob ran great for a couple weeks.  Then another problem popped up running the cron job in that the test portion suddenly started failing with an odd error:
 <pre><code>** runtest error: Failed to open /dev/tty: No such device or address</code></pre>
-This is not a sudo issue, this is because the cron daemon does not give a tty to the cronjob that it starts.  To fix this, I used an old ssh trick to start my *build_farm.sh* script:
+This is not a sudo issue.  This is happening because the cron daemon does not give a tty to the cronjob that it starts.  (How the heck did it ever work?)  The runtest script needs a tty in normal operation.  To fix this, I used an old trick of ssh'ing to localhost with the *-tt* option to **force** allocation of a local tty when starting the *build_farm.sh* script.  To do this, you need to configure the **farm** user to use key-based authentication with its own key.  Assuming you have not generated an ssh key yet:
+<pre><code># Press Enter to use defaults for all questions in
+# next command, including no password
+ssh-keygen -t dsa
+cat .ssh/id_dsa.pub >> .ssh/authorized_keys
+# Do the following command once to accept the new host key
+ssh farm@localhost</code></pre>
+Once that works properly, then the cron command changes to:
 <pre><code>6 * * * * ssh -tt farm@localhost $HOME/bin/build_farm.sh</code></pre>
 
 ## Multiple build clients on one machine