PHP 프로젝트 테스트

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

이 가이드는 PHP 프로젝트에 대한 기본 빌드 지침을 다룹니다.

두 가지 테스트 시나리오가 다루어집니다: Docker executor를 사용하는 방법과
Shell executor를 사용하는 방법입니다.

Docker executor를 사용하여 PHP 프로젝트 테스트

어떤 시스템에서도 PHP 앱을 테스트할 수 있지만, 개발자의 수동 구성이 필요합니다.
이 문제를 해결하기 위해, Docker Hub에서 찾을 수 있는 공식 PHP Docker 이미지를 사용합니다.

이 이미지를 사용하면 다양한 PHP 버전에 대한 PHP 프로젝트를 테스트할 수 있습니다.
하지만 모든 것이 즉시 작동하는 것은 아니며, 여전히 몇 가지를 수동으로 구성해야 합니다.

모든 작업과 마찬가지로, 빌드 환경을 설명하는 유효한 .gitlab-ci.yml 파일을 생성해야 합니다.

먼저 작업 프로세스에 사용되는 PHP 이미지를 지정해 보겠습니다.
(이미지가 무엇인지에 대한 자세한 내용은 Using Docker images를 읽어보세요.)

.gitlab-ci.yml에 이미지를 추가하는 것부터 시작합니다:

image: php:5.6

공식 이미지는 훌륭하지만, 테스트에 유용한 몇 가지 도구가 부족합니다.
먼저 빌드 환경을 준비해야 합니다. 이를 극복하는 방법은 실제 테스트 전에 모든 필수 조건을 설치하는 스크립트를 만드는 것입니다.

저희의 리포지토리 루트 디렉터리에 다음 내용을 포함한 ci/docker_install.sh 파일을 생성해 보겠습니다:

#!/bin/bash

# Docker 전용으로 종속성을 설치해야 합니다
[[ ! -e /.dockerenv ]] && exit 0

set -xe

# composer에 필요한 git(php 이미지에는 없음)을 설치합니다
apt-get update -yqq
apt-get install git -yqq

# 테스트에 사용할 도구 phpunit 설치
curl --location --output /usr/local/bin/phpunit "https://phar.phpunit.de/phpunit.phar"
chmod +x /usr/local/bin/phpunit

# mysql 드라이버 설치
# 필요한 다른 확장을 설치할 수 있습니다
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:
  # https://hub.docker.com/_/php에서 이미지 선택
  image: php:5.6
  before_script:
    # 종속성 설치
    - bash ci/docker_install.sh > /dev/null

test:app:
  script:
    - phpunit --configuration phpunit_myapp.xml

Docker 빌드에서 다양한 PHP 버전 테스트

다양한 PHP 버전에 대한 테스트는 매우 쉽습니다. 다른 Docker 이미지 버전으로 또 다른 작업을 추가하기만 하면, 러너가 나머지를 처리합니다:

default:
  before_script:
    # 종속성 설치
    - bash ci/docker_install.sh > /dev/null

# PHP5.6를 테스트합니다
test:5.6:
  image: php:5.6
  script:
    - phpunit --configuration phpunit_myapp.xml

# PHP7.0을 테스트합니다 (행운을 빕니다)
test:7.0:
  image: php:7.0
  script:
    - phpunit --configuration phpunit_myapp.xml

Docker 빌드에서의 맞춤 PHP 구성

때때로, /usr/local/etc/php/conf.d/.ini 파일을 넣어 PHP 환경을 사용자 정의해야 할 때가 있습니다. 이를 위해 before_script 액션을 추가하세요:

before_script:
  - cp my_php.ini /usr/local/etc/php/conf.d/test.ini

물론, my_php.ini는 레포지토리의 루트 디렉터리에 있어야 합니다.

Shell 실행기를 사용한 PHP 프로젝트 테스트

Shell 실행기는 서버의 터미널 세션에서 작업을 실행합니다. 프로젝트를 테스트하려면 먼저 모든 종속성이 설치되어 있는지 확인해야 합니다.

예를 들어, 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 실행기로 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는 모든 다운로드된 패키지를 vendor/ 디렉터리에 저장합니다.
# git 레포지토리에 vendor/ 디렉터리가 커밋된 경우 다음을 사용하지 마세요.
default:
  cache:
    paths:
      - vendor/
  before_script:
    # Composer 의존성 설치
    - 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 실행기를 사용하는 경우, Docker를 활용하여 다른 컨테이너에 링크할 수 있습니다.

GitLab Runner를 사용하면 service를 정의하여 이 기능을 구현할 수 있습니다.

이 기능은 CI 서비스 문서에 포함되어 있습니다.

로컬에서 테스트하기

GitLab Runner 1.0을 사용하면 변경 사항을 로컬에서 테스트할 수도 있습니다.

터미널에서 다음을 실행하세요:

# Docker 실행기를 사용하여 확인
gitlab-runner exec docker test:app

# Shell 실행기를 사용하여 확인
gitlab-runner exec shell test:app

예제 프로젝트

편의를 위해 예제 PHP 프로젝트를 설정해 두었습니다.

이 프로젝트는 GitLab.com에서 공개적으로 사용 가능한 인스턴스 러너를 사용하여 실행됩니다.

해킹하고 싶으세요? 포크하고, 커밋하고, 변경 사항을 푸시하세요.

잠시 후, 변경 사항이 공용 러너에 의해 감지되고 작업이 시작됩니다.