Continuous integration/Workflow 2013

Commit is pushed for review
Someone pushes a commit to Gerrit for review.


 * Jenkins-Gerrit plugin gets notified
 * "MediaWiki-lint-gerrit" job starts:
 * clone origin/master + cherry-pick the commit into a temporary directory that is removed directly after.
 * Run the lint tests ("Universal lint check), if possible only on the changed files:
 * : [//svn.wikimedia.org/viewvc/mediawiki/trunk/tools/code-utils/lint.php?view=markup&pathrev=85372 Tim's lint.php]
 * : I'm not sure if there is a good CSS linter out there, but we should have something for it. It would also have to support a way to allow used IE-hack workarounds that use invalid CSS.
 * : JSLint or JSHint (with these settings) should be good. We need to check if there are false positives we need to account for. If there aren't then it should be possible to run JSHint from the command line with NodeJS.
 * more to be added
 * Jenkins-Gerrit (as gerrit user "lintbot") reports a +1 or -1.

At this point people are free to leave comments, commit additional patches, give their opinion via +1 or -1. And eventually someone with the permission to review in this repository will either reject it (-2) or mark it OK (+2).

If it is rejected then the commit story ends until further notice. If it was marked OK, however, then the story continues:

Commit is approved

 * Jenkins-Gerrit plugin gets notified and holds the merge hostage for now. Although the reviewer authorized the merge to master, Jenkins is the one who will actually command Gerrit to perform the merge (or deny it) based on the results of the unit test.


 * "MediaWiki-unittest-gerrit" job starts:
 * reset the clone; update the clone of origin/master; cherry-pick the commit into the job's working directory
 * The child jobs will run one by one now
 * They create their build.
 * -phpunit-* child jobs:
 * Creating a database
 * Setting the appropriate LocalSettings
 * Run the installer
 * Run PHPunit
 * -testswarm child job:
 * Create a snapshot of the working directory and copy it somewhere where it is readable from the web (e.g. http://integration.mediawiki.org/mw-core-gerrit/03d67c263c27a453ef65b29e30334727333ccbcd/)
 * Run the installer (SQLite)
 * Submit an "addjob" request to TestSwarm with urls for each test suite, pointing to
 * Check which browsers are online in the swarm, and (through the BrowserShots API) terminate/start VMs to join the swarm where needed.
 * Poll the the TestSwarm API until it is completed.
 * Garbage collect the temporary snapshot
 * Whenever a child-job is ready it submits the result to the Jenkins database, reports failures to IRC, and a comment to Gerrit as "jenkinsbot" summarizing the test results and a link to the build page.
 * After all child-jobs are ready, either release the hold on the merge and complete it. Or reject it and report an 'X as "jenkinsbot"

The following structure on Jenkins is planned:
 * MediaWiki-lint-gerrit
 * MediaWiki-unittest-gerrit Includes sub-jobs for running PHPUnit on various database backends and TestSwarm.:
 * * phpunit-sqlite
 * * phpunit-postgres
 * * phpunit-databaseless
 * * testswarm
 * MediaWiki-unittest-master
 * * phpunit-sqlite
 * * testswarm
 * MediaWiki-unittest-REL1_19
 * * phpunit-sqlite
 * * testswarm
 * MediaWiki-unittest-REL1_18
 * * phpunit-sqlite
 * * testswarm
 * MediaWiki-unittest-WMF (not clear yet whether wmf-deployment will be a single branch, tagged, or ..., but whatever way to wmf-deploy with Git is choosen, should be monitored in Jenkins as well)
 * * phpunit-sqlite
 * * testswarm

References: