PHPプロジェクトのテスト

このガイドでは、PHPプロジェクトの基本的な構築方法を説明します。

Dockerのexecutorを使う場合と、Shellのexecutorを使う場合です。

Docker executorを使ったPHPプロジェクトのテスト

どのようなシステムでもPHPアプリをテストすることは可能ですが、開発者が手作業で設定する必要があります。 これを解決するために、Docker Hubにある公式のPHP Dockerイメージを使用します。

これにより、異なるバージョンの PHP に対して PHP プロジェクトをテストすることができるようになります。 しかし、すべてがプラグアンドプレイで実行できるわけではなく、 いくつかの設定を手動で行う必要があります。

すべてのジョブと同様に、ビルド環境を記述する有効な.gitlab-ci.yml を作成する必要があります。

まず、ジョブ処理に使用するPHPイメージを指定しましょう(イメージの意味については、Runnerの用語集「Using Docker images」を読んでください)。

まずは.gitlab-ci.ymlに画像を追加します:

image: php:5.6

公式イメージは素晴らしいのですが、テストに役立つツールがいくつか欠けています。 まずビルド環境を準備する必要があります。 これを克服する方法は、実際のテストが行われる前に、すべての前提条件をインストールするスクリプトを作成することです。

リポジトリのルートディレクトリに、以下の内容でci/docker_install.sh

#!/bin/bash

# We need to install dependencies only for Docker
[[ ! -e /.dockerenv ]] && exit 0

set -xe

# Install git (the php image doesn't have it) which is required by composer
apt-get update -yqq
apt-get install git -yqq

# Install phpunit, the tool that we will use for testing
curl --location --output /usr/local/bin/phpunit https://phar.phpunit.de/phpunit.phar
chmod +x /usr/local/bin/phpunit

# Install mysql driver
# Here you can install any other extension that you need
docker-php-ext-install pdo_mysql

docker-php-ext-install って何だろうと思うかもしれません。 簡単に説明すると、PHP の公式 Docker イメージで提供されているスクリプトで、これを使うと簡単に拡張モジュールをインストールすることができます。 詳しくはhttps://hub.docker.com/_/phpのドキュメントを読んでください。

ビルド環境の前提条件をすべて含むスクリプトを作成したので、.gitlab-ci.ymlに追加してみましょう:

...

before_script:
  - bash ci/docker_install.sh > /dev/null

...

最後のステップでは、phpunitを使用して実際のテストを実行します:

...

test:app:
  script:
    - phpunit --configuration phpunit_myapp.xml

...

最後にファイルをコミットして GitLab にプッシュし、ビルドの成功 (あるいは失敗) を確認します。

最終的な.gitlab-ci.yml はこのようになります:

# Select image from https://hub.docker.com/_/php
image: php:5.6

before_script:
# Install dependencies
  - bash ci/docker_install.sh > /dev/null

test:app:
  script:
    - phpunit --configuration phpunit_myapp.xml

Dockerビルドでの異なるPHPバージョンに対するテスト

複数のバージョンのPHPに対するテストはとても簡単です。 異なるバージョンのDockerイメージで別のジョブを追加するだけで、あとはrunnerがやってくれます:

before_script:
# Install dependencies
  - bash ci/docker_install.sh > /dev/null

# We test PHP5.6
test:5.6:
  image: php:5.6
  script:
    - phpunit --configuration phpunit_myapp.xml

# We test PHP7.0 (good luck with that)
test:7.0:
  image: php:7.0
  script:
    - phpunit --configuration phpunit_myapp.xml

DockerビルドにおけるカスタムPHP設定

PHP環境をカスタマイズするために、.ini ファイルを/usr/local/etc/php/conf.d/に置く必要があるかもしれません。 そのために、before_script アクションを追加します:

before_script:
  - cp my_php.ini /usr/local/etc/php/conf.d/test.ini

もちろん、リポジトリのルートディレクトリにmy_php.ini が存在する必要があります。

Shell executor を使用した PHP プロジェクトのテスト

shell executor はサーバー上のターミナルセッションでジョブを実行します。 したがって、プロジェクトをテストするためには、まずすべての依存関係がインストールされていることを確認する必要があります。

例えば、Debian 8 が稼働している VM では、まずキャッシュを更新し、次にphpunitphp5-mysqlをインストールします:

sudo apt-get update -y
sudo apt-get install -y phpunit php5-mysql

次に、次のスニペットを.gitlab-ci.ymlに追加します:

test:app:
  script:
    - phpunit --configuration phpunit_myapp.xml

最後に GitLab にプッシュし、テストを開始します!

Shellビルドで異なるバージョンのPHPをテストします。

phpenvプロジェクトを使用すると、異なるバージョンの PHP をそれぞれ独自の設定で簡単に管理することができます。 これは、PHP プロジェクトを Shell executor でテストする場合に特に便利です。

アップストリームインストールガイドに従ってgitlab-runnerユーザでビルドマシンにインストールする必要があります。

phpenvを使用すると、PHP環境を簡単に設定することもできます:

phpenv config-add my_config.ini

重要な注意: phpenv/phpenv放棄されたようです。madumlao/phpenvにフォークがあり、プロジェクトを復活させようとしています。CHH/phpenvも良い代替のようです。 上記のツールのどれを選んでも、基本的な phpenv コマンドで動作します。 正しい phpenv を選ぶためのガイドは、このチュートリアルの範囲外です。

カスタム拡張機能のインストール

これはPHP環境の完全なインストールなので、ビルドマシンには現在存在しない拡張モジュールが必要になるかもしれません。

追加エクステンションをインストールするには

pecl install <extension>

このコマンドを.gitlab-ci.ymlに追加することはお勧めしません。 このコマンドは、ビルド環境をセットアップするためだけに一度だけ実行してください。

テストの拡張

アトゥームの使用

PHPUnit のかわりに、他のツールを使ってユニットテストを実行することもできます。 たとえばatoumを使うこともできます:

before_script:
  - wget http://downloads.atoum.org/nightly/mageekguy.atoum.phar

test:atoum:
  script:
    - php mageekguy.atoum.phar

Composerの使い方

PHP プロジェクトの大半は、PHP パッケージの管理に Composer を使用しています。 テストを実行する前に Composer を実行するには、.gitlab-ci.ymlに以下を追加するだけです:

...

# Composer stores all downloaded packages in the vendor/ directory.
# Do not use the following if the vendor/ directory is committed to
# your git repository.
cache:
  paths:
    - vendor/

before_script:
# Install composer dependencies
  - wget https://composer.github.io/installer.sig -O - -q | tr -d '\n' > installer.sig
  - php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
  - php -r "if (hash_file('SHA384', 'composer-setup.php') === file_get_contents('installer.sig')) { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
  - php composer-setup.php
  - php -r "unlink('composer-setup.php'); unlink('installer.sig');"
  - php composer.phar install

...

非公開パッケージや依存関係へのアクセス

テストスイートが秘密リポジトリにアクセスする必要がある場合、それをクローンできるように SSHキーを設定する必要があります。

データベースやその他のサービスの利用

ほとんどの場合、テストを実行するためには実行中のデータベースが必要です。 Docker executorを使用している場合は、他のコンテナにリンクするDockerの機能を活用することができます。 GitLab Runnerでは、service.

この機能はCIサービスのドキュメントでカバーされています。

ローカルでのテスト

GitLab Runner 1.0 を使えば、ローカルで変更をテストすることもできます。 ターミナルから以下を実行してください:

# Check using docker executor
gitlab-runner exec docker test:app

# Check using shell executor
gitlab-runner exec shell test:app

プロジェクト例

GitLab.comで公開されている共有ランナーを使ったPHPプロジェクトの例を用意しました。

ハックしたいのであれば、フォークしてコミットし、変更をプッシュするだけです。 数瞬のうちに公開ランナーによって変更が選択され、ジョブが開始されます。