BEAR.Sundayのモジュールを実装・CI・公開する


TL;DR

記事のゴール

FirebaseをBEAR.Sundayで利用するためのモジュールを実装・公開する

既存のパッケージがあった…

内容としてはまさにこれが欲しかったんだけど、3年前からメンテされていないようで使われているFirebaseのライブラリも現在主流のものとは異なっている様子。

こういうときどうしたらいいんだろう…
依存しているライブラリまでガッツリ変えちゃうようなPRを送る?
別ライブラリとして実装する?

とりあえず今回はさくっとcomposerでインストールして使いたかったので別ライブラリとして実装する。

追記

既存のライブラリをForkしてガッツリ内容を変えたPRを提出して

  • マージされるまではcomposer.jsonのrepositoryにForkして実装したGitHubを使う
  • リジェクトされたら別ライブラリとしてpackagistにsubmitする
  • マージされたらcomposer require

でよかったのかも?

参考:
packagistを使わないcomposerのgitリポジトリの作成
https://getcomposer.org/doc/05-repositories.md#vcs

実装

上記のスケルトンを利用してプロジェクトを作成する
CIやら静的(動的)解析ツールやらの設定が色々同梱されているので最低限のことは全部やってくれる。
PSR-12とは設定がずれている部分があったので、気になる人は下記を参考にして下さい。

.php_cs.dist
-'return_type_declaration' => ['space_before' => 'one'],
+'return_type_declaration' => ['space_before' => 'none'],

テスト

$ composer test  // phpunit
$ composer tests // php-cs-fixer & phpcs & phpmd & phpstan & phpunit

どちらもエラーが出なくなったらGitHubにcommit & push

README.mdの作成

上記を参考にREADMEを作る

バッジを設定する

こういうやつ↓

参考:
https://qiita.com/dtan4/items/13b0ea9edf5b99926446

Travis CI

設定ファイル(.travis.yml)がスケルトンに入っているのでCIとしての設定はほとんど必要なし。
ただし今回はNightlyバージョンのPHPは必要ないので設定から削る

.travis.yml
 php:
 - 7.1
 - 7.2
 - 7.3
- - nightly

 ...

 jobs:
 ...
   allow_failures:
-   - php: nightly

画像の赤枠部分をクリックすることでバッジのコードを取得できる。

このままだとLowest dependenciesにエラーが出ているようなので修正が必要

Lowest dependencies?

通常与えられた条件の最新のバージョンがインストールされます。テストは最新の依存だけをテストすることになり。^や~で指定した最低のバージョンのテストは行われません。

これが問題になるのは、他のパッケージが特定のパッケージの低いバージョンのものに依存していて、また他のパッケージではその高いバージョンのみにある機能を使用している場合です。依存解決は低いバージョンで行われ、最新バージョンに依存したパッケージはエラーを引き起こしたりBugの元になったりします。

参考:
Composerで低いバージョンの依存テスト

エラーが出ないよう修正する

> vendor/bin/phpunit
PHPUnit 7.5.0 by Sebastian Bergmann and contributors.

EEEEE                                                               5 / 5 (100%)

Time: 43 ms, Memory: 4.00MB

There were 5 errors:

1) Piotzkhider\FirebaseModule\FirebaseModuleTest::testModule
Error: Class 'PhpParser\ParserFactory' not found

/PhpStormProjects/Ray.FirebaseModule/vendor/ray/aop/src/ParserFactory.php:13
/PhpStormProjects/Ray.FirebaseModule/vendor/ray/aop/src/Compiler.php:35
/PhpStormProjects/Ray.FirebaseModule/vendor/ray/di/src/Injector.php:32
...

phpstan-shimに存在しているこの問題のよう。
issueによるとbootstrap.phpでこの問題は解決しているようなので、bootstrap.phpが存在するバージョンを最低バージョンに指定する。

参考:
http://blog.a-way-out.net/blog/2015/06/19/composer-version-tilde-and-caret/

composer.json
    "require-dev": {
        "phpunit/phpunit": "^7.5",
        "squizlabs/php_codesniffer": "^3.2",
        "friendsofphp/php-cs-fixer": "^2.12",
        "phpmd/phpmd": "^2.6",
-        "phpstan/phpstan-shim": "^0.10"
+        "phpstan/phpstan-shim": "^0.10.2"
    },
> vendor/bin/phpunit
PHPUnit 7.5.0 by Sebastian Bergmann and contributors.

EEEEE                                                               5 / 5 (100%)

Time: 109 ms, Memory: 12.00MB

There were 5 errors:

1) Piotzkhider\FirebaseModule\FirebaseModuleTest::testModule
Error: Class 'Google\Cloud\Core\ServiceBuilder' not found

/Users/ysato/PhpStormProjects/Ray.FirebaseModule/vendor/kreait/firebase-php/src/Firebase/Factory.php:370
/Users/ysato/PhpStormProjects/Ray.FirebaseModule/vendor/kreait/firebase-php/src/Firebase/Factory.php:344
/Users/ysato/PhpStormProjects/Ray.FirebaseModule/vendor/kreait/firebase-php/src/Firebase/Factory.php:165
...

1つ目のエラーは解消されたが、また別のエラーが発生しているよう。
こちらも前回のエラーと同様に、低いバージョンでは必要となるファイルが存在していないことが問題になっているので、存在するバージョンを指定する。

composer.json
    "require": {
        "php": ">=7.1.0",
        "ray/di": "^2.9",
        "kreait/firebase-php": "^4.30",
+        "google/cloud-core": "^1.19"
    },
> vendor/bin/phpunit
PHPUnit 7.5.0 by Sebastian Bergmann and contributors.

.....                                                               5 / 5 (100%)

Time: 123 ms, Memory: 16.00MB

無事ローカルでのエラーも消え、Travis CIでのエラーがなくなりました!

scrutinizer

こちらも設定ファイル(.scrutinizer.yml)がスケルトンに入っているのでCIとしての設定は特に必要なし
画像の赤枠内の各バッジをクリックすることでバッジのコードを取得できる。

coverageがNot enabled

スケルトンの設定でTravis CIで出力されたカバレッジがscrutinizerに送られているが、設定がデグレしているようなので修正。

.travis.yml
    script:
-    - ./vendor/bin/phpunit -v --coverage-clover ./build/logs/clover.xml
+    - ./vendor/bin/phpunit -v --coverage-clover=coverage.clover
    after_script:
    - wget https://scrutinizer-ci.com/ocular.phar && php ocular.phar code-coverage:upload --format=php-clover coverage.clover;

ついでにPRも出しておきます

全て正常に表示されました!

Packagistで公開

Submit Packageしておしまい!

と思ったのですが、タグをつけてあげないとdev-masterになってしまうため、minimum-stability:devでないとインストールすることができなくなるようです。
(ブランチ名でもバージョン制御をしてくれるようですが、そちらもdev扱いになってしまいます)
1.0.0としてタグを登録します。

$ git tag 1.0.0 [revision-number]
$ git push origin 1.0.0

参考:
https://getcomposer.org/doc/articles/versions.md#tags
git tagの使い方まとめ