Question

I have set up my first CI environment with Jenkins and Phing and it is mostly running perfectly, though I have a few hiccups I can't resolve. I am constantly having trouble in determining how to reference directories within various parts of my build process, appreciate any thoughts on the below:

build.xml

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

<project name="myProject" default="dev" basedir=".">

    <property name="baseDir" value="." />
    <property name="resourceDir" value="${baseDir}/resources" />
    <property name="srcDir" value="${baseDir}/src" />
    <property name="outputDir" value="${baseDir}/build" />
    <property name="logDir" value="${baseDir}/build/logs" />
    <property name="phpmdRulesets" value="${resourceDir}/phpmd/rulesets" />

    <property name="devServer" value="C:\Apache24\htdocs\myProject.com" />

    <target name="init">
        <mkdir dir="${outputDir}" />
        <mkdir dir="${logDir}" />
    </target>

    <target name="clean">
        <delete dir="${devServer}" includeemptydirs="true" verbose="true" failonerror="true" />
        <mkdir dir="${devServer}" />
    </target>

    <target name="test">
        <echo msg="Running unit tests" />
        <exec executable="phpunit" checkreturn="true">
            <arg value="--log-junit=${logDir}/PHPUnit.xml" />
            <arg value="--verbose" />
            <arg value="--debug" />
            <arg value="--coverage-clover=${logDir}/clover.xml" />
            <arg path="${baseDir}" />
        </exec>
    </target>

    <target name="build" depends="phpcs, phpmd, phpcpd, phpDox">
        <echo msg="Running build" />
        <echo msg="Copying files to build directory..." />
        <copy todir="${outputDir}">
            <fileset dir="${baseDir}">
                <include name="**/src/**" />
                <include name="**/resources/**" />
            </fileset>
        </copy>
    </target>

    <target name="phpcs">
        <echo msg="Running phpcs" />
        <exec executable="phpcs"> 
            <arg value="--report=checkstyle" />
            <arg value="--ignore=${srcDir}/php/Test/*,${srcDir}/php/lib/*" />
            <arg value="--report-file=${logDir}/checkstyle.xml" />
            <arg path="${srcDir}" />
        </exec>
    </target>

    <target name="phpmd">
        <echo msg="Running phpmd" />
        <exec executable="phpmd">
            <arg path="${srcDir}" />
            <arg value="xml" />
            <arg value="${phpmdRulesets}/codesize.xml,${phpmdRulesets}/unusedcode.xml,${phpmdRulesets}/naming.xml,${phpmdRulesets}/design.xml" />
            <arg value="--reportfile ${logDir}/messdetector.xml" />
            <arg value="--exclude ${srcDir}/php/Test/,${srcDir}/php/lib/" />
        </exec>
    </target>

    <target name="phpcpd">
        <echo msg="Running phpcpd" />
        <exec executable="phpcpd">
            <arg value="--log-pmd=${logDir}/phpcpd.xml" />
            <arg value="-vvv" />
            <arg value="--exclude=${srcDir}/php/Test/,${srcDir}/php/lib/" />
            <arg path="${srcDir}" />
        </exec>
    </target>

    <target name="phpDox">
        <echo msg="Running phpDox" />
        <exec executable="phpdox">
            <arg value="${resourceDir}" />
        </exec>
    </target>

    <target name="dev" depends="init, clean, test, build">
        <echo msg="Running dev target" />
        <copy file="${outputDir}/src/php/index.php" tofile="${devServer}/index.php" />
        <copy todir="${devServer}/php">
            <fileset dir="${outputDir}/src/php">
                <include name="**" />
                <exclude name="**/index.php" />
            </fileset>
        </copy>
        <copy todir="${devServer}/api">
            <fileset dir="${outputDir}/api/html">
                <include name="**" />
            </fileset>
        </copy>
        <copy file="${outputDir}/src/php/lib/phpLogin/index.php" tofile="${devServer}/php/lib/phpLogin/index.php" />
    </target>
</project>

Issue 1: phpmd won't output the reportfile yet there are no errors reported in the Jenkins log. Instead it is logging the entire xml to the stdout and reporting it in the Jenkins logs.

myProject > phpmd:

     [echo] Running phpmd
Property ${srcDir} => ./src
Property ${phpmdRulesets} => ./resources/phpmd/rulesets
Property ${phpmdRulesets} => ./resources/phpmd/rulesets
Property ${phpmdRulesets} => ./resources/phpmd/rulesets
Property ${phpmdRulesets} => ./resources/phpmd/rulesets
Property ${logDir} => ./build/logs
Property ${srcDir} => ./src
Property ${srcDir} => ./src
     [exec] Executing command: phpmd ./src xml ./resources/phpmd/rulesets/codesize.xml,./resources/phpmd/rulesets/unusedcode.xml,./resources/phpmd/rulesets/naming.xml,./resources/phpmd/rulesets/design.xml "--reportfile ./build/logs/messdetector.xml" "--exclude ./src/php/Test/,./src/php/lib/" 2>&1
     [exec] <?xml version="1.0" encoding="UTF-8" ?>
     ...

Issue 2: I am unable to get phpDox to exclude certain directories within my source code. Below is my phpdox.xml.

<?xml version="1.0" encoding="utf-8" ?>
<phpdox xmlns="http://phpdox.de/config">
    <project name="myProject.com" source="src/php" workdir="build/api/xml">
        <collector backend="parser" publiconly="false">
            <include mask="*.php" />
            <exclude mask="/lib/**" />
        </collector>
        <generator output="build/api">
            <build engine="html" output="html"/>
        </generator>
    </project>
</phpdox>

Does anyone know the correct exclude mask I can use please? My file structure is:

myProject.com
  /build.xml
  /phpdox.xml
  /src
    /php
      /lib
Was it helpful?

Solution

Both issues resolved.

Issue 1: Changed the phpmd task to only use arg values and not arg path. Fixed below:

<target name="phpmd">
    <echo msg="Running phpmd" />
    <exec executable="phpmd">
        <arg value="${dir.src}" />
        <arg value="xml" />
        <arg value="${dir.phpmdRulesets}/codesize.xml,${dir.phpmdRulesets}/unusedcode.xml,${dir.phpmdRulesets}/naming.xml,${dir.phpmdRulesets}/design.xml" />
        <arg value="--reportfile" />
        <arg value="${dir.logs}/messdetector.xml" />
        <arg value="--exclude"/>
        <arg value="test,lib" />
    </exec>
</target>

Issue 2: Finally got the exclude masks to work. Fixed xml below:

<?xml version="1.0" encoding="utf-8" ?>
<phpdox xmlns="http://phpdox.de/config">
    <project name="myProject.com" source="src/app" workdir="build/api/xml">
        <collector backend="parser" publiconly="false">
            <include mask="*.php" />
            <exclude mask="**/*lib*" />
            <exclude mask="**/*test*" />
        </collector>
        <generator output="build/api">
            <build engine="html" output="html"/>
        </generator>
    </project>
</phpdox>
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top