- Docker executorを使ったPHPプロジェクトのテスト
- Shell executor を使用した PHP プロジェクトのテスト
- テストの拡張
- 非公開パッケージや依存関係へのアクセス
- データベースやその他のサービスの利用
- ローカルでのテスト
- プロジェクト例
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 では、まずキャッシュを更新し、次に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
に追加することはお勧めしません。 このコマンドは、ビルド環境をセットアップするためだけに一度だけ実行してください。
テストの拡張
アトゥームの使用
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プロジェクトの例を用意しました。
ハックしたいのであれば、フォークしてコミットし、変更をプッシュするだけです。 数瞬のうちに公開ランナーによって変更が選択され、ジョブが開始されます。