Maven project automation for dummies Aino Andriessen AMIS dec 20, 2007 1 Continuous Integration Continuous integration is the practice where the work of all the developers are integrated, analyzed and verified on a regular basis, preferably multiple times a day. It takes the latest situation from the source control system, performs unit tests, makes a build, deploys the application, performs integration tests and creates reports about these steps and communicates them with the team, all automatically without human interaction. dec 20, 2007 2 Conditions Infrastructure Scripting No IDE dec 20, 2007 3 Scripting Maven ant make shell scripts sql scripts ... dec 20, 2007 4 Demo dec 20, 2007 5 Maven execution info [INFO] Scanning for projects... [INFO] Reactor build order: [INFO] HR1 [INFO] HR1 model [INFO] HR1 viewController [INFO] HR1 ear [INFO] HR1 integration [INFO] ------------------------Downloading: http://repo1.maven.org/maven2/junit/junit/3.8.1/junit-3.8.1.jar 118K downloaded [INFO] [INFO] [INFO] [INFO] [INFO] [INFO] [INFO] [INFO] [INFO] [INFO] [INFO] [INFO] [INFO] [INFO] [INFO] [INFO] [INFO] -----------------------------------------------------------------------Reactor Summary: -----------------------------------------------------------------------HR1 ................................................... SUCCESS [3.003s] HR1 model ............................................. SUCCESS [7.866s] HR1 viewController .................................... SUCCESS [54.451s] HR1 ear ............................................... SUCCESS [14.591s] HR1 integration ....................................... SUCCESS [0.312s] ----------------------------------------------------------------------------------------------------------------------------------------------BUILD SUCCESSFUL -----------------------------------------------------------------------Total time: 1 minute 20 seconds Finished at: Fri Jun 01 17:32:01 CEST 2007 Final Memory: 10M/18M ----------------------------------------------------------------------- dec 20, 2007 6 mvn test [INFO] [surefire:test] [INFO] Surefire report directory: D:\projects\myprojects\odtugDemo\hr1\model\tar get\surefire-reports ------------------------------------------------------TESTS ------------------------------------------------------Running nl.amis.demo.odtug.model.queries.OdtugTstViewTest Jun 1, 2007 7:04:22 PM oracle.adf.share.config.ADFConfigFactory findOrCreateADFC onfig INFO: oracle.adf.share.config.ADFConfigFactory No META-INF/adf-config.xml found Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.606 sec Running nl.amis.demo.odtug.model.queries.RegionsViewTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.031 sec Running nl.amis.adf.fwk.test.Java5Test Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.016 sec Running nl.amis.demo.odtug.model.queries.JobsViewTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.046 sec Running nl.amis.demo.odtug.model.queries.EmployeesViewTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.032 sec Running nl.amis.demo.odtug.model.queries.DepartmentsViewTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.015 sec Running nl.amis.demo.odtug.model.queries.LocationsViewTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.016 sec Running nl.amis.demo.odtug.model.queries.CountriesViewTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.015 sec Results : Tests run: 8, Failures: 0, Errors: 0, Skipped: 0 dec 20, 2007 7 mvn package [INFO] Building HR1 [INFO] task-segment: [package] [INFO] --------------------------[INFO] [jar:jar] [INFO] Building jar: D:\projects\myprojects\odtugDemo\hr1\model\target\hr1-model-1.0-SNAPSHOT.jar [INFO] ------------------------------------------------------------------------[INFO] [war:war] [INFO] Building war: D:\projects\myprojects\odtugDemo\hr1\viewController\target\hr1-viewController-1.0SNAPSHOT.war [INFO] [ear:ear] [INFO] Copying artifact[war:nl.amis.demo.odtug.hr1:hr1-viewController:1.0-SNAPSHOT] to[hr1-viewController-1.0SNAPSHOT.war] [INFO] Copying artifact[jar:log4j:log4j:1.2.12] to[log4j-1.2.12.jar] [INFO] Copying artifact[jar:commons-logging:commons-logging:1.0.4] to[commons-logging-1.0.4.jar] [INFO] Could not find manifest file: D:\projects\myprojects\odtugDemo\hr1\ear\src\main\application\METAINF\MANIFEST.MF - Generating one [INFO] Building jar: D:\projects\myprojects\odtugDemo\hr1\ear\target\hr1-ear-1.0-SNAPSHOT.ear [INFO] ------------------------------------------------------------------------- dec 20, 2007 8 mvn exec:exec -PlocalOC4J [INFO] [exec:exec] [[INFO] 07/06/01 17:21:22 Notification ==>Uploading file hr1.ear ... [INFO] [INFO] 07/06/01 17:21:22 Notification ==>Application Deployer for hr1 STARTS. [INFO] [INFO] 07/06/01 17:21:22 Notification ==>Copy the archive to :\server\oc4j_101310\j2ee\home\applications\hr1.ear [INFO] [INFO] 07/06/01 17:21:22 Notification ==>Initialize C:\server\oc4j_101310\j2ee\home\applications\hr1.ear begins... [INFO] [INFO] 07/06/01 17:21:24 Notification ==>Initialize hr1-viewController-1.0-SNAPSHOT begins... [INFO] [INFO] 07/06/01 17:21:24 Notification ==>Initialize hr1-viewController-1.0-SNAPSHOT ends... [INFO] [INFO] 07/06/01 17:21:24 Notification ==>Started application : hr1 [INFO] [INFO] 07/06/01 17:21:24 Notification ==>Binding web application(s) to site default-web-site begins... [INFO] [INFO] 07/06/01 17:21:24 Notification ==>Binding hr1-viewController-1.0-SNAPSHOT web-module for application hr1 to site default-web-site under context root /hr1 [INFO] [INFO] 07/06/01 17:21:31 Notification ==>Initializing Servlet: javax.faces.webapp.FacesServlet for web application hr1-viewController-1.0-SNAPSHOT [INFO] [INFO] 07/06/01 17:21:31 Notification ==>Binding web application(s) to site default-web-site ends... [INFO] [INFO] 07/06/01 17:21:31 Notification ==>Application Deployer for hr1 COMPLETES. Operation time: 8273 msecs dec 20, 2007 9 mvn verify -PlocalOC4J dec 20, 2007 10 mvn deploy [INFO] [deploy:deploy] [INFO] Retrieving previous build number from ATAMaven2SnapshotsRepo Uploading: file:\\amis-test-aa\maven2snapshots/nl/amis/demo/odtug/hr1/hr1-model/1.0-SNAPSHOT/hr1-model-1.020070601.171522-4.jar 50K uploaded [INFO] Retrieving previous metadata from ATAMaven2SnapshotsRepo [INFO] Uploading repository metadata for: 'snapshot nl.amis.demo.odtug.hr1:hr1-model:1.0-SNAPSHOT' [INFO] ------------------------------------------------------------------------- dec 20, 2007 11 mvn site dec 20, 2007 12 Build automation server dec 20, 2007 13 Demo Summary ADF Faces application Tasks Unittesting Make a build Deploy ear file to OC4J Perform integrationtests Share artifacts Share information Without manual intervention and JDeveloper ! dec 20, 2007 14 Infrastructure dec 20, 2007 15 Software Studio dec 20, 2007 16 Software development The development environment Source control Delivery environments Issue management Library management Build automation / continuous integration Reporting and documentation Communication dec 20, 2007 17 Nightly build Continuum Scheduler http://ci.amis.nl:8080/continuum/servlet/continuum dec 20, 2007 18 'Scripting' with Maven dec 20, 2007 19 Maven Project Object Model Project objects xml file Build Lifecycle actions / goals (tasks) Dependency (library, artifact) Management Reporting and Documentation ... dec 20, 2007 20 Convention over configuration dec 20, 2007 21 POM example <project> <modelVersion>4.0.0</modelVersion> <groupId>nl.amis.demo.odtug.hr1</groupId> <artifactId>hr1</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>model</module> <module>viewController</module> <module>ear</module> </modules> <name>HR1</name> <description>This application manages employees and general company information.</description> <url>http://localhost:8800/hr1/faces/index.jspx</url> <organization> <name>AMIS Services</name> <url>http://www.amis.nl</url> </organization> <issueManagement> <system>Jira</system> <url>http://dev.amis.nl/jira/browse/PAG</url> </issueManagement> dec 20, 2007 22 POM example <scm> <connection>scm:svn:http://subversion.amis.nl/users/aino_a/hr1/trunk/ </connection> <developerConnection> scm:svn:http://subversion.amis.nl/users/aino_a/hr1/trunk/ </developerConnection> <url>http://subversion.amis.nl/users/aino_a/hr1/trunk/</url> </scm> <developers> <developer> <id>aino.andriessen</id> <name>Aino Andriessen</name> <email>aino.andriessen@amis.nl</email> <organization>AMIS</organization> <roles><role>developer</role></roles> <timezone>+1</timezone> </developer> </developers> <distributionManagement> <repository> <id>AMISMaven2Repo</id> <url>file:\\ci.amis.nl\maven2</url> </repository> </distributionManagement> dec 20, 2007 23 Pom Example <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> </plugins> </build> <reporting> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-checkstyle-plugin</artifactId> <configuration> <configLocation> src/main/resources/amis_checkstyle.xml </configLocation> </configuration> </plugin> </plugins> </reporting> </project> dec 20, 2007 24 Build Lifecycle Organized sequence of phases like compile, test, package, build etc. The actual work is done by goals which are bound to a certain phase. Configuration (if necessary) in pom Other lifecycles clean site validate generate-sources process-sources generate-resources process-resources compile process-classes generate-test-sources process-test-sources generate-test-resources process-test-resources test-compile test prepare-package package pre-integration-test integration-test post-integration-test verify install deploy dec 20, 2007 25 Execution mvn compile mvn compile:compile mvn compile:test-compile mvn package mvn jar • mvn jar:jar • mvn jar:sign • mvn test-jar:jar dec 20, 2007 26 Plugins All 'tasks' are plugins Written in java, ant dec 20, 2007 27 Dependency Management Defined in the POM Downloaded from repository when needed Stored in local repository <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>com.oracle.adf</groupId> <artifactId>adfbinding</artifactId> <version>10.1.3.39.84</version> <scope>provided</scope> </dependency> <dependency> <groupId>nl.amis.demo.odtug.hr1</groupId> <artifactId>hr1-model</artifactId> <version>${project.version}</version> </dependency> </dependencies> dec 20, 2007 28 Maven repositories dec 20, 2007 29 Maven repositories 2 Local Internal Central http://repo1.maven.org/maven2/ External Codehaus java.net ... dec 20, 2007 30 Internal repository commercial libraries non-public libraries company products dec 20, 2007 31 AMIS internal repositories http://ci.amis.nl/maven2/ http://ci.amis.nl/maven2snapshots/ dec 20, 2007 32 Deploy Upload the (created) artifact to the internal repository mvn deploy:deploy-file deploy a library tot the repository call mvn deploy:deploy-file -DgroupId=com.oracle.jdbc -DartifactId=ojdbc14 -Dversion=10.2.0.1 -Dfile=ojdbc14.jar -Dpackaging=jar -DrepositoryId=AMISMaven2Repository -Durl=file:\\ci.amis.nl\maven2 dec 20, 2007 33 Snapshots Dependency management for development 'releases'. dec 20, 2007 34 Testing Unittests JUnit TestNG Integration tests Database tests ... dec 20, 2007 35 Integration tests Start application server Prepare the database Deploy application Run tests Undeploy application Stop application server dec 20, 2007 36 Integration tests Front-end Selenium JMeter Back-end / Database QCTO utPLSQL Tools dbunit Maven sql plugin Maven exec plugin (JDeveloper) ant tasks dec 20, 2007 37 Release mvn release:prepare update version tag in scm mvn release:perform deploy tagged version • • • artifact sources doc create and deploy file dec 20, 2007 38 Maven projectsites Documentation Project info Reports http://ci.amis.nl/projectsites/ dec 20, 2007 39 Maven 'bits and pieces' Reports Profiles Archetype Cargo plugin Multi module projects ... dec 20, 2007 40 ADF & JDeveloper & Maven dec 20, 2007 41 Mavenize an ADF application Dependency management Crete or generate POM files Tools dec 20, 2007 42 Tools admin_client.jar utility deployment to OC4J ojspc.jar utility pre compilation of jsf files [JDeveloper] [oc4j] dec 20, 2007 43 JDeveloper library management JDeveloper has a great library management system... as long as you stay in JDeveloper as long as you use the provided libraries dec 20, 2007 44 Dependencies Put (deploy) libraries in the internal repository Keep pom file(s) in sync call mvn deploy:deploy-file -DgroupId=com.oracle.adf -DartifactId=adfshare -Dversion=%ADF_VERSION% -Dfile=%JDEV_HOME%/BC4J/lib/adfshare.jar -Dpackaging=jar -DrepositoryId=%REPO_ID% -Durl=%REPO_URL% <dependencies> <dependency> <groupId>com.oracle.adf</groupId> <artifactId>adfshare</artifactId> <version>10.1.3.41.57</version> <scope>provided</scope> </dependency> </dependencies> dec 20, 2007 45 Required libraries ADF • • adfshare, adfui, adf-controller, adfbinding, adfm, bc4jdomorcl, bc4jmt, bc4jct, bc4jdatum, bc4jhtml, datatags, graphtags, bc4jimdomains, ordim jhsadfrt, sqlj runtime JDeveloper • oc4j-internal, oc4j, adf-faces-impl, adf-faces-api, jdev-cm, ojmisc, xmlparserv2, ojsp, ojsputil Other • sun collections 1.1, apache commons Note : do NOT include log4j ADF 10.1.3.0 10.1.3.36.73 10.1.3.1 10.1.3.39.84 10.1.3.2 10.1.3.40.66 10.1.3.3 10.1.3.41.57 dec 20, 2007 JDev 46 Application / Project organisation Directory layout Default Maven layout JDev project settings Application with multiple projects dec 20, 2007 47 ADF Archetype AMIS maven-archetype-adf : mvn archetype:create -DarchetypeGroupId=nl.amis.maven.archetypes -DarchetypeArtifactId=maven-archetype-adf -DarchetypeVersion=10.1.3.3[-SNAPSHOT] -DremoteRepositories=http://ci.amis.nl/maven2(snapshots) -DgroupId=nl.amis.demo -DartifactId=hr1 dec 20, 2007 48 Projectfile generation Create jws and jpr files myFaces - Trinidad JDev plugin org.apache.myfaces.trinidadbuild.maven-jdevplugin version 1.2.5 Execute : mvn jdev:jdev http://technology.amis.nl/blog/?p=1279 dec 20, 2007 49 Deploy to OC4J Command-line oc4j admin_client.jar utility in ear project or associated with a certain phase mvn exec:exec -PlocalOC4J Unfortunately no Cargo plugin cargo:start, cargo:stop, cargo:deploy Define local dependencies (location of admin_client.jar) in local settings.xml dec 20, 2007 50 Example <profile> <id>devOC4J</id> <plugin> <activation> <groupId>org.codehaus.mojo</groupId> <activeByDefault>false</activeByDefault> <artifactId>exec-maven-plugin</artifactId> </activation> <properties> <executions> <ias.server.url>ci.amis.nl</ias.server.url> <execution> <ias.server.port>8888</ias.server.port> <id>deployApp</id> <ias.deploy.url>deployer:oc4j:${ias.server.url}</ias.deploy.url> <phase>pre-integration-test</phase> <ias.username>oc4jadmin</ias.username> <goals> <ias.password>oc4jadmin</ias.password> </properties> <goal>exec</goal> </profile> </goals> <configuration> <executable>${java.home}/bin/java</executable> <arguments> <argument>-jar</argument> <argument>${oc4j.adminclient.home}\j2ee\home\admin_client.jar</argument> <argument>${ias.deploy.url}</argument> <argument>${ias.username}</argument> <argument>${ias.password}</argument> <argument>-deploy</argument> <argument>-file</argument> <argument>../ear/target/hr1-ear-${version}.ear</argument> <argument>-deploymentName</argument> <argument>hr1</argument> <argument>-bindAllWebApps</argument> </arguments> </configuration> java -jar C:\server\oc4j_101310\j2ee\home\admin_client.jar </execution> deployer:oc4j:localhost </executions> oc4jadmin oc4jadmin </plugin> -deploy -file hr1-ear-1.0-SNAPSHOT.ear -deploymentName hr1 -bindAllWebApps dec 20, 2007 51 Running Maven from JDeveloper Waiting for a JDeveloper extension ;-) Ant tasks as wrapper dec 20, 2007 52 Installation of Maven http://maven.apache.org/download.html Unzip Environment settings : M2_HOME , PATH mvn -verify settings.xml <M2_HOME>/conf/ or <user.dir>/.m2/ [local repository] servers • credentials internal repositories local configurations • dec 20, 2007 oc4j installation 53 Conclusion Continuous integration is essential for the development process! Using Maven, ADF Faces applications can be continuously integrated! Maven succesfully applied at Connexys, Pagoni, Locatus, Nieuw Caledonië dec 20, 2007 54 aino.andriessen@amis.nl http://technology.amis.nl/blog dec 20, 2007 55