2016-04-05 83 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

就是這樣。 :)

相關問題