Дженкинс CI в Windows - инструменты PHP, не выполняемые при сборке - PullRequest
7 голосов
/ 21 июня 2011

Я недавно установил Jenkins в своей локальной среде разработки Windows 7.

Я настроил Jenkins для своих локальных установок Java и Ant и настроил свой первый проект.

Я использовал инструкцию от http://jenkins -php.org / для выполнения определенных инструментов PHP (PHP CodeSniffer, PHP Doc и т. Д.) При сборке, указанной в build.xml.

Груша была правильно настроена до установки PHPПакеты инструментов, поэтому все файлы package.bat (в каталоге Pear) пакетов имеют правильный путь к бину PHP.Также установлена ​​переменная среды Windows PHPBIN, указывающая на расположение php bin - путь php bin также находится в переменной PATH.

Путь Pear (содержащий все установки инструментов PHP) также включен впеременная PATH.

Когда я запускаю сборку вручную, я получаю сообщения об ошибках, что она не может запускать определенные программы (-> инструменты PHP), хотя они правильно установлены (через Pear) и выполняются через командуподскажите ...

Вот вывод ошибки:

Started by user anonymous
Updating file:///D://SVN/MyProjectRepository/trunk/public_html
At revision 38
[workspace] $ cmd.exe /C '"ant.bat -file build.xml && exit %%ERRORLEVEL%%"'
Buildfile: C:\Servers\Jenkins\jobs\MyProject\workspace\build.xml

clean:
   [delete] Deleting directory C:\Servers\Jenkins\jobs\MyProject\workspace\build\api
   [delete] Deleting directory C:\Servers\Jenkins\jobs\MyProject\workspace\build\code-browser
   [delete] Deleting directory C:\Servers\Jenkins\jobs\MyProject\workspace\build\coverage
   [delete] Deleting directory C:\Servers\Jenkins\jobs\MyProject\workspace\build\logs
   [delete] Deleting directory C:\Servers\Jenkins\jobs\MyProject\workspace\build\pdepend
    [mkdir] Created dir: C:\Servers\Jenkins\jobs\MyProject\workspace\build\api
    [mkdir] Created dir: C:\Servers\Jenkins\jobs\MyProject\workspace\build\code-browser
    [mkdir] Created dir: C:\Servers\Jenkins\jobs\MyProject\workspace\build\coverage
    [mkdir] Created dir: C:\Servers\Jenkins\jobs\MyProject\workspace\build\logs
    [mkdir] Created dir: C:\Servers\Jenkins\jobs\MyProject\workspace\build\pdepend

parallelTasks:

pdepend:

phpcpd:

phpdoc:

phpcs:

phploc:

BUILD FAILED
C:\Servers\Jenkins\jobs\MyProject\workspace\build.xml:29: 
The following error occurred while executing this line:
C:\Servers\Jenkins\jobs\MyProject\workspace\build.xml:42: Execute failed: java.io.IOException: Cannot run program "pdepend": CreateProcess error=2, The system cannot find the file specified
The following error occurred while executing this line:
C:\Servers\Jenkins\jobs\MyProject\workspace\build.xml:62: Execute failed: java.io.IOException: Cannot run program "phpcpd": CreateProcess error=2, The system cannot find the file specified
The following error occurred while executing this line:
C:\Servers\Jenkins\jobs\MyProject\workspace\build.xml:80: Execute failed: java.io.IOException: Cannot run program "phpcs": CreateProcess error=2, The system cannot find the file specified
The following error occurred while executing this line:
C:\Servers\Jenkins\jobs\MyProject\workspace\build.xml:93: Execute failed: java.io.IOException: Cannot run program "phpdoc": CreateProcess error=2, The system cannot find the file specified
The following error occurred while executing this line:
C:\Servers\Jenkins\jobs\MyProject\workspace\build.xml:72: Execute failed: java.io.IOException: Cannot run program "phploc": CreateProcess error=2, The system cannot find the file specified

Total time: 0 seconds
Build step 'Invoke Ant' marked build as failure
[CHECKSTYLE] Skipping publisher since build result is FAILURE
[PMD] Skipping publisher since build result is FAILURE
[DRY] Skipping publisher since build result is FAILURE
[htmlpublisher] Archiving HTML reports...
[htmlpublisher] Archiving at PROJECT level C:\Servers\Jenkins\jobs\MyProject\workspace\build/code-browser to C:\Servers\Jenkins\jobs\MyProject\htmlreports\Code_Browser
ERROR: Directory 'C:\Servers\Jenkins\jobs\MyProject\workspace\build/code-browser' exists but failed copying to 'C:\Servers\Jenkins\jobs\MyProject\htmlreports\Code_Browser'.
Publishing Javadoc
[JDepend] JDepend plugin is ready
[JDepend] Couldn't generate JDepend file at 'build/logs/jdepend.xml'java.io.FileNotFoundException: C:\Servers\Jenkins\jobs\MyProject\workspace\build\logs\jdepend.xml (The system cannot find the file specified)
Sending e-mails to: test@localhost
Finished: FAILURE

Кто-нибудь может указать мне правильное направление, в чем проблема?

Ответы [ 2 ]

7 голосов
/ 21 июня 2011

Короткий ответ: крайне сложно настроить файл сборки в Windows таким образом, чтобы не нарушить ни выполнение, ни результаты, так или иначе. Это не проблема Дженкинса и не проблема муравья. Это инструменты QA. Если у вас есть шанс переместить Дженкинса в * nix, сделайте это.

В частности, при запуске PHP QA Tools обязательно вызывайте их с помощью cmd /c, например,

<target name="pdepend">
    <exec executable="cmd">
        <arg line="/c pdepend
            --jdepend-xml='${basedir}/build/logs/jdepend.xml'
            … additional options
            sourcefolder1,sourcefolder2
        " />
    </exec>
</target>

Также убедитесь, что у вас нет пробелов в любых путях, потому что они приведут к проблемам. Вы также не можете надежно использовать символ ~ (как в путях DOS), и каждый из инструментов PHP будет иметь свои собственные представления о разделителе каталогов и о том, принимают ли они несколько исходных папок в качестве значений, разделенных запятыми, и т. Д.

Не стесняйтесь сообщать о любых ошибках, с которыми вы сталкиваетесь, у различных владельцев инструментов на GitHub, поэтому они исправляются. Также подумайте о том, чтобы зайти в # jenkins-php на Freenode IRC .

Найдите пример конфигурации файла сборки, который работал для меня :

<?xml version="1.0" encoding="utf-8" ?> 
<project name="foo" default="build" basedir=".">

<target name="clean">
    <!-- Clean up -->
    <delete dir="${basedir}/build" />

    <!-- Create build directories -->
    <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" />
</target>

<!-- Run unit tests and generate junit.xml and clover.xml -->
<target name="phpunit">
    <exec executable="cmd">
        <arg line="/c phpunit '${basedir}/test'" />
    </exec>
</target>

<!-- Run the pdepend, phpmd, phpcpd, phpcs, phpdoc and phploc tasks in parallel 
    using a maximum of 2 threads. -->
<target name="parallelTasks">
    <parallel threadCount="1">
        <sequential>
            <antcall target="pdepend" />
            <antcall target="phpmd" />
        </sequential>
        <antcall target="phpcpd" />
        <antcall target="phpcs" />
        <antcall target="phpdoc" />
        <antcall target="phploc" />
    </parallel>
</target>

<!-- Generate jdepend.xml and software metrics charts -->
<target name="pdepend">
    <exec executable="cmd">
        <arg line="/c pdepend
            --jdepend-xml='${basedir}/build/logs/jdepend.xml'
            --jdepend-chart='${basedir}/build/pdepend/dependencies.svg'
            --summary-xml='${basedir}/build/logs/jdepend-summary.xml'
            --overview-pyramid='${basedir}/build/pdepend/overview-pyramid.svg'
            --ignore='${basedir}\lib\Zend\*'
            application,lib
            " />
    </exec>
</target>

<!-- Generate pmd.xml -->
<target name="phpmd">
    <exec executable="cmd">
        <arg line="/c phpmd application,lib
          xml
          codesize,design,naming,unusedcode
          --reportfile '${basedir}/build/logs/pmd.xml'
          --exclude '${basedir}\lib\Zend\*'
          " />
    </exec>
</target>

<!-- Generate pmd-cpd.xml -->
<target name="phpcpd">
    <exec executable="cmd">
        <arg line="/c phpcpd
            --log-pmd '${basedir}/build/logs/pmd-cpd.xml'
            --exclude '${basedir}/lib/Zend'
            application lib" />
    </exec>
</target>

<!-- Generate phploc.csv -->
<target name="phploc">
    <exec executable="cmd">
        <arg line="/c phploc
            --log-csv '${basedir}/build/logs/phploc.csv'
            --exclude '${basedir}/lib/Zend'
            application lib" />
    </exec>
</target>

<!-- Generate checkstyle.xml -->
<target name="phpcs">
    <exec executable="cmd">
        <arg line="/c phpcs
            --report=checkstyle
            --report-file='${basedir}/build/logs/checkstyle.xml'
            --standard='${basedir}/docs/coding-standard/ruleset.xml'
            --ignore=*\\lib\\Zend\\*
            -p
            application lib" />
    </exec>
</target>

<!-- Generate API documentation -->
<target name="phpdoc">
    <exec executable="cmd">
        <arg line="/c phpdoc
            --directory application lib
            --target    '${basedir}/build/api'
            --ignore    '${basedir}/lib/Zend/*'
           " />
    </exec>
</target>

<target name="phpcb">
    <exec executable="cmd">
        <arg line="/c phpcb
          --log    '${basedir}/build/logs'
          --output '${basedir}/build/code-browser'
          --ignore '${basedir}/lib/Zend'
          " />

    </exec>
</target>

<target name="build" depends="clean,parallelTasks,phpunit,phpcb" />
</project> 
6 голосов
/ 26 августа 2011

У меня была та же проблема с желанием запустить сборки Jenkins на Linux и Windows, и после некоторого осмотра я нашел решение, которое подходит для обоих: http://www.jguru.com/forums/view.jsp?EID=1560053

Используйте условный суффикс сценария для добавления к каждому из исполняемых сценариев:

<condition property="script-suffix" value=".bat" else="">
  <os family="windows" />
</condition>

Тогда ваши вызовы скрипта выглядят так:

<exec executable="phpmd${script-suffix}">
...
</exec>

для каждого исполняемого файла PHP. Это не так красиво, но у меня работает.

Так что мой build.xml выглядит следующим образом. Обратите внимание, что я изменил некоторые свойства php-шаблона, чтобы они соответствовали моему конкретному проекту (удаление, расположение файлов конфигурации и т. Д.), Что не является обязательным для нормы.

<?xml version="1.0" encoding="UTF-8"?>
<project name="Project" default="build" basedir=".">
 <!-- ... defined properties ... -->

 <condition property="script-suffix" value=".bat" else="">
   <os family="windows" />
 </condition>

 <target name="clean"
         description="Clean up and create artifact directories">
  <delete>
    <fileset dir="${basedir}/build/api" />
    <fileset dir="${basedir}/build/coverage"/>
    <fileset dir="${basedir}/build/logs"/>
    <fileset dir="${basedir}/build/pdepend"/>
  </delete>
  <delete dir="${basedir}/build/code-browser"/>
  <mkdir dir="${basedir}/build/code-browser"/>
 </target>

 <target name="phpunit"
         description="Run unit tests using PHPUnit and generates junit.xml and clover.xml">
  <exec executable="phpunit${script-suffix}" failonerror="true">
   <arg value="-c" />
   <arg path="${basedir}/build/phpunit.xml" />
   <arg value="-d" />
   <arg value="memory_limit=1024M" />
   <arg path="${source}" />
  </exec>
 </target>

 <target name="parallelTasks"
         description="Run the pdepend, phpmd, phpcpd, phpcs, phpdoc and phploc tasks in parallel using a maximum of 2 threads.">
  <parallel threadCount="2">
   <sequential>
    <antcall target="pdepend"/>
    <antcall target="phpmd"/>
   </sequential>
   <antcall target="phpcpd"/>
   <antcall target="phpcs"/>
   <antcall target="phpdoc"/>
   <antcall target="phploc"/>
  </parallel>
 </target>

 <target name="pdepend"
         description="Generate jdepend.xml and software metrics charts using PHP_Depend">
  <exec executable="pdepend${script-suffix}">
   <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="${source}" />
  </exec>
 </target>

 <target name="phpmd"
         description="Generate pmd.xml using PHPMD">
  <exec executable="phpmd${script-suffix}">
   <arg path="${source}" />
   <arg value="xml" />
   <arg value="${basedir}/build/phpmd.xml" />
   <arg value="--reportfile" />
   <arg value="${basedir}/build/logs/pmd.xml" />
  </exec>
 </target>

 <target name="phpcpd"
         description="Generate pmd-cpd.xml using PHPCPD">
  <exec executable="phpcpd${script-suffix}">
   <arg value="--log-pmd" />
   <arg value="${basedir}/build/logs/pmd-cpd.xml" />
   <arg path="${source}" />
  </exec>
 </target>

 <target name="phploc"
         description="Generate phploc.csv">
  <exec executable="phploc${script-suffix}">
   <arg value="--log-csv" />
   <arg value="${basedir}/build/logs/phploc.csv" />
   <arg path="${source}" />
  </exec>
 </target>

 <target name="phpcs"
         description="Generate checkstyle.xml using PHP_CodeSniffer">
  <exec executable="phpcs${script-suffix}">
   <arg value="--report=checkstyle" />
   <arg value="--report-file=${basedir}/build/logs/checkstyle.xml" />
   <arg value="--standard=${basedir}/build/phpcs.xml" />
   <arg path="${source}" />
  </exec>
 </target>

 <target name="phpdoc"
         description="Generate API documentation using PHPDocumentor">
  <exec executable="phpdoc${script-suffix}">
   <arg value="-c" />
   <arg path="${basedir}/build/phpdoc.ini" />
  </exec>
 </target>

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

 <target name="build" depends="clean,parallelTasks,phpunit,phpcb"/>

 <!-- ... other targets ... -->
</project>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...