質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Jenkins

Jenkinsとは、Apache TomcatなどのServletで動作しているサーバーベースシステムです。Jenkinsはオープンソースであり、LInux,Mac OS X,Windows,Solaris,FreeBSDとOpenBSDのためのパッケージがあります。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

PHPUnit

PHPUnitは、PHP向けのユニット・テスト向けフレームワークで、手動では手間のかかるテスト作業を自動化し、繰り返し実行することが可能です。

Q&A

解決済

2回答

4347閲覧

Jenkinsでcomposerインストールせずにphpmdを使いたい

siroron

総合スコア12

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Jenkins

Jenkinsとは、Apache TomcatなどのServletで動作しているサーバーベースシステムです。Jenkinsはオープンソースであり、LInux,Mac OS X,Windows,Solaris,FreeBSDとOpenBSDのためのパッケージがあります。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

PHPUnit

PHPUnitは、PHP向けのユニット・テスト向けフレームワークで、手動では手間のかかるテスト作業を自動化し、繰り返し実行することが可能です。

3グッド

1クリップ

投稿2016/08/31 07:37

###Jenkinsでcomposerインストールせずにphpmdを使いたい

centOS7環境でJenkinsを中心にCI環境を作ろうとしています。
ジョブを作成しビルドするとJenkinsのワークスペース配下に設置した
phingのbuild.xmlが連動しphpunitが動くようになりましたが
phpmdらのインスペクターライブラリが動きません。

直接実行ファイルを取得、権限付与して
動かしているのが原因だと思います。

念のためcomposerインストールすると動きましたが、
今回composer.jsonがプロジェクトの都合で使えません

ここに質問したいことを詳細に書いてください
composerインストールせずにphpmdをインストールしjenkins(phing)と連動させる方法を教えて下さい。

###発生している問題・エラーメッセージ

ユーザーuser userが実行 ビルドします。 ワークスペース: /var/lib/jenkins/workspace/phing looking for '/var/lib/jenkins/workspace/phing/build.xml' ... '/var/lib/jenkins/workspace/phing' をワーキングディレクトリとして使用します。 [phing] $ phing -buildfile /var/lib/jenkins/workspace/phing/build.xml -logger phing.listener.DefaultLogger Buildfile: /var/lib/jenkins/workspace/phing/build.xml jenkins_phing > prepare: [echo] 初期設定 [delete] Deleting directory /var/lib/jenkins/workspace/phing/build [mkdir] Created dir: /var/lib/jenkins/workspace/phing/build jenkins_phing > phpunit: [phpunit] Total tests run: 4, Failures: 1, Errors: 0, Incomplete: 0, Skipped: 0, Time elapsed: 0.00973 s jenkins_phing > phpmd: BUILD FAILED /var/lib/jenkins/workspace/phing/build.xml:36:24: /var/lib/jenkins/workspace/phing/build.xml:36:24: PHPMDTask depends on PHPMD being installed and on include_path or listed in pharLocation. Total time: 0.2116 seconds Build step 'Phingの呼び出し' marked build as failure テスト結果を保存中 Finished: FAILURE

###該当のソースコード

ファイル構成 vagrant:/var/lib/jenkins/workspace/phing $ ll 合計 4.0K drwxr-xr-x 2 jenkins jenkins 6 8月 31 15:55 build/ -rw-r--r-- 1 jenkins jenkins 3.5K 8月 31 15:44 build.xml drwxr-xr-x 2 jenkins jenkins 24 8月 31 15:55 reports/ drwxr-xr-x 2 jenkins jenkins 129 8月 31 15:22 tests/ vagrant:/var/lib/jenkins/workspace/phing $ pwd /var/lib/jenkins/workspace/phing
build.xml <?xml version="1.0" encoding="UTF-8"?> <!-- jenkins実行時 引数がない場合はdefaultの"build"が実行される --> <project name="jenkins_phing" default="build"> <!-- 変数設定 --> <property name="outputDir" value="./reports/" override="false"/> <!-- 初期設定 --> <target name="prepare"> <echo msg="初期設定"/> <mkdir dir="./build"/> </target> <!-- 設定 phpunit --> <target name="phpunit"> <phpunit haltonfailure="false" printsummary="true" pharlocation="/usr/local/bin/phpunit"> <!-- 結果をXMLでunitreport.xmlとして出力 --> <formatter todir="${outputDir}" type="xml" outfile="phpunit.xml"/> <batchtest> <!-- 対象ディレクトリをtests下に設定 --> <fileset dir="tests"> <!-- 対象ファイルの設定 --> <include name="**/*TEST.php"/> <!-- vendorsディレクトリ下を対象外にする --> <exclude name="vendors/"/> </fileset> </batchtest> </phpunit> </target> <!-- 設定 phpmd --> <target name="phpmd"> <!-- 設定 ルール --> <phpmd rulesets="codesize,controversial,design,naming,unusedcode"> <!-- 結果をXMLでphpmd.xmlとして出力 --> <formatter type="xml" outfile="${outputDir}/phpmd.xml"/> <!-- 対象ディレクトリをtests下に設定 --> <fileset dir="tests"> <!-- phpファイルのみを対象にする --> <include name="**/*.php"/> <!-- vendorsディレクトリ下を対象外にする --> <exclude name="vendors/"/> </fileset> </phpmd> </target> <!-- 設定 phpcpd --> <target name="phpcpd"> <phpcpd> <fileset dir="tests"> <!-- phpファイルのみを対象にする --> <include name="**/*.php"/> <!-- vendorsディレクトリ下を対象外にする --> <exclude name="vendors/"/> </fileset> <formatter type="pmd" outfile="${outputDir}/phpcpd.xml"/> </phpcpd> </target> <!-- 設定 build --> <target name="build" depends="prepare, phpunit, phpmd, phpcpd"/> </project>
composer.json経由ではなく直接インストールした方法 yum -y --enablerepo=remi,remi-php56 install httpd php php-common # 実行ファイル取得 wget -O phing https://www.phing.info/get/phing-latest.phar wget -O phpunit https://phar.phpunit.de/phpunit.phar wget -O phpmd http://static.phpmd.org/php/latest/phpmd.phar wget -O phpcs https://squizlabs.github.io/PHP_CodeSniffer/phpcs.phar wget -O php-cs-fixer https://github.com/FriendsOfPHP/PHP-CS-Fixer/releases/download/v1.12.0/php-cs-fixer.phar wget -O phpcpd https://phar.phpunit.de/phpcpd-2.0.4.phar # 実行権限付与 sudo chmod +x phing sudo chmod +x phpunit sudo chmod +x phpmd sudo chmod +x phpcs sudo chmod +x php-cs-fixer sudo chmod +x phpcpd # パスを通す sudo mv phing /usr/local/bin/phing sudo mv phpunit /usr/local/bin/phpunit sudo mv phpmd /usr/local/bin/phpmd sudo mv phpcs /usr/local/bin/phpcs sudo mv php-cs-fixer /usr/local/bin/php-cs-fixer sudo mv phpcpd /usr/local/bin/phpcpd # Jenkins連動の為のシンボリックリンク sudo ln -s /usr/local/bin/phing /usr/bin/phing # バージョン確認 phing -v phpunit --version phpmd --version phpcs --version php-cs-fixer --version phpcpd --version

###試したこと
<phpmd pharlocation="/usr/local/bin/phpmd" rulesets="${phpmdRulesets}" >
と変更したところ下記のようになりました。

vagrant:~/phing $ phing Buildfile: /home/vagrant/phing/build.xml jenkins_phing > prepare: [echo] 初期設定 [delete] Deleting directory /home/vagrant/phing/build [mkdir] Created dir: /home/vagrant/phing/build jenkins_phing > phpunit: [phpunit] Total tests run: 4, Failures: 1, Errors: 0, Incomplete: 0, Skipped: 0, Time elapsed: 0.00389 s jenkins_phing > phpmd: [PHP Error] include_once(phar:///usr/local/bin/phpmd/vendor/autoload.php): failed to open stream: phar error: invalid url or non-existent phar "phar:///usr/local/bin/phpmd/vendor/autoload.php" [line 233 of phar:///usr/local/bin/phing/classes/phing/tasks/ext/phpmd/PHPMDTask.php] [PHP Error] include_once(): Failed opening 'phar:///usr/local/bin/phpmd/vendor/autoload.php' for inclusion (include_path='phar:///usr/local/bin/phing/bin/../classes:.:/usr/share/pear:/usr/share/php') [line 233 of phar:///usr/local/bin/phing/classes/phing/tasks/ext/phpmd/PHPMDTask.php] BUILD FAILED /home/vagrant/phing/build.xml:36:37: /home/vagrant/phing/build.xml:36:37: PHPMDTask depends on PHPMD being installed and on include_path or listed in pharLocation. Total time: 0.2010 seconds

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

webappskurojp, chrokurojp, ikuwow👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

こちらのページを参考にする事で解決したので報告します。

http://jenkins-php.org/automation.html

参考にbuild.xmlを追記しておきます。
exec executableの時は記述が変わるのが
最初気付けませんでした。

<?xml version="1.0" encoding="UTF-8"?> <!-- phing実行時に引数がない場合はdefaultの"build"が実行される --> <project name="jenkins_phing" default="build"> <!-- 変数設定 --> <property name="targetDir" value="./tests/" override="false"/> <property name="outputDir" value="./reports/" override="false"/> <property name="phpmdRulesets" value="codesize,controversial,design,naming,unusedcode" override="false"/> <!-- 初期設定 --> <target name="prepare"> <echo msg="初期設定"/> <delete dir="./reports"/> <mkdir dir="./reports"/> </target> <target name="phpunit" description="テスト結果の推移"> <phpunit haltonfailure="false" printsummary="true" pharlocation="/usr/local/bin/phpunit"> <batchtest> <!-- 対象ディレクトリをtests下に設定 --> <fileset dir="${targetDir}"> <!-- 対象ファイルの設定 --> <include name="**/*TEST.php"/> </fileset> </batchtest> <!-- 結果をXMLでphpunit.xmlとして出力 --> <formatter type="xml" outfile="${outputDir}/phpunit.xml"/> </phpunit> </target> <target name="phpmd" description="PMD警告の推移"> <exec executable="/usr/local/bin/phpmd"> <!-- 対象ディレクトリをtests下に設定 --> <arg path="tests"/> <arg value="xml"/> <!-- ルールの設定 --> <arg value="codesize,controversial,design,naming,unusedcode"/> <arg value="--reportfile"/> <!-- 結果をXMLでpmd.xmlとして出力 --> <arg value="${outputDir}/pmd.xml"/> </exec> </target> <!-- 設定 build --> <target name="build" depends="prepare, phpunit, phpmd"/> </project>

投稿2016/09/08 11:41

siroron

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

追記の追記

1点気づいた事があるので報告します。phar:// ストリームラッパーから
アーカイブ内のファイルを利用する場合、どうもアーカイブに拡張子.pharがないと
それをpharアーカイブであると判断できないようです。

php

1// /var/www/html/hoge/にphpmd.pharとphpmdのふたつを配置(中身はまったく同じ) 2 3// 拡張子.pharあり。問題なし 4include "phar://phpmd.phar/vendor/autoload.php"; 5include "phar:///var/www/html/hoge/phpmd.phar/vendor/autoload.php"; 6 7// 拡張子.pharなし。failed to open stream: phar error: invalid url or non-existent phar 8include "phar://phpmd/vendor/autoload.php"; 9include "phar:///var/www/html/hoge/phpmd/vendor/autoload.php"; 10

Vagrant + CentOS6.7 + PHP7、Windows7 + PHP5.6の2環境で試しましたが結果は同じでした。
Phingを通しても実行してみました。
PHPMDタスクのpharLocationにphpmd.pharを指定した場合は無事に処理が完了、
pharLocationがphpmdの時はsiroronさんが提示されているものと同じエラーが発生しました。

改めてPhingのクラスを確認したところ、PHPMDTaskにはphar:// ストリームラッパーを通して
アーカイブ内のファイルを参照する処理があり、PHPUnitTaskにはありませんでした。

PHPUnitTask
https://github.com/phingofficial/phing/blob/master/classes/phing/tasks/ext/phpunit/PHPUnitTask.php

PHPMDTask
https://github.com/phingofficial/phing/blob/master/classes/phing/tasks/ext/phpmd/PHPMDTask.php#L233

追記

以下の内容は間違えています。pharファイルへのアクセスを絶対パスで記述する場合
phar:///とスラッシュ3つで問題ありません。失礼しました。


[PHP Error] include_once(phar:///usr/local/bin/phpmd/vendor/autoload.php): failed to open stream: phar error: invalid url or non-existent phar "phar:///usr/local/bin/phpmd/vendor/autoload.php" [line 233 of phar:///usr/local/bin/phing/classes/phing/tasks/ext/phpmd/PHPMDTask.php]

このあたりのログからするとphpmd.pharアーカイブ内のautoload.phpのインクルードに
失敗しているみたいですが、なんかphar:///とスラッシュが3つになってますね。。。
メッセージにあるphing/tasks/ext/phpmd/PHPMDTask.phpの233行目前後の内容は以下のとおりでした。

php

1if (!empty($this->pharLocation)) { 2 include_once 'phar://' . $this->pharLocation . '/vendor/autoload.php'; 3}

https://github.com/phingofficial/phing/blob/master/classes/phing/tasks/ext/phpmd/PHPMDTask.php#L233

やはりpharlocationの値が絶対パスだとそうなるみたいです(バグっぽい?)
ちょっと気持ち悪いですが、頭のスラッシュを外してみたら何か変化があるかもです。

<phpmd pharlocation="/usr/local/bin/phpmd" rulesets="${phpmdRulesets}" > //before <phpmd pharlocation="usr/local/bin/phpmd" rulesets="${phpmdRulesets}" > //after

投稿2016/09/01 07:04

編集2016/09/02 08:19
nnssn

総合スコア1221

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nnssn

2016/09/01 07:07

あ、勘違いしてました。絶対パスならスラッシュ3つでいいのかorz
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問