jenkins -- bigbucket - git - apache-tomcat -- sonar intergration doc





step 1


Installation of jenkins :  ( with out  apache tomcat , stand alone instance )
( this steps are done on test machine )


yum install java-1.6.0-openjdk
sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
Sudo yum install jenkins





All config details :
/etc/sysconfig/jenkins
/var/lib/jenkins/



Installation of jenkins :  ( with   apache tomcat. Tomcat will inturn run the jeninks.war file  )


( these steps are done on Actual machine ) 



    Step 1: Install the JDK\




[root@station1 Downloads]# rpm -ivh jdk-7u7-linux-x64.rpm
[root@station1 Downloads]# JAVA_HOME=/usr/java/jdk1.7.0_
07
[root@station1 Downloads]# export JAVA_HOME
[root@station1 Downloads]# PATH=$JAVA_HOME/bin:$PATH
[root@station1 Downloads]# export PATH
[root@station1 Downloads]# vim /root/.bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
       . ~/.bashrc
fi

# User specific environment and startup programs
JAVA_HOME=/usr/java/jdk1.7.0_07/
export JAVA_HOME
PATH=$JAVA_HOME/bin:$PATH
export PATH
#PATH=$PATH:$HOME/bin
#export PATH
Restart or logout and login


[root@station1 Downloads]# echo $JAVA_HOME
/usr/java/jdk1.7.0_07/



      Step 2: Download and Unpack apache-tomcat-7.0.30 (or latest)


To download latest  apache-tomcat

[root@station1 Downloads]# tar -xzvf apache-tomcat-7.0.30.tar.gz
[root@station1 Downloads]# mv apache-tomcat-7.0.30 /usr/share/
[root@station1 Downloads]# vim /etc/init.d/tomcat
   #!/bin/bash
    # description: Tomcat Start Stop Restart
    # processname: tomcat
   # chkconfig: 234 20 80
    JAVA_HOME=/usr/java/jdk1.7.0_07
    export JAVA_HOME
    PATH=$JAVA_HOME/bin:$PATH
    export PATH
    CATALINA_HOME=/usr/share/apache-tomcat-7.0.30

    case $1 in
    start)
    sh $CATALINA_HOME/bin/startup.sh
    ;;
    stop)
    sh $CATALINA_HOME/bin/shutdown.sh
    ;;
    restart)
    sh $CATALINA_HOME/bin/shutdown.sh
    sh $CATALINA_HOME/bin/startup.sh
    ;;
    esac
    exit 0
[root@station1 ~]# chmod 755 /etc/init.d/tomcat
[root@station1 ~]# chkconfig --add tomcat
[root@station1 ~]# chkconfig --level 234 tomcat on
[root@station1 ~]# chkconfig --list tomcat
tomcat             0:off    1:off    2:on    3:on    4:on    5:off    6:off
[root@station1 ~]# service tomcat stop
Using CATALINA_BASE:   /usr/share/apache-tomcat-7.0.30
Using CATALINA_HOME:   /usr/share/apache-tomcat-7.0.30
Using CATALINA_TMPDIR: /usr/share/apache-tomcat-7.0.30/temp
Using JRE_HOME:        /usr/java/jdk1.7.0_07
Using CLASSPATH:       /usr/share/apache-tomcat-7.0.30/bin/bootstrap.jar:/usr/share/apache-tomcat-7.0.30/bin/tomcat-juli.jar

[root@station1 ~]# service tomcat start
Using CATALINA_BASE:   /usr/share/apache-tomcat-7.0.30
Using CATALINA_HOME:   /usr/share/apache-tomcat-7.0.30
Using CATALINA_TMPDIR: /usr/share/apache-tomcat-7.0.30/temp
Using JRE_HOME:        /usr/java/jdk1.7.0_07
Using CLASSPATH:       /usr/share/apache-tomcat-7.0.30/bin/bootstrap.jar:/usr/share/apache-tomcat-7.0.30/bin/tomcat-juli.jar

[root@station1 ~]# service tomcat restart
Using CATALINA_BASE:   /usr/share/apache-tomcat-7.0.30
Using CATALINA_HOME:   /usr/share/apache-tomcat-7.0.30
Using CATALINA_TMPDIR: /usr/share/apache-tomcat-7.0.30/temp
Using JRE_HOME:        /usr/java/jdk1.7.0_07
Using CLASSPATH:       /usr/share/apache-tomcat-7.0.30/bin/bootstrap.jar:/usr/share/apache-tomcat-7.0.30/bin/tomcat-juli.jar
Using CATALINA_BASE:   /usr/share/apache-tomcat-7.0.30
Using CATALINA_HOME:   /usr/share/apache-tomcat-7.0.30
Using CATALINA_TMPDIR: /usr/share/apache-tomcat-7.0.30/temp
Using JRE_HOME:        /usr/java/jdk1.7.0_07
Using CLASSPATH:       /usr/share/apache-tomcat-7.0.30/bin/bootstrap.jar:/usr/share/apache-tomcat-7.0.30/bin/tomcat-juli.jar


For logs


[root@station1 ~]# less /usr/share/apache-tomcat-7.0.30/logs/catalina.out
We can now access the Tomcat Manager page at
[root@station1 ~]# firefox http://station1.com:8080


copy the jenkins.war file to the tomcats


Jenkins home dir will be /root/.jenkins


We can access jenkins






step 2


-- Configure jenkins for git -- need to add plugins from --> manage plugins


-- create new jobs for each product  ( eg:somedomain.com )



step 3


Create Bit Bucket accounts


-- Add accounts in bit bucket at product level eg: somedomain1, somedomain2, etc
       


-- Separate email ids need to be created for each product eg: project1@domain.com,porject2@domain.com
    -- cretate product level repo :
    -- Upto 5 users per account can be added at no cost as per bit bucket pricing terms
       -- emails will be sent to each team members


   


-- install git in  local machine , follow inrustions "start from stratch "  ( this could be done a git-gui client )
     -- updated .git/config file
      [user]
            name = agnello
            email = agnello@domain.com


     -- steps to be follwoed 1st time on local machine  by TL
           mkdir /path/to/your/project
        cd /path/to/your/project
        git init
           git remote add origin https://<<the https URL from BB>>



     -- step to be done on Developer machines
         -- install git-core
         -- access BB URL from the email he would recv .
         -- Once he logs into BB -- systems team will auth him to grant access to repo.
         -- on the linux/ubuntu  Konsole he creats a clone repo



Cloning into cs442-spring12-jdoe...
Username: jdoe
Password: *********
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.

$ ls
cs442-spring12-jdoe/


Adding files and commiting to the local repository
$ cd cs442-spring12-jdoe

$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       MyNewProject/
nothing added to commit but untracked files present (use "git add" to track)

$ git add MyNewProject


$ git config user.name "John Doe"

$ git config user.email "jdoe@hawk.iit.edu"

$ git commit -m "Initial commit for MyNewProject"
[master 453a4f8] Initial commit for MyNewProject
7 files changed, 416 insertions(+), 0 deletions(-)
create mode 100644 MyNewProject/MyNewProject.xcodeproj/project.pbxproj
create mode 100644 MyNewProject/MyNewProject/AppDelegate.h
create mode 100644 MyNewProject/MyNewProject/AppDelegate.m
create mode 100644 MyNewProject/MyNewProject/MyNewProject-Info.plist
create mode 100644 MyNewProject/MyNewProject/MyNewProject-Prefix.pch
create mode 100644 MyNewProject/MyNewProject/en.lproj/InfoPlist.strings
create mode 100644 MyNewProject/MyNewProject/main.m

$ git log
commit 048c71c22f1d38b1a4c8cb73be55ce351fea641b
Author: John Doe <jdoe@hawk.iit.edu>
Date:   Wed Feb 15 22:01:34 2012 -0600

    Initial commit for MyNewProject


commit 3caa74862b8f17f356841bfa2d380a817f371ffe
Author: Michael Lee <lee@soi2.org>
Date:   Thu Jan 12 16:48:59 2012 -0600

    Adding initial README


commit 12cb858e8ecb869d9dc1489283741c9897a3b7f9
Author: Michael Lee <lee@soi2.org>
Date:   Thu Jan 12 16:37:00 2012 -0600

    Adding Xcode gitignore






step 4


-- On Jenkins server , Login as Jenkins, run ss-keygen
-- copy the  .ssh/id_rsa.pub to bit bucket ( with account project1@domain.com ) this is done so that jenkins can connet to BB with our password
-- Add at the New Job level  --> configuration -- > source code managt --> <<  ssh URl from BB >>



step 5


-- In "Manage Jenkins" --> E-mail Notification -->


smtp server  -- smtp.gmail.com
Default user e-mail suffix  --  username@domain.com
-- check "Use SMTP Authentication"
user name  -- jenkins@domain.com
password --- !jenkins@345
use ssl --
smtp port -- 465
Reply-To Address  -- noreply@domain.com




Step 6


installing ant
yum install ant


installing maven


cd /tmp
tar zxvf apache-maven-3.0.5-bin.tar.gz
mv apache-maven-3.0.5 /usr/local/
vi /etc/profile.d/maven.sh
export PATH=/usr/local/apache-maven-
3.0.5/bin:$PATH










installing plugins:  installed the following jenkins plugin


phing
checkstyle
cloverphp
dry
htmlpublisher
jdepend
plot
pmd
violations
xunit



installing all the pear modules .


pecl install xdebug
pear channel-discover pear.pdepend.org
pear install pdepend/PHP_Depend
pear channel-discover pear.phpmd.org
pear install phpmd/PHP_PMD
pear channel-discover components.ez.no
pear channel-discover pear.symfony-project.com
pear install phpunit/phploc
pear install PHPDocumentor
pear install PHP_CodeSniffer
pear install phpunit/PHP_CodeBrowser
pear install phpunit/PHPUnit
pear install phpunit/ppw
pear install Zend_Framework
pear channel-discover pear.zfcampus.org
pear install zfcampus/ZF
pear channel-discover pear.phing.info
pear install phing/phing



step 7


Update On Jenkins


Understanding of git - branches


there are two branches " master " and " development "



-------------------------------------------------------------
These step are used to check into master 1st time


git init
git remote add origin ssh://git@bitbucket.org/agnellodsouza/somedomain1.git
git add .
git commit -m "First commit"
git push -u origin master


--------------------------------------------------------------


On the developers desktop


git clone -b development ssh://git@bitbucket.org/agnellodsouza/somedomain1.git
git branch development
git checkout development

<<< developer makes some changes to the file README >>>

git push -u origin development
git add .
git commit -m "made changes to README "
git push -u origin development



<< again developer pulls from developement branch >>

git branch
git pull origin development



Once developer checks into the Developer branch jenkins will check if any commits have been made ever 5 min . If it see change in commit it will start the build


-- poll from development branch
-- invoke ant -- using the build.xml
-- run various test  ( currently no php unit test for someproject.com)
-- if build successful
-- Using the Git Publisher plugin , will commit to the master branch and create a separate  TAG branch.





Here are few install plugins in for Jenkins :




------------------------------------------------------------------------------------------------


The content of build.xml file that ant need to invoke


<?xml version="1.0" encoding="UTF-8"?>


<project name="Sample project" default="build">
<target name="build"    depends="prepare,lint,perltestcases,phploc,pdepend,phpmd-ci,phpcs-ci,phpcpd,phpcb,phpdoc"/>


<target name="build-parallel"
  depends="prepare,lint,tools-parallel,phpcb"/>


<target name="tools-parallel"
        description="Run tools in parallel">
 <parallel threadCount="2">
  <sequential>
    <antcall target="pdepend"/>
    <antcall target="phpmd-ci"/>
  </sequential>
  <antcall target="phpcpd"/>
  <antcall target="phpcs-ci"/>
  <antcall target="phploc"/>
 </parallel>
</target>


<target name="clean" description="Cleanup build artifacts">
 <delete dir="${basedir}/build/api"/>
 <delete dir="${basedir}/build/code-browser"/>
 <delete dir="${basedir}/build/coverage"/>
 <delete dir="${basedir}/build/logs"/>
 <delete dir="${basedir}/build/pdepend"/>
 <delete dir="${basedir}/build/phpdox"/>
 <delete dir="${basedir}/build/code-browser"/>
</target>


<target name="prepare" depends="clean"
        description="Prepare for build">
 <mkdir dir="${basedir}/build/api"/>
 <mkdir dir="${basedir}/build/code-browser"/>
 <mkdir dir="${basedir}/build/coverage"/>
 <mkdir dir="${basedir}/build/logs"/>
 <mkdir dir="${basedir}/build/pdepend"/>
 <mkdir dir="${basedir}/build/phpdox"/>
 <mkdir dir="${basedir}/build/code-browser"/>
</target>




<target name="lint">
 <apply executable="php" failonerror="true">
  <arg value="-l" />


  <fileset dir="${basedir}/src">
    <include name="**/*.php" />
    <modified />
  </fileset>


 </apply>
</target>



<target name="perltestcases">
<property name="perl" location="/usr/bin/perl"/>
<property name="wrapper" location="${basedir}/wrapper2.pl"/>
<exec executable="${perl}" spawn="false">
<arg value="${wrapper}"/>
<arg value="${jobid}"/>
</exec>
</target>


<target name="phploc" description="phploc can be used to track project size metrics, such as Lines of Code (LOC)">
 <exec executable="phploc">
  <arg value="--log-csv" />
  <arg value="${basedir}/build/logs/phploc.csv" />
  <arg path="${basedir}/src" />
 </exec>
</target>


<target name="pdepend"
        description="Calculate software metrics using PHP_Depend">
 <exec executable="pdepend">
  <arg value="--jdepend-xml=${basedir}/build/logs/jdepend.xml" />
  <arg value="--jdepend-chart=${basedir}/build/pdepend/dependencies.svg" />
  <arg value="--overview-pyramid=${basedir}/build/pdepend/overview-pyramid.svg" />
  <arg path="${basedir}/src" />
 </exec>
</target>


<target name="phpmd"
        description="Perform project mess detection using PHPMD">
 <exec executable="phpmd">
  <arg path="${basedir}/src" />
 <mkdir dir="${basedir}/build/phpdox"/>
 <mkdir dir="${basedir}/build/phpdox"/>
  <arg value="text" />
  <arg value="${basedir}/build/phpmd.xml" />
 </exec>
</target>


<target name="phpmd-ci"
        description="Perform project mess detection using PHPMD">
 <exec executable="phpmd">
  <arg path="${basedir}/src" />
  <arg value="xml" />
  <arg value="${basedir}/build/phpmd.xml" />
  <arg value="--reportfile" />
  <arg value="${basedir}/build/logs/pmd.xml" />
 </exec>
</target>


<target name="phpcs"
        description="Find coding standard violations using PHP_CodeSniffer">
 <exec executable="phpcs">
  <arg value="--standard=${basedir}/build/phpcs.xml" />
  <arg path="${basedir}/src" />
 </exec>
</target>


<target name="phpcs-ci"
        description="Find coding standard violations using PHP_CodeSniffer">
 <exec executable="phpcs" output="/dev/null">
  <arg value="--report=checkstyle" />
  <arg value="--report-file=${basedir}/build/logs/checkstyle.xml" />
  <arg value="--standard=${basedir}/build/phpcs.xml" />
  <arg path="${basedir}/src" />
 </exec>
</target>


<target name="phpcpd" description="Find duplicate code using PHPCPD">
 <exec executable="phpcpd">
  <arg value="--log-pmd" />
  <arg value="${basedir}/build/logs/pmd-cpd.xml" />
  <arg path="${basedir}/src" />
 </exec>
</target>


<target name="phpcb"
        description="Aggregate tool output with PHP_CodeBrowser">
 <exec executable="phpcb">
  <arg value="--log" />
  <arg path="${basedir}/build/logs" />
  <arg value="--source" />
  <arg path="${basedir}/src" />
  <arg value="--output" />
  <arg path="${basedir}/build/code-browser" />
 </exec>
</target>


<target name="phpdoc"
       description="Generate API documentation using PHPDocumentor">
  <exec executable="phpdoc">
  <arg value="--directory" />
  <arg path="${basedir}/src" />
  <arg value="--target" />
  <arg path="${basedir}/build/api" />
  </exec>
</target>


</project>


--------------------------------------------------------------------------------






Sonar intergration with jenkins using maven


sonar + maven + jenkins


we leave the sonar conf file as default
/usr/local/bin/sonar-3.5.1/conf/sonar.properties


setting for maven
/usr/local/bin/apache-maven-3.0.5/conf/settings.xml


<profile>
<id>sonar-profile</id>
<properties>
<sonar.language>php</sonar.language>
</properties>
</profile>


<activeProfiles>
    <activeProfile>sonar-profile</activeProfile>
</activeProfiles>





setting the pom.xml for maven ( this is to be set a individual project level )



<project>
<modelVersion>4.0.0</modelVersion>
<groupId>arsapi</groupId>
<artifactId>arsapi</artifactId>
<name>ars</name>
<version>1.0</version>
<packaging>pom</packaging>
<build>
<directory>build</directory>
<sourceDirectory>src</sourceDirectory>
<testSourceDirectory>test</testSourceDirectory>
</build>


<properties>
<sonar.language>php</sonar.language>
<sonar.dynamicAnalysis>true</sonar.dynamicAnalysis>
<sonar.phpDepend.shouldRun>true</sonar.phpDepend.shouldRun>
<sonar.phpDepend.exclude>vendor/, app/, bin/, web/, src/*/Bundle/*Bundle/Tests</sonar.phpDepend.exclude>
<sonar.phpPmd.shouldRun>true</sonar.phpPmd.shouldRun>
<sonar.phpPmd.analyzeOnly>false</sonar.phpPmd.analyzeOnly>
<sonar.phpCodesniffer.shouldRun>true</sonar.phpCodesniffer.shouldRun>
<sonar.phpcpd.shouldRun>true</sonar.phpcpd.shouldRun>


<sonar.phpUnit.coverage.skip>true</sonar.phpUnit.coverage.skip>
<sonar.phpUnit.skip>true</sonar.phpUnit.skip>


</properties>


</project>



in Jenkins go to the manage configuration and set the maven path .




admin / password



Here are few more imp links :

































very imp docs













No comments:

Other Articles

Enter your email address: