| Cordova Medic |
| ============= |
| |
| # Description |
| |
| This repository contains Buildbot configuration and automation tools for setting up a continuous integration system for Apache Cordova. It currently supports builds on the following platforms: |
| |
| - iOS |
| - Android (Windows and OS X) |
| - Windows Universal Apps (Windows 8.0, Windows 8.1, Windows Phone 8.1) |
| - Windows Phone 8 |
| |
| It also contains a runner script to run Appium tests designed for Cordova core plugins. To run only Appium tests, please refer to [APPIUM.md](APPIUM.md). |
| |
| # Prerequisites |
| |
| ## CouchDB |
| |
| Medic depends on CouchDB for reporting results. The following steps document how to install a CouchDB server for development. If a CouchDB server already exists for use, feel free to skip to the Setting Up section. |
| |
| ### Installation |
| |
| CouchDB can be installed from [this page][couchdb] as per the documentation provided there. Once CouchDB is installed, configure it to accept requests from external hosts by setting the following value in its `local.ini` file: |
| |
| bind_address = 0.0.0.0 |
| |
| Firewall rules for port 5984 (the default CouchDB port) may need to be added to allow access to the server. To test that it is configured correctly, open `http://[COUCHDB_HOST]:5984/_utils/` from a browser. |
| |
| ### Setup |
| |
| Create the following databases: |
| |
| - build_errors |
| - test_details |
| - mobilespec_results |
| |
| They can be created by going to the CouchDB admin page (located at `http://[COUCHDB_HOST]:5984/_utils/`) and clicking the `Create Database ...` button. |
| |
| Next, add the following document to the `mobilespec_results` database: |
| |
| { |
| "_id": "_design/results", |
| "views": { |
| "sha": { |
| "map": "function(doc){emit(doc.sha, {\"total\":doc.mobilespec.total,\"passed\":(doc.mobilespec.total - doc.mobilespec.failed),\"version\":doc.version,\"model\":doc.model,\"fails\":doc.mobilespec.failures});}" |
| } |
| } |
| } |
| |
| Lastly, make sure that devices and machines that will be using Medic have access to the Internet and to the CouchDB server that was just created. |
| |
| ## Python |
| |
| Medic contains Python code and therefore requires Python. Install Python 2.7.x from [here][python]. *Do not install Python 3.x, because Medic does not run on it.* Make sure that the Python package manager, pip, is installed with Python. To verify that Python and pip are installed, run the following: |
| |
| python --version |
| pip --version |
| |
| On Windows, the PyWin32 extensions are required, and they can be acquired [here][pywin32]. |
| |
| ## Buildbot |
| |
| Medic uses Buildbot for running builds and performing continuous integration. Buildbot has the concept of master and slave machines, and has different libraries for each. (More info about Buildbot concepts can be found [here][bbconcepts]). To install the Buildbot library for a master, run the following: |
| |
| pip install buildbot |
| |
| For a machine that will run Buildbot slaves, install the Buildbot slave library by running the following: |
| |
| pip install buildbot-slave |
| |
| ## UNIX tools |
| |
| To run builds, Medic slaves use some standard Unix tools such as `cp`, `rm`, and `git`. To run them on Windows, install Git from [here][git] and make sure to select the option to make basic Unix tools bundled with Git available within `cmd`. |
| |
| ## Cordova |
| |
| Any core depencencies of Cordova, like Node.js and NPM, are naturally dependencies of the slave machines that will run Cordova builds. Node.js and NPM can be obtained from [here][node]. |
| |
| # Installation |
| |
| Medic contains configuration for a Buildbot installation to run Apache Cordova continuous integration. Buildbot uses the master-slave paradigm to orchestrate builds, and medic contains configuration for a Buildbot master and slaves, as well as a few extra files, all inside the `buildbot-conf` directory. |
| |
| The instructions provided below describe a simple development setup, not a full-blown production deployment, which is outside the scope of this document. More official documentation on Buildbot can be found [here][buildbot], and on running Buildbot on Windows can be found [here][buildbot_windows]. |
| |
| Although a Buildbot master and slaves are separate tasks, they do not need to be run on different machines, and the following steps can either be performed on separate machines or the same one. Keep in mind however that a slave can only run builds that its machine's environment supports. |
| |
| All of the following steps assume that Buildbot's slaves and masters will be installed under `/home/buildbot`. |
| |
| ## Master |
| |
| First, create a Buildbot master. The following steps are a summary of [these official steps][buildmaster], so please feel free to follow the official ones instead. |
| |
| Create a master directory at `/home/buildbot/master` by running: |
| |
| buildbot create-master /home/buildbot/master |
| |
| Then, install the Medic master configuration by copying the following files into `/home/buildbot/master`, overwriting any files if prompted: |
| |
| - master.cfg |
| - projects.conf |
| - cordova.conf |
| - cordova-repos.json |
| - *cordova-config.json*<sup>[1]</sup> |
| - *cordova-exta.conf*<sup>[1]</sup> |
| - *private.py*<sup>[1]</sup> |
| - *github.passwd*<sup>[1]</sup> |
| |
| <sup>[1]</sup> These files do not exist in the repository and must be created for each installation of Medic. Create them from their respective `.sample` files. |
| |
| ## Slaves |
| |
| Now, create slaves. Similarly to the above instructions, the following steps are a summary of [the official ones][buildslave], so please feel free to follow the official ones. |
| |
| On OS X: |
| |
| buildslave create-slave /home/buildbot/osx http://[MASTER_HOST]:9889 cordova-ios-slave pass |
| |
| On Linux: |
| |
| buildslave create-slave /home/buildbot/linux http://[MASTER_HOST]:9889 cordova-linux-slave pass |
| |
| On Windows 8 and Windows 8.1: |
| |
| buildslave create-slave /home/buildbot/windows http://[MASTER_HOST]:9889 cordova-windows-slave pass |
| |
| No further steps are necessary to make a slave obey a Medic master. However, every slave needs to be configured appropriately for its platform. For platform-specific details on slave configuration, see [SLAVES.md](SLAVES.md). |
| |
| # Testing |
| |
| To test a Buildbot master config, run the following command in the directory that contains is `master.cfg`: |
| |
| buildbot checkconfig |
| |
| # Running |
| |
| To start the master, run: |
| |
| buildbot start /home/buildbot/master |
| |
| To start a slave (e.g. for Windows), run: |
| |
| buildslave start /home/buildbot/windows |
| |
| To view the master control panel, browse the URI: `http://[MASTER_HOST]/`. |
| |
| To stop either task, just replace `start` with `stop` in the above commands. **NOTE**: On Windows, the slave task blocks the console, and `Ctrl-C` will stop it. On all other platforms both master and slave run as daemons, and using the `stop` command will terminate them. |
| |
| To check logs for a master or a slave, look at the `twistd.log` file in its respective directory. Using the `tail` utility is very handy for this, like so: |
| |
| tail -n 100 -f /home/buildbot/osx/twistd.log |
| |
| # Changing Configuration |
| |
| Buildbot has an unusual configuration mechanism (Python code) and as such requires a restart to reload it. The Buildbot documentation also describes a `buildbot reconfig` command, but it does not work in all cases. More information is [here][reconfig]. |
| |
| In general, when any of the files in the master directory are changed, a restart/reconfig is necessary. However, slaves do not need to be reconfigured or restarted when the master's configuration changes. |
| |
| # Configuration Layout |
| |
| **master.cfg**: The main configuration file for Buildbot. This file is made to be similar to the one used on the Apache Infrastructure Buildbot because Medic runs on there. |
| |
| **projects.conf**: This file is included because it also mirrors the Apache Infrastructure setup. |
| |
| **cordova.conf**: This file contains the actual Buildbot configuration that is unique to Apache Cordova. |
| |
| **cordova-extra.conf**: An extension of `cordova.conf` that is internal to a particular installation of Medic, is not tracked in the repo, and does not make it into the Apache Infrastructure Buildbot. *Only a sample of this file is provided in the repo, with a `.sample` extension.* |
| |
| **cordova-repos.json:** List of Cordova repositories and their relevant information. |
| |
| **cordova-config.json**: Installation-specific file that defines miscellaneous parameters like CouchDB host and port, and email credentials. *Only a sample of this file is provided in the repo, with a `.sample` extension.* |
| |
| **private.py**: Python file containing sensitive configuration. *Only a sample of this file is provided in the repo, with a `.sample` extension.* |
| |
| **github.passwd**: File containing one line: a username and password for authenticating GitHub hooks. *Only a sample of this file is provided in the repo, with a `.sample` extension.* |
| |
| # Deployment |
| |
| The [Buildbot master][apache_master] is configured directly from the Apache Infrastructure [SVN repository][infra_svn]. Changes from `cordova-medic` are submitted to the Buildbot master by copying config files from `buildbot-conf` into the Buildbot master's config directory. Only Apache Committers have access to this config. Remember, **before submitting any changes, verify that the new config works** by [testing it](#testing). |
| |
| To get the config of the Buildbot master, check out the SVN repository: |
| |
| svn checkout https://svn.apache.org/repos/infra/infrastructure/buildbot/aegis/buildmaster/master1/ |
| |
| This will create a folder called `master1` that contains the master's config files. To apply changes, copy the Cordova-specific config files from `cordova-medic/buildbot-conf` into the SVN repo: |
| |
| cp cordova-medic/buildbot-conf/cordova-config.json master1/projects/cordova-config.json |
| cp cordova-medic/buildbot-conf/cordova-repos.json master1/projects/cordova-repos.json |
| cp cordova-medic/buildbot-conf/cordova.conf master1/projects/cordova.conf |
| |
| To check the changes that were made, go into `master1` and run: |
| |
| svn diff |
| |
| To undo changes, run (also in `master1`): |
| |
| svn revert -R ./* |
| |
| **WARNING**: it may be necessary to *manually undo some changes* because `cordova.conf` in `buildbot-config` and `cordova.conf` in the SVN repo have slightly different settings (indeed, this is something that can be improved by, for example, making the file in `buildbot-conf` match the one in the SVN repo; please feel free to correct this and then remove this warning.). |
| |
| Finally, commit the changes: |
| |
| svn commit -m "[message about the changes]" |
| |
| [couchdb]: http://couchdb.apache.org/ |
| [python]: https://www.python.org/downloads/ |
| [pywin32]: http://sourceforge.net/projects/pywin32/files/ |
| [buildbot]: http://docs.buildbot.net/0.8.10/manual/installation.html |
| [buildmaster]: http://docs.buildbot.net/0.8.10/manual/installation.html#creating-a-buildmaster |
| [buildslave]: http://docs.buildbot.net/0.8.10/manual/installation.html#creating-a-buildslave |
| [bbconcepts]: http://docs.buildbot.net/0.8.10/manual/concepts.html |
| [git]: http://git-scm.com/download/win |
| [node]: http://nodejs.org/download/ |
| [buildbot_windows]: http://trac.buildbot.net/wiki/RunningBuildbotOnWindows |
| [reconfig]: http://docs.buildbot.net/0.8.10/manual/cfg-intro.html#reloading-the-config-file-reconfig |
| [apache_master]: http://ci.apache.org/waterfall?category=cordova |
| [infra_svn]: https://svn.apache.org/repos/infra/infrastructure/buildbot/aegis/buildmaster/master1/ |