550 likes | 986 Views
Maven project automation for dummies. Aino Andriessen AMIS. 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.
E N D
Maven project automation for dummies Aino Andriessen AMIS
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.
Conditions • Infrastructure • Scripting • No IDE
Scripting • Maven • ant • make • shell scripts • sql scripts • ...
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] Reactor Summary: [INFO] ------------------------------------------------------------------------ [INFO] HR1 ................................................... SUCCESS [3.003s] [INFO] HR1 model ............................................. SUCCESS [7.866s] [INFO] HR1 viewController .................................... SUCCESS [54.451s] [INFO] HR1 ear ............................................... SUCCESS [14.591s] [INFO] HR1 integration ....................................... SUCCESS [0.312s] [INFO] ------------------------------------------------------------------------ [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1 minute 20 seconds [INFO] Finished at: Fri Jun 01 17:32:01 CEST 2007 [INFO] Final Memory: 10M/18M [INFO] ------------------------------------------------------------------------
mvn test [INFO] [surefire:test] [INFO] Surefire report directory: D:\projects\myprojects\odtugDemo\hr1\model\tar get\surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- 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
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.0-SNAPSHOT.war [INFO] [ear:ear] [INFO] Copying artifact[war:nl.amis.demo.odtug.hr1:hr1-viewController:1.0-SNAPSHOT] to[hr1-viewController-1.0-SNAPSHOT.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\META-INF\MANIFEST.MF - Generating one [INFO] Building jar: D:\projects\myprojects\odtugDemo\hr1\ear\target\hr1-ear-1.0-SNAPSHOT.ear [INFO] -------------------------------------------------------------------------
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
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.0-20070601.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] -------------------------------------------------------------------------
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 !
Software development • The development environment • Source control • Delivery environments • Issue management • Library management • Build automation / continuous integration • Reporting and documentation • Communication
Nightly build • Continuum • Scheduler • http://ci.amis.nl:8080/continuum/servlet/continuum
Maven Project Object Model • Project objects • xml file Build Lifecycle • actions / goals (tasks) • Dependency (library, artifact) Management • Reporting and Documentation • ...
Convention over configuration
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>
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>
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>
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
Execution • mvn compile • mvn compile:compile • mvn compile:test-compile • mvn package • mvn jar • mvn jar:jar • mvn jar:sign • mvn test-jar:jar
Plugins • All 'tasks' are plugins • Written in java, ant
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>
Maven repositories 2 • Local • Internal • Central • http://repo1.maven.org/maven2/ • External • Codehaus • java.net • ...
Internal repository • commercial libraries • non-public libraries • company products
AMIS internal repositories • http://ci.amis.nl/maven2/ • http://ci.amis.nl/maven2snapshots/
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
Snapshots • Dependency management for development 'releases'.
Testing • Unittests • JUnit • TestNG • Integration tests • Database tests • ...
Integration tests • Start application server • Prepare the database • Deploy application • Run tests • Undeploy application • Stop application server
Integration tests • Front-end • Selenium • JMeter • Back-end / Database • QCTO • utPLSQL • Tools • dbunit • Maven sql plugin • Maven exec plugin • (JDeveloper) ant tasks
Release • mvn release:prepare • update version • tag in scm • mvn release:perform • deploy tagged version • artifact • sources • doc • create and deploy file
Maven projectsites • Documentation • Project info • Reports • http://ci.amis.nl/projectsites/
Maven 'bits and pieces' • Reports • Profiles • Archetype • Cargo plugin • Multi module projects • ...
Mavenize an ADF application • Dependency management • Crete or generate POM files • Tools
Tools • admin_client.jar utility • deployment to OC4J • ojspc.jar utility • pre compilation of jsf files • [JDeveloper] • [oc4j]
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
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>
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
Application / Project organisation • Directory layout • Default Maven layout • JDev project settings • Application with multiple projects
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
Projectfile generation • Create jws and jpr files • myFaces - Trinidad JDev plugin • org.apache.myfaces.trinidadbuild.maven-jdev-plugin • version 1.2.5 • Execute : mvn jdev:jdev • http://technology.amis.nl/blog/?p=1279
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