Last night, I got a Drone.io build for a Polymer.dart element working in relatively short order. Tonight, I hope to repeat that success for a JavaScript Polymer element.
To be sure, JavaScript testing is far more tedious than the equivalent Dart code. Still, there are services out there, like the excellent Travis CI, that help to ease some of the pain. What I appreciate about Travis CI is that it is one of those tools that makes it easy to work 80% of the use cases and still manages to stay out of the way when working the other 20%. Hopefully that will prove to be the case here since testing Polymer elements almost certainly falls in the latter 20%.
I am working with the a-form-input Polymer class, which enables other Polymer elements to behave like native HTML form inputs. I already have passing Karma / Jasmine tests for this project, so all I need to accomplish tonight is to get them passing on Travis CI.
I start in the Travis CI interface to enable my project from among my GitHub projects:
The Karma project includes Travis CI documentation, which indicates that Firefox testing is likely the easiest path for me. Unfortunately, I have not been testing with Firefox in this project:
$ karma start --single-run --browsers Firefox INFO [karma]: Karma v0.12.28 server started at http://localhost:9876/ WARN [launcher]: Can not load "Firefox", it is not registered! Perhaps you are missing some plugin?To address this, I need to add the Firefox launcher to my npm
package.json
's list of dependencies:{ "name": "a-form-input", "desciption": "Polymer element that mimics a native <form> input", "repository": "https://github.com/eee-c/a-form-input", "devDependencies": { "grunt": "^0.4.5", "grunt-contrib-watch": "^0.6.1", "karma": "^0.12.24", "karma-chrome-launcher": "^0.1.5", "karma-firefox-launcher": "^0.1.3", "karma-jasmine": "^0.2.2" } }After a quick install:
$ npm install karma-firefox-launcher@0.1.3 node_modules/karma-firefox-launcherI have my Karma setup working with Firefox:
$ karma start --single-run --browsers Firefox INFO [karma]: Karma v0.12.28 server started at http://localhost:9876/ INFO [launcher]: Starting browser Firefox INFO [Firefox 34.0.0 (Ubuntu)]: Connected on socket Yd6CO1SBzegq4s_R-7CC with id 53464891 ..... Firefox 34.0.0 (Ubuntu): Executed 5 of 5 SUCCESS (0.336 secs / 0.333 secs)For that to work on Travis, I need to supply that same command-line as the test script in the npm
package.json
file:{ "name": "a-form-input", // ... "scripts": { "test": "./node_modules/karma/bin/karma start --single-run --browsers Firefox" } }By default, Travis runs
npm test
, which looks for this entry.At this point, I am ready for Travis CI (I hope). I add a
.travis.yml
to the repository and push it to Github:language: node_js node_js: - 0.10 before_script: - export DISPLAY=:99.0 - sh -e /etc/init.d/xvfb startThe
before_script
section comes straight from the Karma Travis CI documentation for running Firefox, which requires an X Window system (virtual in this case).Just like that, Travis CI springs into action and... I have my first build failure:
WARN [watcher]: Pattern "/home/travis/build/eee-c/a-form-input/bower_components/webcomponentsjs/webcomponents.js" does not match any file. WARN [watcher]: Pattern "/home/travis/build/eee-c/a-form-input/bower_components/!(a-form-input)/**" does not match any file. INFO [Firefox 31.0.0 (Linux)]: Connected on socket qvBVzvavVfpYhsSXB3og with id 12698000 Firefox 31.0.0 (Linux) <a-form-input> element form input element is created in the parent light DOM FAILED ReferenceError: Polymer is not defined in /home/travis/build/eee-c/a-form-input/test/PolymerSetup.js (line 18) waitForPolymer@/home/travis/build/eee-c/a-form-input/test/PolymerSetup.js:18:1 @/home/travis/build/eee-c/a-form-input/test/PolymerSetup.js:28:3 env.executeFiltered@/home/travis/build/eee-c/a-form-input/node_modules/karma-jasmine/lib/boot.js:126:7 createStartFn/<@/home/travis/build/eee-c/a-form-input/node_modules/karma-jasmine/lib/adapter.js:171:5 [2]</Karma/this.loaded@http://localhost:9876/karma.js:185:7 @http://localhost:9876/context.html:48:5 Expected null not to be null. @/home/travis/build/eee-c/a-form-input/test/AFormInputSpec.js:20:7Yikes! That is only a portion of the failure even that portion is awfully noisy. Fortunately, I have seen enough Polymer Karma failures to know that I need to look to the top of the error messages before troubleshooting the actual tests. At the top of the build output, I see:
WARN [watcher]: Pattern "/home/travis/build/eee-c/a-form-input/bower_components/webcomponentsjs/webcomponents.js" does not match any file. WARN [watcher]: Pattern "/home/travis/build/eee-c/a-form-input/bower_components/!(a-form-input)/**" does not match any file.Wonderful. It seems that my Bower packages are not installed. So in addition to the nice and easy npm install that Travis CI boasts, I am going to have to convince it to also install the Bower npm package and to run the Bower install command.
Installing Bower is the easy part. I add it to the list of the npm
package.json
development dependencies:{ "name": "a-form-input", "devDependencies": { // ... "bower", "^1.3.12" }, "scripts": { "test": "./node_modules/karma/bin/karma start --single-run --browsers Firefox" } }To run a
bower install
, I add it to the list of before_script
actions in my .travis.yml
file:language: node_js node_js: - 0.10 before_script: - ./node_modules/bower/bin/bower install - export DISPLAY=:99.0 - sh -e /etc/init.d/xvfb startAnd, amazingly, that actually works. All my bower packages are installed. All my npm packages are installed. And the build passes:
In the end, it was not quite as easy getting JavaScript Polymer tests running on Travis CI as it was running Dart Polymer tests on Drone.io. But it was close—and certainly easy enough once I pushed through the Bower nonsense. It might be nice if Travis CI supported Bower out of the box, but let's face it, this is more a win for Dart packaging than anything else. Travis CI's minimal (non) approach to Bower is likely the only rational way to deal with two different package managers for the same language.
Well, that or just use Dart.
At any rate, I have my CI build working for a JavaScript Polymer element thanks to Travis CI.
Day #20
No comments:
Post a Comment