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

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

ただいまの
回答率

89.06%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 2,701

siroron

score 12

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  831 15:55 build/
-rw-r--r-- 1 jenkins jenkins 3.5K  831 15:44 build.xml
drwxr-xr-x 2 jenkins jenkins   24  831 15:55 reports/
drwxr-xr-x 2 jenkins jenkins  129  831 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/ツール等のバージョンなど)

より詳細な情報

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

+1

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

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>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

 追記の追記

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

// /var/www/html/hoge/にphpmd.pharとphpmdのふたつを配置(中身はまったく同じ)

// 拡張子.pharあり。問題なし
include "phar://phpmd.phar/vendor/autoload.php";
include "phar:///var/www/html/hoge/phpmd.phar/vendor/autoload.php";

// 拡張子.pharなし。failed to open stream: phar error: invalid url or non-existent phar
include "phar://phpmd/vendor/autoload.php";
include "phar:///var/www/html/hoge/phpmd/vendor/autoload.php";

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行目前後の内容は以下のとおりでした。

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


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 16:07

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

    キャンセル

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

  • ただいまの回答率 89.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る