- Dockerエクゼキュータを使ったPHPプロジェクトのテスト
- Shell Executor を使用した PHP プロジェクトのテスト
- テストの拡張
- 非公開パッケージあるいは依存パッケージへのアクセス
- データベースやその他のサービスの使用
- ローカルでのテスト
- プロジェクトの例
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 では、まずキャッシュを更新し、phpunit
とphp5-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 によって変更が選択され、ジョブが開始されます。