## Docker Drupal testbots on your local box! ### Test your Drupal patches locally with docker. This repo contains a recipe for making a [Docker](http://docker.io) containers for Drupal patch testing, using Linux, Apache, PHP and MySQL/sqlite. This is part of the core code powering the future version of [Drupal automated-testing](https://drupal.org/automated-testing) infrastructure at http://qa.drupal.org . #### Why is this awesome? a) Test patches on your local box or http://qa.drupal.org b) Test multiple patches and multiple modules at once. c) Test any Drupal version. d) Get realtime output. e) Choose mysql, sqlite (more comming soon) f) Choose PHP5.3/5.4/5.5 g) Test offline. h) It's really really easy! ## Quick Linux Instructions (for the impatient): ### (re)Build all and start containers (only once): ``` git clone {thisrepo} cd modernizing_testbot__dockerfiles sudo ./build_all.sh cleanup ``` ## Quick Vagrant MAC/Windows instructions: This will not run natively since it's a Virtualbox VM and you need to install Vagrant. ``` git clone {thisrepo} cd modernizing_testbot__dockerfiles vagrant up ``` ### Run some group tests: ``` sudo TESTGROUPS="Action,Bootstrap" DRUPALBRANCH="8.x" PATCH="/path/to/your.patch,." ./run.sh ``` See more examples bellow on: "6- RUN EXAMPLES" ## Full Instructions: ### 1- Install docker: ``` curl get.docker.io | sudo sh -x ``` ### 2- Clone this repo somewhere in your Linux box ``` git clone {thisrepo} cd modernizing_testbot__dockerfiles ``` ### 3- Build the database image ``` cd distributed/database/mysql sudo ./build.sh ``` ### 4- Start the DB container and check it's running on port 3306 ``` cd distributed/database/mysql sudo ./run-server.sh ``` ### 5- Build the WEB image ``` cd distributed/apachephp/ sudo ./build.sh 5.4 ``` ### 6- RUN EXAMPLES: **Results will be available at:** **{USERHOME}/testbotdata/BUILD_{DATE}/results** **and at the live running terminal** Run 'search_api' module tests, with one patch against D8 and git sandbox: ``` sudo TESTGROUPS="--module 'search_api'" \ DEPENDENCIES_GIT="http://git.drupal.org/sandbox/daeron/2091893.git,master" \ PATCH="https://drupal.org/files/issues/2232253-3.patch,modules/2091893" \ DRUPALBRANCH="8.x" \ ./run.sh ``` Run Action and Node tests, 2 LOCAL patches, using 4 CPUs, against D8: ``` cd distributed/apachephp/ sudo \ TESTGROUPS="Action,Node" \ CONCURRENCY="4" \ DRUPALBRANCH="8.x" \ PATCH="/tmp/1942178-config-schema-user-28.patch,.;/tmp/1942178-config-schema-30.patch,." \ ./run.sh ``` Run all tests using 4 CPUs, 1 core patch, 1 tgz module, against D8: ``` cd distributed/apachephp/ sudo \ TESTGROUPS="--all" \ CONCURRENCY="4" \ DRUPALBRANCH="8.x" \ DEPENDENCIES_TGZ="http://ftp.drupal.org/files/projects/admin_menu-8.x-3.x-dev.tar.gz" PATCH="https://drupal.org/files/issues/1942178-config-schema-user-28.patch,." \ ./run.sh ``` Run all tests using 6 CPUs, 2 patches and 2 modules on D7.26: ``` cd distributed/apachephp/ sudo \ TESTGROUPS="--all" \ CONCURRENCY="6" \ DRUPALBRANCH="7.26" \ DEPENDENCIES="flag,payment" \ PATCH="https://drupal.org/files/issues/flag_fix_global_flag_uid_2087797_3.patch,sites/all/modules/flag;https://drupal.org/files/issues/payment_2114785_8.patch,sites/all/modules/payment" \ ./run.sh ``` And that's it. ### Some default environment variables that you can override ``` DRUPALBRANCH="8.x" DRUPALVERSION="" IDENTIFIER="build_$(date +%Y_%m_%d_%H%M%S)" # Only [a-z0-9-_.] allowed REPODIR="$HOME/testbotdata" UPDATEREPO="false" # true to force repos update BUILDSDIR="$REPODIR" WORKSPACE="$BUILDSDIR/$IDENTIFIER/" DEPENDENCIES="" # module1,module2,module2... DEPENDENCIES_GIT="" # gitrepo1,branch;gitrepo2,branch;... DEPENDENCIES_TGZ="" # module1_url.tgz,module1_url.tgz,... PATCH="" # patch_url,apply_dir;patch_url,apply_dir;... DBUSER="drupaltestbot" DBPASS="drupaltestbotpw" DBTYPE="mysql" DBLINK="--link=drupaltestbot-db:db" CMD="" # Eg. enter container shell with CMD="/bin/bash" VERBOSE="false" # true will give verbose PHPVERSION="5.4" CONCURRENCY="4" # How many cpus to use per run TESTGROUPS="--class 'Drupal\block\Tests\NonDefaultBlockAdminTest'" #TESTS TO RUN eg.--all RUNSCRIPT="php ./scripts/run-tests.sh --php /usr/bin/php --url 'http://localhost' --color --concurrency ${CONCURRENCY} --xml '/var/workspace/results' ${TESTGROUPS} " ``` ### What tests can I run? ``` sudo \ DRUPALBRANCH="8.x" \ RUNSCRIPT="/usr/bin/php ./core/scripts/run-tests.sh --list" \ ./run.sh ``` If you need to remove the old web image just run this sequence: ``` sudo docker images | grep "drupal/testbot-web" | awk '{print $3}' | xargs -n1 -I {} sudo docker rm {} ``` ### 7 - Clean Up a) Results will be saved at: **{USERHOME}/testbotdata/BUILD_{DATE}/results/** so you can delete testbotdata/BUILD_{DATE} after you collect your information b) Docker generates several runs: While i am developing i use this to rm all old instances ``` sudo docker ps -a | awk '{print $1}' | xargs -n1 -I {} sudo docker rm {} ``` ## Current Structure: ``` . ├── build_all.sh ├── D7TestGroupsClasses.txt ├── D8TestGroupsClasses.txt ├── distributed │ ├── apachephp │ │ ├── build.sh │ │ ├── conf │ │ │ ├── apache2 │ │ │ │ └── vhost.conf │ │ │ ├── php5 │ │ │ │ ├── apache2.ini │ │ │ │ ├── apc.ini │ │ │ │ └── cli.ini │ │ │ ├── scripts │ │ │ │ ├── foreground.sh │ │ │ │ └── start.sh │ │ │ └── supervisor │ │ │ └── supervisord.conf │ │ ├── Dockerfile -> Dockerfile-PHP5.4 │ │ ├── Dockerfile-PHP5.3 │ │ ├── Dockerfile-PHP5.4 │ │ ├── Dockerfile-PHP5.5 │ │ └── run.sh │ └── database │ └── mysql │ ├── build.sh │ ├── conf │ │ └── startup.sh │ ├── Dockerfile │ ├── run-client.sh │ ├── run-server.sh │ └── stop-server.sh ├── patch.p1 ├── provision.sh ├── README.md ├── run.sh -> ./distributed/apachephp/run.sh ├── supervisord │ ├── build.sh │ ├── default │ ├── Dockerfile │ ├── php-cli.ini │ ├── php.ini │ ├── run.sh │ └── supervisord.conf └── Vagrantfile ``` ###CREDITS: jthorson ricardoamaro nickschuch beejeebus dasrecht ## Contributing Feel free to fork and contribute to this code. :) 1. Fork the repo 2. Create your feature branch (`git checkout -b my-new-feature`) 3. Commit your changes (`git commit -am 'Added some feature'`) 4. Push to the branch (`git push origin my-new-feature`) 5. Create new Pull Request