Project Management and Automation
Using Maven and Grunt to accelerate development
Matthew Hanlon •SEAConference •April 7,2...
Introduction
Web and Mobile
Applications
Building tools and applications to make
scientists more productive.
7 Developers (and hiring!)
10+ projects
Liferay
JavaScript
Spring
Restlets
JSR
PHP
Java
Drupal
Portlets
SQL
JSON
XML
jQuery
MySQL Nodejs
PostgreSQL
NoSQL
CakePHP
...
Without process
Boring
What's the big deal?
Too many results in published scientific
papers are not reproducible
The data is unavailable
The environment no longer exi...
Reproducibility in Computer Science
That's only a 20%
success rate!
[ source: ]http://reproducibility.cs.arizona.edu/
Why doesn't the code build?
Missingdependencies
Mysterious configuration parameters
Compile errors
And of course,there is ...
How can we fix that?
Automate the boring stuff
Make the rest worth it
Tools for automation
and process
Apache Maven
Grunt.js
Bower
Sass/Compass
Doxygen
Maven
Managing project build, reporting, and documentation.
POM.xml
The Project Object Model
Project
information
Name,version,URL,developers,contributors,licensing,
organization
Buil...
Plugins
Basics: Compiler,Resources,JavaDocs,Eclipse,IntelliJIDEA
Advanced: Exec,Site
Community: Doxygen,Liferay,Jetty
<?xmlversion="1.0"encoding="UTF-8"?>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.github.mrhanlon</groupId>
<...
$mvninstall
[INFO]Scanningforprojects...
[INFO]
[INFO]Usingthebuilderorg.apache.maven.lifecycle.internal.builder.singlethr...
Grunt
The JavaScript Task Runner
(It's not just for JavaScript!)
Gruntfile.js
Declarative JSON/JavaScript configuration file
Executes tasks in Node.js runtime
Loads of community plugins:
...
'usestrict';
module.exports=function(grunt){
//Projectconfiguration.
grunt.initConfig({
//Metadata.
pkg:grunt.file.readJSO...
$grunt
Running"jshint:gruntfile"(jshint)task
>>1filelintfree.
Running"jshint:src"(jshint)task
>>1filelintfree.
Running"jsh...
BowerFront-end package management
package agnostic
runs over git
Declarative JSON configuration
{
"name":"vislab-reservation-portlet",
"version":"1.0.0",
"dependencies":{
"modernizr":"~2....
Sass/Compass
"Expressive" CSS
@mixinbox-sizing($bs){
$bs:unquote($bs);
@includeexperimental(box-sizing,$bs,
-moz,-webkit,not-o,not-ms,not-khtml,official...
Doxygen
Generating documentation for annotated sources
Tons of language support
Extensions for other languages
(like JavaS...
Demo
So what's next?
Get up and running in minutes
$>gitclone<repourl>my-dev-env
$>cdmy-dev-env
$>gitsubmoduleinit
$>gitsubmoduleupdate
$>mvnin...
The Second Law of Thermodynamics
The entropy of an isolated system never decreases,
because isolated systems always evolve...
Fin.
@mattorantimatt
mrhanlon@tacc.utexas.edu
TEXAS ADVANCED COMPUTING CENTER
Powering Discoveries that Change the World
Project Management and Automation: Using Maven and Grunt to accelerate development
Project Management and Automation: Using Maven and Grunt to accelerate development
Upcoming SlideShare
Loading in …5
×

Project Management and Automation: Using Maven and Grunt to accelerate development

863 views

Published on

My presentation slides from the UCAR Software Engineering Assembly Conference April 7, 2014. Original Reveal.js slides here: https://mrhanlon.com/slides/sea2014

Published in: Software
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
863
On SlideShare
0
From Embeds
0
Number of Embeds
13
Actions
Shares
0
Downloads
6
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Project Management and Automation: Using Maven and Grunt to accelerate development

  1. 1. Project Management and Automation Using Maven and Grunt to accelerate development Matthew Hanlon •SEAConference •April 7,2014 TEXAS ADVANCED COMPUTING CENTER Powering Discoveries that Change the World
  2. 2. Introduction
  3. 3. Web and Mobile Applications
  4. 4. Building tools and applications to make scientists more productive. 7 Developers (and hiring!) 10+ projects
  5. 5. Liferay JavaScript Spring Restlets JSR PHP Java Drupal Portlets SQL JSON XML jQuery MySQL Nodejs PostgreSQL NoSQL CakePHP MongoDB Python CodeIgniter CouchDB DjangoREST SOAP Web services [ made with: ]https://www.jasondavies.com/wordcloud/
  6. 6. Without process
  7. 7. Boring
  8. 8. What's the big deal?
  9. 9. Too many results in published scientific papers are not reproducible The data is unavailable The environment no longer exists The code is broken!
  10. 10. Reproducibility in Computer Science That's only a 20% success rate! [ source: ]http://reproducibility.cs.arizona.edu/
  11. 11. Why doesn't the code build? Missingdependencies Mysterious configuration parameters Compile errors And of course,there is no documentation
  12. 12. How can we fix that? Automate the boring stuff Make the rest worth it
  13. 13. Tools for automation and process Apache Maven Grunt.js Bower Sass/Compass Doxygen
  14. 14. Maven Managing project build, reporting, and documentation.
  15. 15. POM.xml The Project Object Model Project information Name,version,URL,developers,contributors,licensing, organization Build settings Build process,dependencies,non-code resource handling, reporting Environment settings Source control,repositories,distribution,issue management
  16. 16. Plugins Basics: Compiler,Resources,JavaDocs,Eclipse,IntelliJIDEA Advanced: Exec,Site Community: Doxygen,Liferay,Jetty
  17. 17. <?xmlversion="1.0"encoding="UTF-8"?> <project> <modelVersion>4.0.0</modelVersion> <groupId>com.github.mrhanlon</groupId> <artifactId>sea2014-demo</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> <type>jar</type> <scope>test</scope> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib-nodep</artifactId> <version>${cglib.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>javax.servlet</groupId>
  18. 18. $mvninstall [INFO]Scanningforprojects... [INFO] [INFO]Usingthebuilderorg.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder [INFO] [INFO]------------------------------------------------------------------------ [INFO]Buildingmodule11.0-SNAPSHOT [INFO]------------------------------------------------------------------------ [INFO] [INFO]---maven-clean-plugin:2.5:clean(default-clean)@module1--- [INFO]Deleting/Users/mrhanlon/workspace/github/mrhanlon/sea2014-demo/module1/target [INFO] [INFO]---maven-resources-plugin:2.6:resources(default-resources)@module1--- [INFO]Using'UTF-8'encodingtocopyfilteredresources. [INFO]skipnonexistingresourceDirectory/Users/mrhanlon/workspace/github/mrhanlon/sea2014-demo/module1/ [INFO] [INFO]---maven-compiler-plugin:2.0.2:compile(default-compile)@module1--- [INFO]Compiling1sourcefileto/Users/mrhanlon/workspace/github/mrhanlon/sea2014-demo/module1/target/cl [INFO] [INFO]---maven-resources-plugin:2.6:testResources(default-testResources)@module1--- [INFO]Using'UTF-8'encodingtocopyfilteredresources. [INFO]skipnonexistingresourceDirectory/Users/mrhanlon/workspace/github/mrhanlon/sea2014-demo/module1/ [INFO] [INFO]---maven-compiler-plugin:2.0.2:testCompile(default-testCompile)@module1--- [INFO]Compiling1sourcefileto/Users/mrhanlon/workspace/github/mrhanlon/sea2014-demo/module1/target/te [INFO] [INFO]---maven-surefire-plugin:2.12.4:test(default-test)@module1--- [INFO]Surefirereportdirectory:/Users/mrhanlon/workspace/github/mrhanlon/sea2014-demo/module1/target/su ------------------------------------------------------- TESTS ------------------------------------------------------- Runningcom.github.mrhanlon.AppTest Testsrun:1,Failures:0,Errors:0,Skipped:0,Timeelapsed:0.035sec Results: Testsrun:1,Failures:0,Errors:0,Skipped:0
  19. 19. Grunt The JavaScript Task Runner (It's not just for JavaScript!)
  20. 20. Gruntfile.js Declarative JSON/JavaScript configuration file Executes tasks in Node.js runtime Loads of community plugins: jslint/jshint file tasks watch compass library/framework support
  21. 21. 'usestrict'; module.exports=function(grunt){ //Projectconfiguration. grunt.initConfig({ //Metadata. pkg:grunt.file.readJSON('tiny-pubsub.jquery.json'), banner:'/*!<%=pkg.title||pkg.name%>-v<%=pkg.version%>-'+ '<%=grunt.template.today("yyyy-mm-dd")%>n'+ '<%=pkg.homepage?"*"+pkg.homepage+"n":""%>'+ '*Copyright(c)<%=grunt.template.today("yyyy")%><%=pkg.author.name%>;'+ 'Licensed<%=_.pluck(pkg.licenses,"type").join(",")%>*/n', //Taskconfiguration. clean:{ src:['dist'] }, concat:{ options:{ banner:'<%=banner%>', stripBanners:true }, dist:{ src:['src/<%=pkg.name%>.js'], dest:'dist/ba-<%=pkg.name%>.js' }, }, uglify:{ options:{ banner:'<%=banner%>' }, dist:{ src:'<%=concat.dist.dest%>', dest:'dist/ba-<%=pkg.name%>.min.js' }, }, qunit:{ files:['test/**/*.html'] }, jshint:{
  22. 22. $grunt Running"jshint:gruntfile"(jshint)task >>1filelintfree. Running"jshint:src"(jshint)task >>1filelintfree. Running"jshint:test"(jshint)task >>1filelintfree. Running"qunit:files"(qunit)task Testingtest/tiny-pubsub.html....OK >>4assertionspassed(23ms) Running"clean:files"(clean)task Cleaning"dist"...OK Running"concat:dist"(concat)task File"dist/ba-tiny-pubsub.js"created. Running"uglify:dist"(uglify)task File"dist/ba-tiny-pubsub.min.js"created. Uncompressedsize:389bytes. Compressedsize:119bytesgzipped(185bytesminified). Done,withouterrors. $_
  23. 23. BowerFront-end package management package agnostic runs over git
  24. 24. Declarative JSON configuration { "name":"vislab-reservation-portlet", "version":"1.0.0", "dependencies":{ "modernizr":"~2.6.2", "jqueryui-timepicker-addon":"1.4.3", "mustache":"~0.8.1", "datejs":"*", "fullcalendar":"~1.6.4" } }
  25. 25. Sass/Compass "Expressive" CSS
  26. 26. @mixinbox-sizing($bs){ $bs:unquote($bs); @includeexperimental(box-sizing,$bs, -moz,-webkit,not-o,not-ms,not-khtml,official ); } *{ @includebox-sizing(border-box); } .alert{ border:1pxsolidblack; } .alert-error{ @extend.alert; color:red; border-color:red; }
  27. 27. Doxygen Generating documentation for annotated sources Tons of language support Extensions for other languages (like JavaScript!)
  28. 28. Demo
  29. 29. So what's next?
  30. 30. Get up and running in minutes $>gitclone<repourl>my-dev-env $>cdmy-dev-env $>gitsubmoduleinit $>gitsubmoduleupdate $>mvninstall $>mvnliferay:deploy
  31. 31. The Second Law of Thermodynamics The entropy of an isolated system never decreases, because isolated systems always evolve toward thermodynamic equilibrium a state with maximum entropy.
  32. 32. Fin. @mattorantimatt mrhanlon@tacc.utexas.edu TEXAS ADVANCED COMPUTING CENTER Powering Discoveries that Change the World

×