正式なドキュメントは英語版であり、この日本語訳はAI支援翻訳により作成された参考用のものです。日本語訳の一部の内容は人間によるレビューがまだ行われていないため、翻訳のタイミングにより英語版との間に差異が生じることがあります。最新かつ正確な情報については、英語版をご参照ください。

PHPプロジェクトのテスト

  • プラン: Free、Premium、Ultimate
  • 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated

このガイドでは、PHPプロジェクトの基本的なビルド手順について説明します。

ここでは、Docker executorとShell executorを使用する2つのテストシナリオについて説明します。

Docker executorを使用してPHPプロジェクトをテストする

PHPアプリケーションはどのシステムでもテストできますが、デベロッパーによる手動設定が必要です。これを克服するために、Docker Hubにある公式のPHP Dockerイメージを使用します。

これにより、さまざまなバージョンのPHPに対してPHPプロジェクトをテストできます。ただし、すべてがプラグアンドプレイできるわけではなく、一部を手動で設定する必要があります。

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

まず、ジョブプロセスに使用されるPHPイメージを指定しましょう。(イメージの意味の詳細については、Runnerの専門用語を読んで、Dockerイメージの使用を参照してください)。

まず、イメージを.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のさまざまなバージョンを管理できます。これは、Shell executorでPHPプロジェクトをテストする場合に特に役立ちます。

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

phpenvを使用すると、PHP環境を次のように設定することもできます:

phpenv config-add my_config.ini

Important note(重要な注意): phpenv/phpenv廃止されたようです。プロジェクトを復活させようとしているmadumlao/phpenvにフォークがあります。CHH/phpenvも優れた代替手段のようです。言及されているツールのいずれかを選択すると、基本的なphpenvコマンドで動作します。適切なphpenvを選択するためのガイダンスは、このチュートリアルのスコープ外です。*

カスタム拡張機能をインストールする

これはPHP環境のかなりむき出しのインストールであるため、ビルドマシンに現在存在しない拡張機能が必要になる場合があります。

追加の拡張機能をインストールするには、次を実行します:

pecl install <extension>

これを.gitlab-ci.ymlに追加することはお勧めしません。このコマンドは、ビルド環境をセットアップするためだけに、1回実行する必要があります。

テストを拡張する

atoumを使用する

PHPUnitの代わりに、他のツールを使用して単体テストを実行できます。たとえば、atoumを使用できます:

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

Composerの使用

ほとんどのPHPプロジェクトは、Composerを使用してPHPパッケージを管理しています。テストを実行する前に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サービスドキュメントで説明されています。

プロジェクト例

便宜上、公開されているインスタンスRunnerを使用してGitLab.comで実行されるPHPプロジェクトの例を設定しました。

ハッキングしてみませんか?フォークし、コミットして、変更をプッシュします。数分以内に、変更がパブリックRunnerによって選択され、ジョブが開始されます。