2016-04-05 55 views
1

我正在开发一个项目,并希望为它使用Jenkins。这个配置应该通过简单build.xml完成了fiew目标:如何让Jenkins使用来自COMPOSER_HOME/bin的二进制文件?

<?xml version="1.0" encoding="UTF-8"?> 
<project name="MyProject" default="full-build"> 
    <property name="phpcs" value="phpcs"/> 
    <property name="phpdox" value="phpdox"/> 
    <target name="full-build" depends="lint, phpdox" description="Performs static analysis, runs the tests, and generates project documentation"/> 
    <target name="lint" description="Perform syntax check of sourcecode files"> 
     <apply executable="php" taskname="lint" failonerror="true"> 
      <arg value="-l" /> 
      <fileset dir="${basedir}/module/"> 
       <include name="**/*.php" /> 
      </fileset> 
      <fileset dir="${basedir}/phpunit/tests"> 
       <include name="**/*.php" /> 
      </fileset> 
     </apply> 
    </target> 
    <target name="phpdox" description="Generate project documentation using phpDox"> 
     <exec executable="${phpdox}" dir="${basedir}/ci/phpdox" taskname="phpdox"/> 
    </target> 
</project> 

的PHP林特(php -l)工作完美的作品:

控制台输出

Started by user anonymous 
Building in workspace D:\Data\myproject 
> git.exe rev-parse --is-inside-work-tree # timeout=10 
Fetching changes from the remote Git repository 
> git.exe config remote.origin.url https://github.com/MyAccount/MyProject.git # timeout=10 
Fetching upstream changes from https://github.com/MyAccount/MyProject.git 
> git.exe --version # timeout=10 
using .gitcredentials to set credentials 
> git.exe config --local credential.username myusername # timeout=10 
> git.exe config --local credential.helper store --file=\"C:\Windows\TEMP\git8298647783094567497.credentials\" # timeout=10 
Setting http proxy: my.proxy.tld:8080 
> git.exe -c core.askpass=true fetch --tags --progress https://github.com/MyAccount/MyProject.git +refs/heads/*:refs/remotes/origin/* 
> git.exe config --local --remove-section credential # timeout=10 
> git.exe rev-parse "refs/remotes/origin/master^{commit}" # timeout=10 
> git.exe rev-parse "refs/remotes/origin/origin/master^{commit}" # timeout=10 
Checking out Revision 54af2180160f47d518c42f58f56cba175ca2ee39 (refs/remotes/origin/master) 
> git.exe config core.sparsecheckout # timeout=10 
> git.exe checkout -f 54af2180160f47d518c42f58f56cba175ca2ee39 
> git.exe rev-list 54af2180160f47d518c42f58f56cba175ca2ee39 # timeout=10 
[myproject] $ cmd.exe /C '"ant.bat && exit %%ERRORLEVEL%%"' 
Buildfile: D:\Data\myproject\build.xml 

lint: 
    [lint] No syntax errors detected in D:\Data\myproject\module\Application\Module.php 
    ... 
    [lint] No syntax errors detected in D:\Data\myproject\phpunit\tests\Application\DummyTest.php 

但执行PHPDox失败:

phpdox: 

BUILD FAILED 
D:\Data\myproject\build.xml:18: Execute failed: java.io.IOException: Cannot run program "phpdox" (in directory "D:\Data\myproject\ci\phpdox"): CreateProcess error=2, The system cannot find the file specified 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048) 
    at java.lang.Runtime.exec(Runtime.java:620) 
    at org.apache.tools.ant.taskdefs.launcher.Java13CommandLauncher.exec(Java13CommandLauncher.java:58) 
    at org.apache.tools.ant.taskdefs.Execute.launch(Execute.java:428) 
    at org.apache.tools.ant.taskdefs.Execute.execute(Execute.java:442) 
    at org.apache.tools.ant.taskdefs.ExecTask.runExecute(ExecTask.java:629) 
    at org.apache.tools.ant.taskdefs.ExecTask.runExec(ExecTask.java:670) 
    at org.apache.tools.ant.taskdefs.ExecTask.execute(ExecTask.java:496) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:293) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.Target.execute(Target.java:435) 
    at org.apache.tools.ant.Target.performTasks(Target.java:456) 
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1405) 
    at org.apache.tools.ant.Project.executeTarget(Project.java:1376) 
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) 
    at org.apache.tools.ant.Project.executeTargets(Project.java:1260) 
    at org.apache.tools.ant.Main.runBuild(Main.java:853) 
    at org.apache.tools.ant.Main.startAnt(Main.java:235) 
    at org.apache.tools.ant.launch.Launcher.run(Launcher.java:285) 
    at org.apache.tools.ant.launch.Launcher.main(Launcher.java:112) 
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified 
    at java.lang.ProcessImpl.create(Native Method) 
    at java.lang.ProcessImpl.<init>(ProcessImpl.java:386) 
    at java.lang.ProcessImpl.start(ProcessImpl.java:137) 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029) 
    ... 24 more 

Total time: 8 seconds 
Build step 'Invoke Ant' marked build as failure 
Finished: FAILURE 

我与其他Composer软件包相同的问题,安装globally并从COMPOSER_HOME/bin(例如PHP_Codesniffer)。

我试图以另一种方式定义命令(如<exec executable="cmd"><arg line="/c phpdox ..." /></exec>),但它也不起作用。

直接执行build.xmlant的作品。

Composer的环境变量设置正确 - 我可以通过CLI调用工具(CMD或GitBash/MinGW)。所以这个问题一定是其他原因造成的。它会是什么?

如何让Jenkins使用通过Composer全局安装的软件包?

回答

0

的Linux(在我的情况的Ubuntu 14.04服务器)

设置在詹金斯配置环境变量(Manage Jenkins -> Configure System -> Global properties -> Environment variablesname=PATH, value=$PATH:$COMPOSER_HOME/vendor/bin/)解决了这个问题。

enter image description here

$ echo $COMPOSER_HOME 
/usr/share/.composer 

注意的是,应该$COMPOSER_HOME /可以不被设置为一(root)用户的子文件夹中(例如/root/.composer),因为它可能会导致permission issues

Execute failed: java.io.IOException: Cannot run program "phpcs": error=13, Permission denied


的Windows(在我的情况的Windows Server 2008 R2)

此外作曲家路径是需要一些进一步的步骤都/的设置:

的我第一次得到了错误

Execute failed: java.io.IOException: Cannot run program "phpcs": error=2, The system cannot find file specified

在一个论坛上,我看,那个目标需要得到可执行文件的路径,像这样:

<target name="phpcs"> 
    <exec executable="C:\path\to\Composer\vendor\bin\phpcs" taskname="phpcs"> 
     <arg value="--standard=PSR2" /> 
     <arg value="--extensions=php" /> 
     <arg value="--ignore=autoload.php" /> 
     <arg path="${basedir}/module/" /> 
    </exec> 
</target> 

但它没有工作,不仅会导致下一个错误:

D:\path\to\build.xml:34: Execute failed: java.io.IOException: Cannot run program "C:\path\to\Composer\vendor\bin\phpcs": CreateProcess error=193, %1 is not a valid Win32 application

这不是Jenkins,而是Ant问题。原因和解决方案都在Ant docu page for Exec描述:

Windows Users

The <exec> task delegates to Runtime.exec which in turn apparently calls ::CreateProcess . It is the latter Win32 function that defines the exact semantics of the call. In particular, if you do not put a file extension on the executable, only ".EXE" files are looked for, not ".COM", ".CMD" or other file types listed in the environment variable PATHEXT. That is only used by the shell.

Note that .bat files cannot in general by executed directly. One normally needs to execute the command shell executable cmd using the /c switch.

...

所以在我的情况下,工作目标规格如下所示:

<target name="phpcs"> 
    <exec executable="cmd" taskname="phpcs"> 
     <arg value="/c" /> 
     <arg value="C:\path\to\Composer\vendor\bin\phpcs" /> 
     <arg value="--standard=PSR2" /> 
     <arg value="--extensions=php" /> 
     <arg value="--ignore=autoload.php" /> 
     <arg path="${basedir}/module/" /> 
    </exec> 
</target> 

从现在开始构建被通过。但仍有一个问题与phpcs

phpcs: 
    [phpcs] 'php' is not recognized as an internal or external command, 
    [phpcs] operable program or batch file. 
    [phpcs] Result: 1 

这是很容易在詹金斯(Manage Jenkins -> Configure System -> Global properties -> Environment variables)加入PHPPath环境变量固定的:

enter image description here

就是这样。 :)

相关问题