SlideShare a Scribd company logo
1 of 40
Download to read offline
Implementing Quality
                         on Java projects




                           Vincent Massol
                           Committer XWiki
                             XWiki SAS

                             @vmassol
                                              27 au 29 mars 2013
Sunday, March 31, 13
Vincent Massol

            • Speaker Bio
               •       CTO XWiki SAS
            • Your Projects
               •       XWiki (community-driven open source project)
               •       Past: Maven, Apache Cargo, Apache Cactus, Pattern Testing
            • Other Credentials:
               •       LesCastCodeurs podcast
               •       Creator of OSSGTP open source group in Paris
               •       3 books: JUnit in Action, Maven: A Developer’s Notebook, BBWM

Sunday, March 31, 13
What is Quality?




Sunday, March 31, 13
The XWiki project in summary
      •      9 years old
      •      28 active
             committers
      •      7 committers
             do 80% of
             work
      •      700K NCLOC
      •      11 commits/
             day
      •      16 mails/day


Sunday, March 31, 13
Examples of Quality actions
            • Coding rules (Checkstyle, ...)    • Ensure API stability
            • Test coverage                     • Code reviews
            • Track bugs                        • License header checks
            • Don’t use Commons Lang 2.x        • Release with Java 6
            • Use SLF4J and don’t draw Log4J/   • Ensure javadoc exist
                   JCL in dependencies
                                                • Prevent JAR hell
            •      Automated build
                                                • Release often (every 2 weeks)
            •      Automated unit tests
                                                • Collaborative design
            •      Stable automated
                                                • Test on supported
                   functional tests               environments (DB & Browsers)
Sunday, March 31, 13
Quality Tip #1

                       API Stability




                                        27 au 29 mars 2013
Sunday, March 31, 13
The Problem



                       Class Not Found or Method Not
                                   Found




Sunday, March 31, 13
API Stability - Deprecations

     /**
      * ...
      * @deprecated since 2.4M1 use {@link #transform(
      *             Block, TransformationContext)}
      */
     @Deprecated
     void transform(XDOM dom, Syntax syntax)
         throws TransformationException;




Sunday, March 31, 13
API Stability - CLIRR (1/2)
     <plugin>
       <groupId>org.codehaus.mojo</groupId>
       <artifactId>clirr-maven-plugin</artifactId>
       <configuration>
         <ignored>
           <difference>
              <differenceType>7006</differenceType>
              <className>org/xwiki/.../MetaDataBlock</className>
              <method>org.xwiki....block.Block clone()</method>
              <to>org.xwiki.rendering.block.MetaDataBlock</to>
              <justification>XDOM#clone() doesn't clone the meta
                data</justification>
           </difference>
     ...

Sunday, March 31, 13
API Stability - CLIRR (2/2)




        Example from XWiki 5.0M1 Release notes

Sunday, March 31, 13
API Stability - Internal Package
                       Javadoc
                       <plugin>
                         <groupId>org.apache.maven.plugins</groupId>
                         <artifactId>maven-javadoc-plugin
                         <configuration>
                           <excludePackageNames>*.internal.*
                             </excludePackageNames>


                       CLIRR
                       <plugin>
                         <groupId>org.codehaus.mojo</groupId>
                         <artifactId>clirr-maven-plugin</artifactId>
                         <excludes>
                           <exclude>**/internal/**</exclude>
                           <exclude>**/test/**</exclude>


Sunday, March 31, 13
API Stability - Legacy Module
                            Aspect Weaving

                             <plugin>
                               <groupId>org.codehaus.mojo</groupId>
                               <artifactId>aspectj-maven-plugin</...>
                             ...
                              <configuration>
                                 <weaveDependencies>
                                   <weaveDependency>
                                     <groupId>org.xwiki.rendering</...>
                                     <artifactId>xwiki-rendering-api</...>
                             ...


                       + “Legacy” Profile

Sunday, March 31, 13
API Stability - Young APIs

     /**
       * ...
       * @since 5.0M1
       */
     @Unstable(<optional explanation>)
     public EntityReference createEntityReference(String name,...)
     {
     ...
     }

     + max duration for keeping the annotation!


Sunday, March 31, 13
API Stability - Next steps

            • Annotation or package for SPI?
            • Better define when to use the @Unstable annotation
            • Not possible to add a new method to an existing Interface
               •       Java 8 and Virtual Extension/Defender methods
                   interface TestInterface {
                     public void testMe();
                     public void newMethod() default {
                       System.out.println("Default from interface");
                     }
                   }


Sunday, March 31, 13
Quality Tip #2

                         JAR Hell




                                        27 au 29 mars 2013
Sunday, March 31, 13
The Problem



                       Class Not Found or Method Not
                        Found or not working feature




Sunday, March 31, 13
No duplicate classes @ runtime
     <plugin>
       <groupId>com.ning.maven.plugins</groupId>
       <artifactId>maven-duplicate-finder-plugin</artifactId>
       <executions>
         <execution>
           <phase>verify</phase>
           <goals>
              <goal>check</goal>
           </goals>
           <configuration>
              <failBuildInCaseOfConflict>true</...>
              <exceptions>
              ...

Sunday, March 31, 13
Surprising results...
            • Commons Beanutils bundles some classes from Commons
                   Collections, apparently to avoid drawing a dependency to it...
            •      Xalan bundles a lot of other projects (org/apache/xml/**, org/apache/
                   bcel/**, JLex/**, java_cup/**, org/apache/regexp/**). In addition, it even
                   has these jars in its source tree without any indication about their
                   versions...
            •      stax-api, geronimo-stax-api_1.0_spec and xml-apis all draw
                   javax.xml.stream.* classes
            •      xmlbeans and xml-apis draw incompatible versions of org.w3c.dom.*
                   classes
                                          14 exceptions in total!
Sunday, March 31, 13
Maven: dependency version issue
     <dependencies>
       <dependency>                                Will run logback 0.9.9
         <groupId>org.slf4j</groupId>               with slf4J-api 1.4.0
         <artifactId>slf4j-api</artifactId>          instead of 1.5.0!
         <version>1.4.0</version>
       </dependency>
       <dependency>
         <groupId>ch.qos.logback</groupId>
         <artifactId>logback-classic</artifactId>
         <version>0.9.9</version>
         <!-- Depends on org.slf4j:slf4j-api:1.5.0 -->
       </dependency>
     </dependencies>

Sunday, March 31, 13
Maven: ensure correct version
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-enforcer-plugin</artifactId>
       <executions>
         <execution>
           <id>enforce-version-compatibility</id>
           <phase>verify</phase>
           <goals>
              <goal>enforce</goal>
           </goals>
           <configuration>
              <rules>
                <requireUpperBoundDeps/>
              </rules>

Sunday, March 31, 13
Quality Tip #3

                       Test Coverage




                                        27 au 29 mars 2013
Sunday, March 31, 13
The Problem



                       More bugs reported, overall quality
                        goes down and harder to debug
                                   software




Sunday, March 31, 13
Use Jacoco to fail the build
     <plugin>
       <groupId>org.jacoco</groupId>
       <artifactId>jacoco-maven-plugin</artifactId>
       <executions>
         <execution><id>jacoco-prepare</id>
           <goals><goal>prepare-agent</goal></goals>
         </execution>
         <execution><id>jacoco-check</id>
           <goals><goal>check</goal></goals>
         </execution>
       </executions>
       <configuration>
         <check>
           <instructionRatio>${xwiki.jacoco.instructionRatio}</...>
         </check>}

Sunday, March 31, 13
Strategy

            • When devs add code (and thus tests),
                   increase the TPC percentage
            •      Put the Jacoco check in “Quality” Maven
                   Profile
            •      Have a CI job to execute that profile
                   regularly
               •       About 15% overhead compared to build
                       without checks
            • “Cheat mode”: Add easier-to-write test
Sunday, March 31, 13
Quizz Time!
    Step 1: Building on my local machine gives the following:

     [INFO] --- jacoco-maven-plugin:0.6.2.201302030002:check (jacoco-check)
     [INFO] All coverage checks have been met.


    Step 2: Building on the CI machine gave:

     [INFO] --- jacoco-maven-plugin:0.6.2.201302030002:check (jacoco-check)
     [WARNING] Insufficient code coverage for INSTRUCTION: 75.52% < 75.53%


                                Non determinism! Why?
Sunday, March 31, 13
Quizz Answer
    ... because the JVM is non deterministic!
     private Map componentEntries = new ConcurrentHashMap();
     ...
     for (Map.Entry entry : componentEntries.entrySet())
     {
       if (entry.getValue().instance == component) {
         key = entry.getKey();
         oldDescriptor = entry.getValue().descriptor;
         break;
       }
     }



Sunday, March 31, 13
Quality Tip #4

                       Functional Testing Stability
                             (with Jenkins)




                                                      27 au 29 mars 2013
Sunday, March 31, 13
The Problem



                        Too many false positives leading to
                       developers not paying attention to CI
                         emails anymore... leading to failing
                                    software




Sunday, March 31, 13
False positives examples

         • The JVM has crashed
         • VNC is down (we run Selenium tests)
         • Browser crash (we run Selenium tests)
         • Git connection issue
         • Machine slowness (if XWiki cannot start under 2 minutes then it
                means the machine has some problems)
         •      Nexus is down (we deploy our artifacts to a Nexus repository)
         •      Connection issue (Read time out)

Sunday, March 31, 13
Step 1: Groovy PostBuild Plugin (1/2)
     def messages = [
       [".*A fatal error has been detected by the Java Runtime Environment.*",
         "JVM Crash", "A JVM crash happened!"],
       [".*Error: cannot open display: :1.0.*",
         "VNC not running", "VNC connection issue!"],
       ...
     ]
     def shouldSendEmail = true
     messages.each { message ->
       if (manager.logContains(message.get(0))) {
          manager.addWarningBadge(message.get(1))
          manager.createSummary("warning.gif").appendText(...)
          manager.buildUnstable()
          shouldSendEmail = false
       }
     }

Sunday, March 31, 13
Step 1: Groovy PostBuild Plugin (2/2)


     ... continued from previous slide...

     if (!shouldSendEmail) {
       def pa = new ParametersAction([
          new BooleanParameterValue("noEmail", true)
       ])
       manager.build.addAction(pa)
     }




Sunday, March 31, 13
Step 2: Mail Ext Plugin

    Pre-send Script
     import hudson.model.*

     build.actions.each { action ->
       if (action instanceof ParametersAction) {
         if (action.getParameter("noEmail")) {
           cancel = true
         }
       }
     }




Sunday, March 31, 13
Results




             + use the Scriptler plugin to automate configuration for all jobs
Sunday, March 31, 13
Quality Tip #5

                       Bug Fixing Day




                                        27 au 29 mars 2013
Sunday, March 31, 13
The Problem

                        Bugs increasing, even simple to fix
                       ones, devs focusing too much on new
                        features (i.e. scope creep) vs fixing   Bugs created vs closed
                                     what exists




Sunday, March 31, 13
Bug Fixing Day

         • Every Thursday
         • Goal is to close the max number of bugs
         • Triaging: Can be closed with Won’t fix, Duplicate,
                Cannot Reproduce, etc
         •      Close low hanging fruits in priority
         •      Started with last 365 days then with last 547 days
                and currently with last 730 days (we need to catch
                up with 40 bugs!)


Sunday, March 31, 13
Results




Sunday, March 31, 13
Conclusion




                                    27 au 29 mars 2013
Sunday, March 31, 13
Parting words

            • Slowly add new quality check over time
            • Everyone must be on board
            • Favor Active Quality (i.e. make the build fail) over Passive checks
            • Be ready to adapt/remove checks if found not useful enough
            • Quality brings some risks:
               •       Potentially less committers for your project (especially open source)
               •       Project seen as “less fun”




Sunday, March 31, 13
Be proud of your Quality!

                          “I have offended God and
                       mankind because my work didn't
                       reach the quality it should have.”

                                       Leonardo da Vinci, on his death bed




Sunday, March 31, 13

More Related Content

What's hot

Java EE 6 & GlassFish V3 - Alexis Moussine-Pouchkine - May 2010
Java EE 6 & GlassFish V3 - Alexis Moussine-Pouchkine - May 2010Java EE 6 & GlassFish V3 - Alexis Moussine-Pouchkine - May 2010
Java EE 6 & GlassFish V3 - Alexis Moussine-Pouchkine - May 2010JUG Lausanne
 
Testcontainers - Geekout EE 2017 presentation
Testcontainers - Geekout EE 2017 presentationTestcontainers - Geekout EE 2017 presentation
Testcontainers - Geekout EE 2017 presentationRichard North
 
The world of gradle - an introduction for developers
The world of gradle  - an introduction for developersThe world of gradle  - an introduction for developers
The world of gradle - an introduction for developersTricode (part of Dept)
 
An Introduction to Gradle for Java Developers
An Introduction to Gradle for Java DevelopersAn Introduction to Gradle for Java Developers
An Introduction to Gradle for Java DevelopersKostas Saidis
 
Deploying JHipster Microservices
Deploying JHipster MicroservicesDeploying JHipster Microservices
Deploying JHipster MicroservicesJoe Kutner
 
Gradle talk, Javarsovia 2010
Gradle talk, Javarsovia 2010Gradle talk, Javarsovia 2010
Gradle talk, Javarsovia 2010Tomek Kaczanowski
 
OpenJDK-Zulu talk at JEEConf'14
OpenJDK-Zulu talk at JEEConf'14OpenJDK-Zulu talk at JEEConf'14
OpenJDK-Zulu talk at JEEConf'14Ivan Krylov
 
Getting started with sbt
Getting started with sbtGetting started with sbt
Getting started with sbtikenna4u
 
Gradle build tool that rocks with DSL JavaOne India 4th May 2012
Gradle build tool that rocks with DSL JavaOne India 4th May 2012Gradle build tool that rocks with DSL JavaOne India 4th May 2012
Gradle build tool that rocks with DSL JavaOne India 4th May 2012Rajmahendra Hegde
 
Efficient JavaScript Unit Testing, May 2012
Efficient JavaScript Unit Testing, May 2012Efficient JavaScript Unit Testing, May 2012
Efficient JavaScript Unit Testing, May 2012Hazem Saleh
 
Managing dependencies with gradle
Managing dependencies with gradleManaging dependencies with gradle
Managing dependencies with gradleLiviu Tudor
 
Jenkinsプラグインの作り方
Jenkinsプラグインの作り方Jenkinsプラグインの作り方
Jenkinsプラグインの作り方Kiyotaka Oku
 
Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!Roberto Franchini
 
First adoption hackathon at BGJUG
First adoption hackathon at BGJUGFirst adoption hackathon at BGJUG
First adoption hackathon at BGJUGIvan Ivanov
 
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...ZeroTurnaround
 
Java build tool_comparison
Java build tool_comparisonJava build tool_comparison
Java build tool_comparisonManav Prasad
 
Take Control of your Integration Testing with TestContainers
Take Control of your Integration Testing with TestContainersTake Control of your Integration Testing with TestContainers
Take Control of your Integration Testing with TestContainersNaresha K
 

What's hot (20)

Java EE 6 & GlassFish V3 - Alexis Moussine-Pouchkine - May 2010
Java EE 6 & GlassFish V3 - Alexis Moussine-Pouchkine - May 2010Java EE 6 & GlassFish V3 - Alexis Moussine-Pouchkine - May 2010
Java EE 6 & GlassFish V3 - Alexis Moussine-Pouchkine - May 2010
 
Testcontainers - Geekout EE 2017 presentation
Testcontainers - Geekout EE 2017 presentationTestcontainers - Geekout EE 2017 presentation
Testcontainers - Geekout EE 2017 presentation
 
The world of gradle - an introduction for developers
The world of gradle  - an introduction for developersThe world of gradle  - an introduction for developers
The world of gradle - an introduction for developers
 
Ant, Maven and Jenkins
Ant, Maven and JenkinsAnt, Maven and Jenkins
Ant, Maven and Jenkins
 
An Introduction to Gradle for Java Developers
An Introduction to Gradle for Java DevelopersAn Introduction to Gradle for Java Developers
An Introduction to Gradle for Java Developers
 
Deploying JHipster Microservices
Deploying JHipster MicroservicesDeploying JHipster Microservices
Deploying JHipster Microservices
 
Gradle talk, Javarsovia 2010
Gradle talk, Javarsovia 2010Gradle talk, Javarsovia 2010
Gradle talk, Javarsovia 2010
 
OpenJDK-Zulu talk at JEEConf'14
OpenJDK-Zulu talk at JEEConf'14OpenJDK-Zulu talk at JEEConf'14
OpenJDK-Zulu talk at JEEConf'14
 
Hands on the Gradle
Hands on the GradleHands on the Gradle
Hands on the Gradle
 
Getting started with sbt
Getting started with sbtGetting started with sbt
Getting started with sbt
 
Gradle build tool that rocks with DSL JavaOne India 4th May 2012
Gradle build tool that rocks with DSL JavaOne India 4th May 2012Gradle build tool that rocks with DSL JavaOne India 4th May 2012
Gradle build tool that rocks with DSL JavaOne India 4th May 2012
 
Efficient JavaScript Unit Testing, May 2012
Efficient JavaScript Unit Testing, May 2012Efficient JavaScript Unit Testing, May 2012
Efficient JavaScript Unit Testing, May 2012
 
Managing dependencies with gradle
Managing dependencies with gradleManaging dependencies with gradle
Managing dependencies with gradle
 
Jenkinsプラグインの作り方
Jenkinsプラグインの作り方Jenkinsプラグインの作り方
Jenkinsプラグインの作り方
 
Gradle como alternativa a maven
Gradle como alternativa a mavenGradle como alternativa a maven
Gradle como alternativa a maven
 
Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!
 
First adoption hackathon at BGJUG
First adoption hackathon at BGJUGFirst adoption hackathon at BGJUG
First adoption hackathon at BGJUG
 
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...
 
Java build tool_comparison
Java build tool_comparisonJava build tool_comparison
Java build tool_comparison
 
Take Control of your Integration Testing with TestContainers
Take Control of your Integration Testing with TestContainersTake Control of your Integration Testing with TestContainers
Take Control of your Integration Testing with TestContainers
 

Viewers also liked

Grenville Castings New Brochure
Grenville Castings New BrochureGrenville Castings New Brochure
Grenville Castings New BrochureJoe Clements
 
Empathize and define
Empathize and defineEmpathize and define
Empathize and defineLola Garín
 
Group 51 presentation
Group 51 presentationGroup 51 presentation
Group 51 presentationreigatemedia
 
nhận làm video quảng cáo 3d
nhận làm video quảng cáo 3dnhận làm video quảng cáo 3d
nhận làm video quảng cáo 3dtheo757
 
Epic research malaysia daily klse report for 21st march 2016
Epic research malaysia   daily klse report for 21st march 2016Epic research malaysia   daily klse report for 21st march 2016
Epic research malaysia daily klse report for 21st march 2016Epic Research Pte. Ltd.
 
Cognitive neuro fuzzy expert system for hypotension control
Cognitive neuro fuzzy expert system for hypotension controlCognitive neuro fuzzy expert system for hypotension control
Cognitive neuro fuzzy expert system for hypotension controlAlexander Decker
 
financial statement 2004
financial statement  2004financial statement  2004
financial statement 2004traoman
 
book review by Vladimir Pyavka
book review by Vladimir Pyavkabook review by Vladimir Pyavka
book review by Vladimir PyavkaJulia Birhova
 
GGilbert_Three_Images_of_Konstantin_Pats
GGilbert_Three_Images_of_Konstantin_PatsGGilbert_Three_Images_of_Konstantin_Pats
GGilbert_Three_Images_of_Konstantin_PatsGeorgia Gilbert
 
IMARK NOW Summer LEDs and the Future
IMARK NOW Summer LEDs and the FutureIMARK NOW Summer LEDs and the Future
IMARK NOW Summer LEDs and the Futuretkonnerth
 
Customer Success Story: Slimband
Customer Success Story: SlimbandCustomer Success Story: Slimband
Customer Success Story: SlimbandMarketo
 
832 русский язык. 11кл. мурина л.а. и др.-минск, 2010 -280с
832  русский язык. 11кл. мурина л.а. и др.-минск, 2010 -280с832  русский язык. 11кл. мурина л.а. и др.-минск, 2010 -280с
832 русский язык. 11кл. мурина л.а. и др.-минск, 2010 -280сpsvayy
 

Viewers also liked (17)

Adding Integers
Adding IntegersAdding Integers
Adding Integers
 
Grenville Castings New Brochure
Grenville Castings New BrochureGrenville Castings New Brochure
Grenville Castings New Brochure
 
368b.6819.file
368b.6819.file368b.6819.file
368b.6819.file
 
Empathize and define
Empathize and defineEmpathize and define
Empathize and define
 
Evaluation Question 5
Evaluation Question 5Evaluation Question 5
Evaluation Question 5
 
Group 51 presentation
Group 51 presentationGroup 51 presentation
Group 51 presentation
 
nhận làm video quảng cáo 3d
nhận làm video quảng cáo 3dnhận làm video quảng cáo 3d
nhận làm video quảng cáo 3d
 
Epic research malaysia daily klse report for 21st march 2016
Epic research malaysia   daily klse report for 21st march 2016Epic research malaysia   daily klse report for 21st march 2016
Epic research malaysia daily klse report for 21st march 2016
 
Cognitive neuro fuzzy expert system for hypotension control
Cognitive neuro fuzzy expert system for hypotension controlCognitive neuro fuzzy expert system for hypotension control
Cognitive neuro fuzzy expert system for hypotension control
 
financial statement 2004
financial statement  2004financial statement  2004
financial statement 2004
 
book review by Vladimir Pyavka
book review by Vladimir Pyavkabook review by Vladimir Pyavka
book review by Vladimir Pyavka
 
GGilbert_Three_Images_of_Konstantin_Pats
GGilbert_Three_Images_of_Konstantin_PatsGGilbert_Three_Images_of_Konstantin_Pats
GGilbert_Three_Images_of_Konstantin_Pats
 
Escuela inteligente
Escuela inteligenteEscuela inteligente
Escuela inteligente
 
IMARK NOW Summer LEDs and the Future
IMARK NOW Summer LEDs and the FutureIMARK NOW Summer LEDs and the Future
IMARK NOW Summer LEDs and the Future
 
Costume ideas
Costume ideas Costume ideas
Costume ideas
 
Customer Success Story: Slimband
Customer Success Story: SlimbandCustomer Success Story: Slimband
Customer Success Story: Slimband
 
832 русский язык. 11кл. мурина л.а. и др.-минск, 2010 -280с
832  русский язык. 11кл. мурина л.а. и др.-минск, 2010 -280с832  русский язык. 11кл. мурина л.а. и др.-минск, 2010 -280с
832 русский язык. 11кл. мурина л.а. и др.-минск, 2010 -280с
 

Similar to Implementing Quality on Java projects

Implementing Quality on a Java Project
Implementing Quality on a Java ProjectImplementing Quality on a Java Project
Implementing Quality on a Java ProjectVincent Massol
 
The Diabolical Developer's Guide to Surviving Java 9
The Diabolical Developer's Guide to Surviving Java 9The Diabolical Developer's Guide to Surviving Java 9
The Diabolical Developer's Guide to Surviving Java 9jClarity
 
Iasi code camp 20 april 2013 implement-quality-java-massol-codecamp
Iasi code camp 20 april 2013 implement-quality-java-massol-codecampIasi code camp 20 april 2013 implement-quality-java-massol-codecamp
Iasi code camp 20 april 2013 implement-quality-java-massol-codecampCodecamp Romania
 
Automation Frame works Instruction Sheet
Automation Frame works Instruction SheetAutomation Frame works Instruction Sheet
Automation Frame works Instruction SheetvodQA
 
Make use of Sonar for your mobile developments - It's easy and useful!
Make use of Sonar for your mobile developments - It's easy and useful!Make use of Sonar for your mobile developments - It's easy and useful!
Make use of Sonar for your mobile developments - It's easy and useful!cyrilpicat
 
Soft shake 2013 - make use of sonar on your mobile developments
Soft shake 2013 - make use of sonar on your mobile developmentsSoft shake 2013 - make use of sonar on your mobile developments
Soft shake 2013 - make use of sonar on your mobile developmentsrfelden
 
Hands On with Maven
Hands On with MavenHands On with Maven
Hands On with MavenSid Anand
 
Apache Maven supports all Java (JokerConf 2018)
Apache Maven supports all Java (JokerConf 2018)Apache Maven supports all Java (JokerConf 2018)
Apache Maven supports all Java (JokerConf 2018)Robert Scholte
 
Tuscany : Applying OSGi After The Fact
Tuscany : Applying  OSGi After The FactTuscany : Applying  OSGi After The Fact
Tuscany : Applying OSGi After The FactLuciano Resende
 
An introduction to maven gradle and sbt
An introduction to maven gradle and sbtAn introduction to maven gradle and sbt
An introduction to maven gradle and sbtFabio Fumarola
 
Spring Web Service, Spring JMS, Eclipse & Maven tutorials
Spring Web Service, Spring JMS, Eclipse & Maven tutorialsSpring Web Service, Spring JMS, Eclipse & Maven tutorials
Spring Web Service, Spring JMS, Eclipse & Maven tutorialsRaghavan Mohan
 
Implementing Quality on Java projects (Short version)
Implementing Quality on Java projects (Short version)Implementing Quality on Java projects (Short version)
Implementing Quality on Java projects (Short version)Vincent Massol
 
Riga Dev Day - Automated Android Continuous Integration
Riga Dev Day - Automated Android Continuous IntegrationRiga Dev Day - Automated Android Continuous Integration
Riga Dev Day - Automated Android Continuous IntegrationNicolas Fränkel
 
How to create a skeleton of a Java console application
How to create a skeleton of a Java console applicationHow to create a skeleton of a Java console application
How to create a skeleton of a Java console applicationDmitri Pisarenko
 
Maven and j unit introduction
Maven and j unit introductionMaven and j unit introduction
Maven and j unit introductionSergii Fesenko
 

Similar to Implementing Quality on Java projects (20)

Implementing Quality on a Java Project
Implementing Quality on a Java ProjectImplementing Quality on a Java Project
Implementing Quality on a Java Project
 
The Diabolical Developer's Guide to Surviving Java 9
The Diabolical Developer's Guide to Surviving Java 9The Diabolical Developer's Guide to Surviving Java 9
The Diabolical Developer's Guide to Surviving Java 9
 
Maven advanced
Maven advancedMaven advanced
Maven advanced
 
Iasi code camp 20 april 2013 implement-quality-java-massol-codecamp
Iasi code camp 20 april 2013 implement-quality-java-massol-codecampIasi code camp 20 april 2013 implement-quality-java-massol-codecamp
Iasi code camp 20 april 2013 implement-quality-java-massol-codecamp
 
Arquillian in a nutshell
Arquillian in a nutshellArquillian in a nutshell
Arquillian in a nutshell
 
Automation Frame works Instruction Sheet
Automation Frame works Instruction SheetAutomation Frame works Instruction Sheet
Automation Frame works Instruction Sheet
 
Make use of Sonar for your mobile developments - It's easy and useful!
Make use of Sonar for your mobile developments - It's easy and useful!Make use of Sonar for your mobile developments - It's easy and useful!
Make use of Sonar for your mobile developments - It's easy and useful!
 
Soft shake 2013 - make use of sonar on your mobile developments
Soft shake 2013 - make use of sonar on your mobile developmentsSoft shake 2013 - make use of sonar on your mobile developments
Soft shake 2013 - make use of sonar on your mobile developments
 
Apache Maven basics
Apache Maven basicsApache Maven basics
Apache Maven basics
 
Hands On with Maven
Hands On with MavenHands On with Maven
Hands On with Maven
 
Apache Maven
Apache MavenApache Maven
Apache Maven
 
Apache Maven supports all Java (JokerConf 2018)
Apache Maven supports all Java (JokerConf 2018)Apache Maven supports all Java (JokerConf 2018)
Apache Maven supports all Java (JokerConf 2018)
 
Tuscany : Applying OSGi After The Fact
Tuscany : Applying  OSGi After The FactTuscany : Applying  OSGi After The Fact
Tuscany : Applying OSGi After The Fact
 
An introduction to maven gradle and sbt
An introduction to maven gradle and sbtAn introduction to maven gradle and sbt
An introduction to maven gradle and sbt
 
Spring Web Service, Spring JMS, Eclipse & Maven tutorials
Spring Web Service, Spring JMS, Eclipse & Maven tutorialsSpring Web Service, Spring JMS, Eclipse & Maven tutorials
Spring Web Service, Spring JMS, Eclipse & Maven tutorials
 
Implementing Quality on Java projects (Short version)
Implementing Quality on Java projects (Short version)Implementing Quality on Java projects (Short version)
Implementing Quality on Java projects (Short version)
 
Riga Dev Day - Automated Android Continuous Integration
Riga Dev Day - Automated Android Continuous IntegrationRiga Dev Day - Automated Android Continuous Integration
Riga Dev Day - Automated Android Continuous Integration
 
How to create a skeleton of a Java console application
How to create a skeleton of a Java console applicationHow to create a skeleton of a Java console application
How to create a skeleton of a Java console application
 
Maven and j unit introduction
Maven and j unit introductionMaven and j unit introduction
Maven and j unit introduction
 
Maven2交流
Maven2交流Maven2交流
Maven2交流
 

More from Vincent Massol

XWiki Testing with TestContainers
XWiki Testing with TestContainersXWiki Testing with TestContainers
XWiki Testing with TestContainersVincent Massol
 
XWiki: The best wiki for developers
XWiki: The best wiki for developersXWiki: The best wiki for developers
XWiki: The best wiki for developersVincent Massol
 
Advanced Java Testing @ POSS 2019
Advanced Java Testing @ POSS 2019Advanced Java Testing @ POSS 2019
Advanced Java Testing @ POSS 2019Vincent Massol
 
New types of tests for Java projects
New types of tests for Java projectsNew types of tests for Java projects
New types of tests for Java projectsVincent Massol
 
Configuration Testing with Docker & TestContainers
Configuration Testing with Docker & TestContainersConfiguration Testing with Docker & TestContainers
Configuration Testing with Docker & TestContainersVincent Massol
 
New types of tests for Java projects
New types of tests for Java projectsNew types of tests for Java projects
New types of tests for Java projectsVincent Massol
 
What's new in XWiki 9.x and 10.x
What's new in XWiki 9.x and 10.xWhat's new in XWiki 9.x and 10.x
What's new in XWiki 9.x and 10.xVincent Massol
 
Creating your own project's Quality Dashboard
Creating your own project's Quality DashboardCreating your own project's Quality Dashboard
Creating your own project's Quality DashboardVincent Massol
 
XWiki: wiki collaboration as an alternative to Confluence and Sharepoint
XWiki: wiki collaboration as an alternative to Confluence and SharepointXWiki: wiki collaboration as an alternative to Confluence and Sharepoint
XWiki: wiki collaboration as an alternative to Confluence and SharepointVincent Massol
 
Creating your own project's Quality Dashboard
Creating your own project's Quality DashboardCreating your own project's Quality Dashboard
Creating your own project's Quality DashboardVincent Massol
 
XWiki: The web's Swiss Army Knife
XWiki: The web's Swiss Army KnifeXWiki: The web's Swiss Army Knife
XWiki: The web's Swiss Army KnifeVincent Massol
 
Leading a Community-Driven Open Source Project
Leading a Community-Driven Open Source ProjectLeading a Community-Driven Open Source Project
Leading a Community-Driven Open Source ProjectVincent Massol
 
XWiki Status - July 2015
XWiki Status - July 2015XWiki Status - July 2015
XWiki Status - July 2015Vincent Massol
 
XWiki SAS development practices
XWiki SAS development practicesXWiki SAS development practices
XWiki SAS development practicesVincent Massol
 
XWiki SAS: An open source company
XWiki SAS: An open source companyXWiki SAS: An open source company
XWiki SAS: An open source companyVincent Massol
 
XWiki: A web dev runtime for writing web apps @ FOSDEM 2014
XWiki: A web dev runtime for writing web apps @ FOSDEM 2014XWiki: A web dev runtime for writing web apps @ FOSDEM 2014
XWiki: A web dev runtime for writing web apps @ FOSDEM 2014Vincent Massol
 

More from Vincent Massol (20)

XWiki Testing with TestContainers
XWiki Testing with TestContainersXWiki Testing with TestContainers
XWiki Testing with TestContainers
 
XWiki: The best wiki for developers
XWiki: The best wiki for developersXWiki: The best wiki for developers
XWiki: The best wiki for developers
 
Advanced Java Testing @ POSS 2019
Advanced Java Testing @ POSS 2019Advanced Java Testing @ POSS 2019
Advanced Java Testing @ POSS 2019
 
New types of tests for Java projects
New types of tests for Java projectsNew types of tests for Java projects
New types of tests for Java projects
 
Configuration Testing with Docker & TestContainers
Configuration Testing with Docker & TestContainersConfiguration Testing with Docker & TestContainers
Configuration Testing with Docker & TestContainers
 
Building XWiki
Building XWikiBuilding XWiki
Building XWiki
 
New types of tests for Java projects
New types of tests for Java projectsNew types of tests for Java projects
New types of tests for Java projects
 
What's new in XWiki 9.x and 10.x
What's new in XWiki 9.x and 10.xWhat's new in XWiki 9.x and 10.x
What's new in XWiki 9.x and 10.x
 
QDashboard 1.2
QDashboard 1.2QDashboard 1.2
QDashboard 1.2
 
Advanced Java Testing
Advanced Java TestingAdvanced Java Testing
Advanced Java Testing
 
Creating your own project's Quality Dashboard
Creating your own project's Quality DashboardCreating your own project's Quality Dashboard
Creating your own project's Quality Dashboard
 
XWiki: wiki collaboration as an alternative to Confluence and Sharepoint
XWiki: wiki collaboration as an alternative to Confluence and SharepointXWiki: wiki collaboration as an alternative to Confluence and Sharepoint
XWiki: wiki collaboration as an alternative to Confluence and Sharepoint
 
Creating your own project's Quality Dashboard
Creating your own project's Quality DashboardCreating your own project's Quality Dashboard
Creating your own project's Quality Dashboard
 
XWiki: The web's Swiss Army Knife
XWiki: The web's Swiss Army KnifeXWiki: The web's Swiss Army Knife
XWiki: The web's Swiss Army Knife
 
Leading a Community-Driven Open Source Project
Leading a Community-Driven Open Source ProjectLeading a Community-Driven Open Source Project
Leading a Community-Driven Open Source Project
 
Developing XWiki
Developing XWikiDeveloping XWiki
Developing XWiki
 
XWiki Status - July 2015
XWiki Status - July 2015XWiki Status - July 2015
XWiki Status - July 2015
 
XWiki SAS development practices
XWiki SAS development practicesXWiki SAS development practices
XWiki SAS development practices
 
XWiki SAS: An open source company
XWiki SAS: An open source companyXWiki SAS: An open source company
XWiki SAS: An open source company
 
XWiki: A web dev runtime for writing web apps @ FOSDEM 2014
XWiki: A web dev runtime for writing web apps @ FOSDEM 2014XWiki: A web dev runtime for writing web apps @ FOSDEM 2014
XWiki: A web dev runtime for writing web apps @ FOSDEM 2014
 

Recently uploaded

TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESmohitsingh558521
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfMounikaPolabathina
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rick Flair
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????blackmambaettijean
 

Recently uploaded (20)

TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdf
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????
 

Implementing Quality on Java projects

  • 1. Implementing Quality on Java projects Vincent Massol Committer XWiki XWiki SAS @vmassol 27 au 29 mars 2013 Sunday, March 31, 13
  • 2. Vincent Massol • Speaker Bio • CTO XWiki SAS • Your Projects • XWiki (community-driven open source project) • Past: Maven, Apache Cargo, Apache Cactus, Pattern Testing • Other Credentials: • LesCastCodeurs podcast • Creator of OSSGTP open source group in Paris • 3 books: JUnit in Action, Maven: A Developer’s Notebook, BBWM Sunday, March 31, 13
  • 4. The XWiki project in summary • 9 years old • 28 active committers • 7 committers do 80% of work • 700K NCLOC • 11 commits/ day • 16 mails/day Sunday, March 31, 13
  • 5. Examples of Quality actions • Coding rules (Checkstyle, ...) • Ensure API stability • Test coverage • Code reviews • Track bugs • License header checks • Don’t use Commons Lang 2.x • Release with Java 6 • Use SLF4J and don’t draw Log4J/ • Ensure javadoc exist JCL in dependencies • Prevent JAR hell • Automated build • Release often (every 2 weeks) • Automated unit tests • Collaborative design • Stable automated • Test on supported functional tests environments (DB & Browsers) Sunday, March 31, 13
  • 6. Quality Tip #1 API Stability 27 au 29 mars 2013 Sunday, March 31, 13
  • 7. The Problem Class Not Found or Method Not Found Sunday, March 31, 13
  • 8. API Stability - Deprecations /** * ... * @deprecated since 2.4M1 use {@link #transform( * Block, TransformationContext)} */ @Deprecated void transform(XDOM dom, Syntax syntax) throws TransformationException; Sunday, March 31, 13
  • 9. API Stability - CLIRR (1/2) <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>clirr-maven-plugin</artifactId> <configuration> <ignored> <difference> <differenceType>7006</differenceType> <className>org/xwiki/.../MetaDataBlock</className> <method>org.xwiki....block.Block clone()</method> <to>org.xwiki.rendering.block.MetaDataBlock</to> <justification>XDOM#clone() doesn't clone the meta data</justification> </difference> ... Sunday, March 31, 13
  • 10. API Stability - CLIRR (2/2) Example from XWiki 5.0M1 Release notes Sunday, March 31, 13
  • 11. API Stability - Internal Package Javadoc <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin <configuration> <excludePackageNames>*.internal.* </excludePackageNames> CLIRR <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>clirr-maven-plugin</artifactId> <excludes> <exclude>**/internal/**</exclude> <exclude>**/test/**</exclude> Sunday, March 31, 13
  • 12. API Stability - Legacy Module Aspect Weaving <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>aspectj-maven-plugin</...> ... <configuration> <weaveDependencies> <weaveDependency> <groupId>org.xwiki.rendering</...> <artifactId>xwiki-rendering-api</...> ... + “Legacy” Profile Sunday, March 31, 13
  • 13. API Stability - Young APIs /** * ... * @since 5.0M1 */ @Unstable(<optional explanation>) public EntityReference createEntityReference(String name,...) { ... } + max duration for keeping the annotation! Sunday, March 31, 13
  • 14. API Stability - Next steps • Annotation or package for SPI? • Better define when to use the @Unstable annotation • Not possible to add a new method to an existing Interface • Java 8 and Virtual Extension/Defender methods interface TestInterface {   public void testMe();   public void newMethod() default {     System.out.println("Default from interface");   } } Sunday, March 31, 13
  • 15. Quality Tip #2 JAR Hell 27 au 29 mars 2013 Sunday, March 31, 13
  • 16. The Problem Class Not Found or Method Not Found or not working feature Sunday, March 31, 13
  • 17. No duplicate classes @ runtime <plugin> <groupId>com.ning.maven.plugins</groupId> <artifactId>maven-duplicate-finder-plugin</artifactId> <executions> <execution> <phase>verify</phase> <goals> <goal>check</goal> </goals> <configuration> <failBuildInCaseOfConflict>true</...> <exceptions> ... Sunday, March 31, 13
  • 18. Surprising results... • Commons Beanutils bundles some classes from Commons Collections, apparently to avoid drawing a dependency to it... • Xalan bundles a lot of other projects (org/apache/xml/**, org/apache/ bcel/**, JLex/**, java_cup/**, org/apache/regexp/**). In addition, it even has these jars in its source tree without any indication about their versions... • stax-api, geronimo-stax-api_1.0_spec and xml-apis all draw javax.xml.stream.* classes • xmlbeans and xml-apis draw incompatible versions of org.w3c.dom.* classes 14 exceptions in total! Sunday, March 31, 13
  • 19. Maven: dependency version issue <dependencies> <dependency> Will run logback 0.9.9 <groupId>org.slf4j</groupId> with slf4J-api 1.4.0 <artifactId>slf4j-api</artifactId> instead of 1.5.0! <version>1.4.0</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>0.9.9</version> <!-- Depends on org.slf4j:slf4j-api:1.5.0 --> </dependency> </dependencies> Sunday, March 31, 13
  • 20. Maven: ensure correct version <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-enforcer-plugin</artifactId> <executions> <execution> <id>enforce-version-compatibility</id> <phase>verify</phase> <goals> <goal>enforce</goal> </goals> <configuration> <rules> <requireUpperBoundDeps/> </rules> Sunday, March 31, 13
  • 21. Quality Tip #3 Test Coverage 27 au 29 mars 2013 Sunday, March 31, 13
  • 22. The Problem More bugs reported, overall quality goes down and harder to debug software Sunday, March 31, 13
  • 23. Use Jacoco to fail the build <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <executions> <execution><id>jacoco-prepare</id> <goals><goal>prepare-agent</goal></goals> </execution> <execution><id>jacoco-check</id> <goals><goal>check</goal></goals> </execution> </executions> <configuration> <check> <instructionRatio>${xwiki.jacoco.instructionRatio}</...> </check>} Sunday, March 31, 13
  • 24. Strategy • When devs add code (and thus tests), increase the TPC percentage • Put the Jacoco check in “Quality” Maven Profile • Have a CI job to execute that profile regularly • About 15% overhead compared to build without checks • “Cheat mode”: Add easier-to-write test Sunday, March 31, 13
  • 25. Quizz Time! Step 1: Building on my local machine gives the following: [INFO] --- jacoco-maven-plugin:0.6.2.201302030002:check (jacoco-check) [INFO] All coverage checks have been met. Step 2: Building on the CI machine gave: [INFO] --- jacoco-maven-plugin:0.6.2.201302030002:check (jacoco-check) [WARNING] Insufficient code coverage for INSTRUCTION: 75.52% < 75.53% Non determinism! Why? Sunday, March 31, 13
  • 26. Quizz Answer ... because the JVM is non deterministic! private Map componentEntries = new ConcurrentHashMap(); ... for (Map.Entry entry : componentEntries.entrySet()) { if (entry.getValue().instance == component) {   key = entry.getKey();     oldDescriptor = entry.getValue().descriptor;     break;   } } Sunday, March 31, 13
  • 27. Quality Tip #4 Functional Testing Stability (with Jenkins) 27 au 29 mars 2013 Sunday, March 31, 13
  • 28. The Problem Too many false positives leading to developers not paying attention to CI emails anymore... leading to failing software Sunday, March 31, 13
  • 29. False positives examples • The JVM has crashed • VNC is down (we run Selenium tests) • Browser crash (we run Selenium tests) • Git connection issue • Machine slowness (if XWiki cannot start under 2 minutes then it means the machine has some problems) • Nexus is down (we deploy our artifacts to a Nexus repository) • Connection issue (Read time out) Sunday, March 31, 13
  • 30. Step 1: Groovy PostBuild Plugin (1/2) def messages = [ [".*A fatal error has been detected by the Java Runtime Environment.*", "JVM Crash", "A JVM crash happened!"], [".*Error: cannot open display: :1.0.*", "VNC not running", "VNC connection issue!"], ... ] def shouldSendEmail = true messages.each { message -> if (manager.logContains(message.get(0))) { manager.addWarningBadge(message.get(1)) manager.createSummary("warning.gif").appendText(...) manager.buildUnstable() shouldSendEmail = false } } Sunday, March 31, 13
  • 31. Step 1: Groovy PostBuild Plugin (2/2) ... continued from previous slide... if (!shouldSendEmail) { def pa = new ParametersAction([ new BooleanParameterValue("noEmail", true) ]) manager.build.addAction(pa) } Sunday, March 31, 13
  • 32. Step 2: Mail Ext Plugin Pre-send Script import hudson.model.* build.actions.each { action -> if (action instanceof ParametersAction) { if (action.getParameter("noEmail")) { cancel = true } } } Sunday, March 31, 13
  • 33. Results + use the Scriptler plugin to automate configuration for all jobs Sunday, March 31, 13
  • 34. Quality Tip #5 Bug Fixing Day 27 au 29 mars 2013 Sunday, March 31, 13
  • 35. The Problem Bugs increasing, even simple to fix ones, devs focusing too much on new features (i.e. scope creep) vs fixing Bugs created vs closed what exists Sunday, March 31, 13
  • 36. Bug Fixing Day • Every Thursday • Goal is to close the max number of bugs • Triaging: Can be closed with Won’t fix, Duplicate, Cannot Reproduce, etc • Close low hanging fruits in priority • Started with last 365 days then with last 547 days and currently with last 730 days (we need to catch up with 40 bugs!) Sunday, March 31, 13
  • 38. Conclusion 27 au 29 mars 2013 Sunday, March 31, 13
  • 39. Parting words • Slowly add new quality check over time • Everyone must be on board • Favor Active Quality (i.e. make the build fail) over Passive checks • Be ready to adapt/remove checks if found not useful enough • Quality brings some risks: • Potentially less committers for your project (especially open source) • Project seen as “less fun” Sunday, March 31, 13
  • 40. Be proud of your Quality! “I have offended God and mankind because my work didn't reach the quality it should have.” Leonardo da Vinci, on his death bed Sunday, March 31, 13