Wordpressプラグイン開発 ＋ GitLab CI 〜テスト編〜

Advent Calendar11日目です！
自分のメモを兼ねて記事にしました。
手探りでしたので、間違っている箇所等あれば、ご指摘いただけるとありがたいです :sweat:

# 目次
1. [やりたい事](# 1. やりたい事)
2. [必要なやつ](# 2. 必要なやつ)
3. [ローカル環境でテストする](# 3. ローカル環境でテストする)
4. [GitLab CI環境でテストする](# 4. GitLab CI環境でテストする)

# 1. やりたい事
ワードプレスのプラグイン開発をGitLab CIでテスト・デプロイを自動化したい。
今回は、「GitLab CIでテストしてみる」までの内容を記事にしたいと思います。

# 2. 必要なやつ
- [GitLab CI](https://about.gitlab.com/)
- [Wordpress](https://ja.wordpress.org/)
- [composer](https://weblabo.oscasierra.net/php-composer-1/)
- [phpunit](https://ja.wikipedia.org/wiki/PHPUnit)（WordpressにはPHPUnit5.x〜7.xしか対応してないらしい...）
- [wp-cli](https://wp-cli.org/ja/)（なくてもいいけど、参考の記事がほぼ使ってました）

# 3. ローカル環境（MAMP）でテストする

## 必要なもののインストール

#### ① wp-cliのインストール
参考：[https://qiita.com/IK12_info/items/4a9190119be2a0f347a0](https://qiita.com/IK12_info/items/4a9190119be2a0f347a0)

```
# wp-cli.phar ファイルをダウンロード
$ curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar

# 動く確認
$ php wp-cli.phar --info

# 実行権限をつける
chmod +x wp-cli.phar

# path通す（wp 〜 でコマンド打てる）
sudo mv wp-cli.phar /usr/local/bin/wp

# インストールできてるかバージョンの確認
$ wp cli version
```
下記表示されればOKです。

```
WP-CLI 2.4.0
```
wp-cliを使う際は、操作したいWordPressのフォルダまで移動するか、フォルダ改装を指定する必要があります。



#### ② composerのインストール

```
$ brew update

# composerのインストール
$ brew install composer

# インストールできてるかバージョンの確認
$ composer -V
```
下記表示されればOKです。

```
Composer version 2.0.7 2020-11-13 17:31:06
```




#### ③ phpunitのインストール　← インストールするバージョンに気を付ける :imp:
参考：[https://phpunit.de/getting-started/phpunit-7.html](https://phpunit.de/getting-started/phpunit-7.html)

バージョンを指定してインストールします。

```
# 開発環境ようにバージョン7.xインストール
$ composer require --dev phpunit/phpunit ^7

# バージョンの確認（インストールされたやつここにいた）
$ ./vendor/phpunit/phpunit/phpunit --version
```

```
# phpunitで実行できるようにする
$ alias phpunit="./vendor/phpunit/phpunit/phpunit"

$ phpunit --version
```


色々エラー解決して、やっと動くと思ったら、最後の最後に
>Error: Looks like you're using PHPUnit 9.4.4. WordPress requires at least PHPUnit 5.4 and is currently only compatible with PHPUnit up to 7.x.
Please use the latest PHPUnit version from the 7.x branch.

5.4〜7.xのバージョンにしか対応してませんって出たので、結構ショックでした。バージョンを指定してインストールするのをお勧めします:metal_tone2:

バージョンを指定せずインストールすると、最新バージョンをインストールしてくれます。

```
$ composer require --dev phpunit/phpunit
```

下記表示されればOKです。

```
PHPUnit 7.5.20 by Sebastian Bergmann and contributors.
```

#### ④ テストの雛形作成(WordPressの）　← これでも苦戦

```
# プラグインがある場所まで移動
$ cd /Applications/MAMP/htdocs/wp/wp-content/plugins/your-plugin-name/

$ wp scaffold plugin-tests your-plugin-name
```
下記表示されたら以下のようなフォルダが作られます。

```
Success: Created test files.
```
↓できたフォルダたち↓

```
tests
　|-　bootstrap.php
　|-　test-sample.php
bin
　|-　install-wp-tests.sh
```

``bin/install-wp-tests.sh`` ファイルを実行します。
テスト用のWordPressを勝手にインストールしてくれ、DBまで用意してくれます。


```
# ファイルの実行
$ bash bin/install-wp-tests.sh plugin_test root root localhost latest
```

>$ bash bin/install-wp-tests.sh DB_NAME DB_USER DB_PASS PORT VERSION
>
>※ DB_NAMEには、テストで使用したいDB名を指定する。既にあるDB名を指定してしまうとエラー出るので、気を付ける。

自分の場合、「xcode入れて!」と言われたり、DBはできてるのに、ちゃんと必要なファイルがインストールされてなくて、エラー吐いたりしてました。
必要なファイルがちゃんとインストールできてなかった場合は、``rm -rf /テスト用Wordpressまでのパス/wordpress-tests-lib``で消して、もう一回上記のファイル実行しましょう！
　

## テスト実行

```
$ ./vendor/phpunit/phpunit/phpunit
# または
$ phpunit
```
既に入っている、`tests/` 内のテストが走ります。
うまくいけばテストが実行できるはずです！！

# 4. GitLab CI環境でテストする
## 準備する
参考：[https://docs.gitlab.com/ee/ci/quick_start/README.html](https://docs.gitlab.com/ee/ci/quick_start/README.html)
#### ① GitLab Runner のインストール
設定 -> CI / CD -> Runner 展開 -> 特定のRunner -> specificのRunnerのマニュアルセットアップ を見るとインストールの流れが書いてあります。
下記からインストール方法を選べます。

**インストール方法：[https://docs.gitlab.com/runner/install/](https://docs.gitlab.com/runner/install/)**

#### ② ymlファイルの作成
.gitlab-ci.ymlを作成します。
参考：[https://qiita.com/yurano/items/a7804d987ccff37b1a9d](https://qiita.com/yurano/items/a7804d987ccff37b1a9d)
https://gitlab-docs.creationline.com/ee/ci/yaml/

```.gitlab-ci.yml
# image: ビルドジョブを実行する環境となるDockerイメージ（今回は指定しない）

stages: # 実行する順番を指定
  - test
  - deploy

# before_script:
    # 全てのジョブの前に実行するスクリプト
    # 今回は指定してない

test_job:
  stage: test  # どのステージの時に実行するか
  before_script:
    # test_jobのジョブの前に実行されるスクリプト
    # composerインストール
    - brew update
    - brew install composer
    - composer -V
    # phpunitのインストール
    - cd freedom-btn
    - composer require --dev phpunit/phpunit ^7
    - vendor/phpunit/phpunit/phpunit --version
  script:
    - echo "start test!!"
    # テスト実行
    - vendor/phpunit/phpunit/phpunit --color
```
#### ③ 必要ファイルをGitLabにプッシュ
下記ファイル、フォルダたちをプッシュします。

```
- .gitlab-ci.yml（ルートに置く）
- tests/
```

ymlファイルがプッシュされた時点でテストが走ります。
それ以降、何かプッシュする毎にテストが実行されて、成功とか失敗とか出てくれます。

うまくいかない方は、自分も**「ローカルで動き、リモートで動かないのは、大体環境が整ってないからよ！」**と教えていただいたので、テストに必要そうなファイルやフォルダが抜けていないか確認してみてください:pray_tone2: