PHPプロジェクトのテスト

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

Docker Executor を使用する場合と Shell Executor を使用する場合の 2 つのテストシナリオについて説明します。

Dockerエクゼキュータを使った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 イメージで提供されているスクリプトで、これを使えば簡単に拡張モジュールをインストールすることができます。詳しくはドキュメントを読んでください。

ビルド環境の前提条件をすべて含むスクリプトを作成したので、.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 は、こんな感じになるはずです:

default:
  # 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がやってくれます:

default:
  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設定

.ini ファイルを/usr/local/etc/php/conf.d/ に置くことで、PHP環境をカスタマイズする必要がある場合があります。そのためには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 に追加することはお勧めしません。 このコマンドは、ビルド環境をセットアップするためだけに一度だけ実行してください。

テストの拡張

テストの拡張atoum

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

test:atoum:
  before_script:
    - wget http://downloads.atoum.org/nightly/mageekguy.atoum.phar
  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.
default:
  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上で公開されている共有 Runner を使って実行するPHP プロジェクトの例を用意しました。

ハックしたいですか?フォークしてコミットし、変更をプッシュします。わずかな時間で公開 Runner によって変更が選択され、ジョブが開始されます。