This episode began with a discussion of automatically kicking off Jenkins 
builds based on upstream dependencies changing.  I solved this problem by 
having Gradle <http://gradle.org> generate the ivy.xml which is committed 
in source repository and then using the Jenkins Ivy plugin work its magic. 
 Having ivy.xml as a part of source control means more frequent trivial 
merges, but it is necessary to make Jenkins immediately recognize changed 
dependencies.  It would be interesting to here if you could do the same 
thing with the Jenkins Maven plugin by generating the POM.  Like other 
things in Jenkins, this strategy works well for building off of HEAD/tip, 
but requires extra tricks to build off of branches.

I heard some reluctance to embrace Ivy because of it allows too much 
freedom.  My organization solved this by defining a small number of 
configurations in a project wide file that was included in each individual 
project file.  When we later transitioned to Gradle, we encapsulated all 
this into project wide Gradle plugins.  These semantically versioned 
plugins went further by enforcing policies like fail on conflicts, turning 
off transitive dependency resolution, requiring the developer to explicitly 
download updated artifacts, and controlling project wide dependencies on 
major 3rd party products (e.g., JUnit, Log4J, Tomcat, etc.).  All this 
minimized and standardized both the build.gradle and generated ivy.xml.

Another alternative is to use Gradle's multi-project builds - especially 
now that it supports parallel builds.  It is unclear to me how this 
complements or competes with Jenkins.

Our architecture centered around hundreds of OSGi bundles we aggregate into 
RPMs based on the higher level "feature" being addressed and provisioned by 
Chef to VMs based on the role of the VM.  If I were to do this again, I'd 
strongly consider unit testing in an OSGi container using something like 
PaxExam <https://ops4j1.jira.com/wiki/display/PAXEXAM3/Pax+Exam> and using 
bndtools <http://bndtools.org/> to enforce conformance to semantic 
versioning during the build's commit phase.  Even then, I'm hesitant to 
recommend OSGi because it seems to grow exponentially harder the more 
bundles you deploy.

On the other hand, I'd highly recommend publishing RPMs and using 
Artifactory as a YUM repository.  One major disconnect here is that is 
difficult to relate the artifacts in Artifactory with provisioning tools 
like Chef & Puppet.  You can define version constraints on Chef cookbooks, 
RPMs, and other artifacts in your binary artifact repository.  However, in 
practice, it is difficult to define a stable thread of versions from the VM 
down to the bundles because there are 3 different module systems being used.


Thank you for the blessing your podcast has been to me.  I hope that this 
small contribution helps someone and I'd love to hear of others related 
experiences.


Mark

-- 
You received this message because you are subscribed to the Google Groups "Java 
Posse" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to javaposse+unsubscr...@googlegroups.com.
To post to this group, send email to javaposse@googlegroups.com.
Visit this group at http://groups.google.com/group/javaposse.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to