miggle
miggle
jenkins, drupal & testing
automating every phing!
miggle
about me
> Drupal dev for 6+ years > PHP dev for 10+ years > Husband
> Cyclist
> Frustrated rockstar…
miggle @8ballmedia
miggle
aims
> Encourage best practices > Ensure quality at scale
> Release more frequently and reliably > Develop more robust solutions
> Deploy with confidence
miggle
improving quality control
> Write better code
• Adhering to Drupal coding standards! • Evaluate code complexity
• Detect messy copy/paste code
> Validate that our code achieves objectives • Simpletests
• Behat tests
> Automate labour intensive tasks
miggle
my requirements
> Create something reusable & future proof > Create a starting point for future projects > Use open source
> Report failures
• email accountable team members!
miggle
Intercept obvious issues
miggle
…before they reach the
stakeholders!
miggle
create a development
pipeline…
STG
CI LIVE
miggle
miggle miggle
miggle
barrier to entry
miggle
buzz words & acronyms!
> Devops - a state of mind man!
• bridging the gap between sys/dev > BDD - Behaviour Driven Development > CDD - Code Driven Development
> TDD - Test Driven Development > CI - Continous Integration
> CD - Compact Disc Continuous Delivery
miggle
hi, I’m jenkins
> Continuous Integration application > Automate tasks
> Huge library of plugins
> Trigger tasks from other jobs or Github for example > Report Success/failures
> Communicate with other servers
miggle
> http://jenkins-php.org/
> http://reload.github.io/jenkins-drupal-template
miggle
creating your own ci setup
> Tools
> Requirements > Guidelines
miggle
tool box
> Ubuntu - Digital Ocean 1GB+
> Jenkins - CI server with numerous plugins > Github - good compatibility w/ Jenkins
> Composer - dependency manager
> Phing - Automation using XML files and PHP > Automated testing - Simpletest, Behat
> Drupal w/ Sqlite
miggle
evaluating code quality
> Code analysis w/ Coder > Duplicate code detection
> PHP Mess detection, copy/paste detection > JS & CSS linting
miggle
why composer
> PHP package manager > Alternative to PEAR
> Allows for dependencies per project
> Requires additional PATH config in Jenkins > Simpler transition to hosted services
miggle
composer.json
{ "repositories": [ { "type": "package", "package": { "name": "drupal/phing-drush-task", "version": "1.0", "source": { "url": "http://git.drupal.org/project/phingdrushtask.git", "type": "git", "reference": "7.x-1.0" }, "autoload": { "classmap": [ "DrushTask.php" ] }, "include-path": [ "." ] } } ], "require": { "phing/phing": "2.*", "drupal/phing-drush-task": "1.0", "drupal/drupal-extension": "1.0.*@stable", "drush/drush": "6.2.*", "squizlabs/php_codesniffer": "1.5.*", "phpmd/phpmd": "1.5.*", "sebastian/phpcpd": "*", "phploc/phploc": "*", "drupal/coder": "7.2.*" }, "config": { "bin-dir": "bin/" }, "minimum-stability": "beta" }miggle
phing
> Build automation tool > Based on Apache ANT
> Good integration w/ Jenkins > XML & PHP based
> Drush integration available
miggle
<?xml version="1.0" encoding="UTF-8"?>
<project name="phing-drupal" default="build">
<!-- ## Main targets —>
<target name="build" depends="init, clean, verify,
analyze" /> </project>
> https://www.drupal.org/project/phingdrushtask
<drush command="site-install" assume="yes""> <option name="locale">uk</option>
<option name="site-name" value="${sitename}" /> <param>expert</param>
miggle
build.default.properties
> Specify project properties
> Can be overridden in Jenkins > Multiple properties files
• useful for different envs.
miggle
# The directory containing the modules and themes for the project relative to the drupal root
directory.
project.code.dir = sites/all
# A common prefix for modules to evaluate project.code.prefix = master
# The names of other modules and themes to evaluate project.code.custom = master_dependency
<drush command="site-install" assume="yes">
<option name="db-url">${drupal.db.url}</option> <param>${drupal.profile}</param>
miggle
follow the rules
> Standardisation is key > Naming conventions
from the outset
> Standard directory structures > Prefixing miggle build.xml build.default.properties build.components/ build.components/build.drupal_site_install.xml composer.json docroot/ docroot/sites/all/modules/features/my_feature/ docroot/sites/all/modules/features/my_feature2/ docroot/sites/all/modules/custom/my_helper/
miggle
let’s get going…
miggle
https://github.com/miggle/Migl-Phing-Drupal
miggle miggle
miggle
what just happened…
> Installed and started Jenkins
> Installed required server packages > Installed composer globally
miggle miggle
miggle
…finalising
> Configured Jenkins
> Install Drupal-Jenkins template > Initial build
> Configure Apache > Final build
miggle
review the results
> Set the levels at which a build is marked: • unstable
• broken
> Email contributing developers a status update • happens by default w/ github plugin
> Advise developers of where code can be improved > Provide metrics on code
miggle
caveats
> Additional overhead writing automated tests • devs need to learn how to write tests
> Tests need to be written correctly • false positives are not useful! > Initial project setup overhead
• although could be automated > Tests take time to run…but
> …automated on push so no need to wait!
miggle
hosted alternatives to
jenkins
> Travis CI - free for open source > Circle CI, Magnum CI and more… > Benefits of hosted CI
• infrastructure managed elsewhere • 100% self contained
miggle
thanks!
> Huge thanks to these amazing people!!:
> https://github.com/nlisgo
> http://reload.github.io/jenkins-drupal-template/ > https://github.com/omissis/drupal-ignite
> https://github.com/lhridley/drupal7-jenkins-templates
miggle