PHP 프로젝트 테스트
Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
이 가이드는 PHP 프로젝트에 대한 기본 빌드 지침을 다룹니다. 두 가지 테스트 시나리오를 다룹니다: Docker executor 사용과 Shell executor 사용. PHP 앱을 모든 시스템에서 테스트할 수 있지만 개발자의 수동 구성이 필요합니다.
이 가이드는 PHP 프로젝트에 대한 기본 빌드 지침을 다룹니다.
두 가지 테스트 시나리오를 다룹니다: Docker executor 사용과 Shell executor 사용.
Docker executor를 사용한 PHP 프로젝트 테스트#
PHP 앱을 모든 시스템에서 테스트할 수 있지만 개발자의 수동 구성이 필요합니다. Docker Hub에 있는 공식 PHP Docker 이미지를 사용하여 이를 극복할 수 있습니다.
이를 통해 다양한 버전의 PHP에 대해 PHP 프로젝트를 테스트할 수 있습니다. 그러나 일부 사항은 여전히 수동으로 구성해야 합니다.
모든 잡과 마찬가지로 빌드 환경을 설명하는 유효한 .gitlab-ci.yml을 만들어야 합니다.
먼저 잡 프로세스에 사용할 PHP 이미지를 지정합니다. (러너 용어로 이미지가 무엇을 의미하는지 Docker 이미지 사용에서 더 읽을 수 있습니다.)
.gitlab-ci.yml에 이미지를 추가하는 것으로 시작합니다:
image: php:5.6
공식 이미지는 훌륭하지만 일부 테스트 도구가 부족합니다. 먼저 빌드 환경을 준비해야 합니다. 이를 위해 실제 테스트가 시작되기 전에 모든 사전 요구사항을 설치하는 스크립트를 만듭니다.
리포지터리의 루트 디렉토리에 다음 내용으로 ci/docker_install.sh 파일을 만듭니다:
#!/bin/bash
# You 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 you 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 이미지 버전을 가진 다른 잡을 추가하기만 하면 러너가 나머지를 처리합니다:
default:
before_script:
# Install dependencies
- bash ci/docker_install.sh > /dev/null
# Test PHP5.6
test:5.6:
image: php:5.6
script:
- phpunit --configuration phpunit_myapp.xml
# 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 버전을 관리할 수 있습니다. 이는 Shell executor로 PHP 프로젝트를 테스트할 때 특히 유용합니다.
업스트림 설치 가이드에 따라 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.com에서 실행되는 PHP 예시 프로젝트가 있습니다.
직접 수정해보고 싶으신가요? 포크하고 커밋하고 변경 사항을 푸시하면 됩니다. 잠시 후 변경 사항이 공용 러너에 의해 선택되고 잡이 시작됩니다.
