PHP 프로젝트 테스트하기
PHP 프로젝트 테스트하기
PHP 프로젝트를 GitLab CI/CD로 테스트하는 기본적인 방법을 소개할게요. 이 예제는 Docker executor와 Shell executor 두 가지 실행 환경을 각각 다룹니다. 공식 PHP Docker 이미지를 쓰면 시스템에 관계없이 일관된 환경에서, 원하는 PHP 버전으로 테스트할 수 있어요.
출처: 문서
본문
- Tier: Free, Premium, Ultimate
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
이 기본적인 지침으로 GitLab CI/CD에서 PHP 프로젝트를 빌드해 보세요.
두 가지 테스트 시나리오를 다룹니다. Docker executor 사용과 Shell executor 사용이에요.
Docker executor로 PHP 프로젝트 테스트
PHP 앱을 어떤 시스템에서든 테스트할 수는 있지만, 그러려면 개발자가 수동으로 구성해야 해요. Docker Hub에 있는 공식 PHP Docker 이미지를 사용하면 이 문제를 해결할 수 있습니다.
이를 통해 다양한 PHP 버전으로 PHP 프로젝트를 테스트할 수 있어요. 다만 여전히 몇 가지는 수동으로 구성해야 합니다.
모든 job과 마찬가지로 빌드 환경을 설명하는 유효한 .gitlab-ci.yml을 만들어야 해요.
먼저 job 프로세스에 사용할 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에 push해 빌드가 성공(또는 실패)하는지 확인하세요.
최종 .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 이미지 버전을 가진 job을 하나 더 추가하세요. 나머지는 러너가 처리합니다.
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 구성
PHP 환경을 커스터마이즈하려면 .ini 파일을 before_script 동작으로 /usr/local/etc/php/conf.d/에 복사하세요. .ini 파일(이 예제에서는 my_php.ini)은 저장소의 루트 디렉터리에 있어야 합니다.
before_script:
- cp my_php.ini /usr/local/etc/php/conf.d/test.ini
Shell executor로 PHP 프로젝트 테스트
Shell executor는 서버의 터미널 세션에서 job을 실행해요. 프로젝트를 테스트하려면 먼저 모든 의존성이 설치되어 있어야 합니다.
예를 들어 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에 push하면 테스트가 시작됩니다!
Shell 빌드에서 여러 PHP 버전 테스트
phpenv 프로젝트는 각각 고유한 구성으로 여러 PHP 버전을 관리할 수 있게 해 줍니다. Shell executor로 PHP 프로젝트를 테스트할 때 phpenv를 사용하세요.
빌드 머신의 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에서 공개 인스턴스 러너를 사용해 실행되는 Example PHP Project가 있어요.
이걸 직접 뜯어보고 싶다면 포크해서 커밋하고 변경 사항을 push해 보세요. 몇 분 안에 공개 러너가 그 변경을 받아 job이 시작됩니다.
더 알아보기 (Learn more)
Docker executor에서 서비스를 연결해 데이터베이스를 사용하는 방법은 CI 서비스 문서를, SSH 키로 프라이빗 저장소를 클론하는 방법은 SSH 키 문서를 참고하세요. Docker 이미지 선택에 대한 기본은 Docker 이미지 사용에서 확인할 수 있어요.