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 이미지를 지정하세요. (런너 용어에서 이미지가 무엇을 의미하는지 자세히 알아보려면 Docker 이미지 사용 를 읽어보세요.)

.gitlab-ci.yml에 이미지를 추가하는 것으로 시작하세요:

image: php:5.6

공식 이미지들은 훌륭하지만, 테스트에 필요한 몇 가지 유용한 도구가 누락되어 있습니다. 먼저, 빌드 환경을 준비해야 합니다. 이를 극복하는 방법은 실제 테스트 전에 모든 사전 요구 사항을 설치하는 스크립트를 작성하는 것입니다.

리포지토리의 루트 디렉토리에 다음 내용을 포함하는 ci/docker_install.sh 파일을 만들어 봅시다:

#!/bin/bash

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

set -xe

# composer에서 필요한 git을 설치해야 합니다. (php 이미지에는 git이 없음)
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 구성

가끔은 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에서 먼저 캐시를 업데이트한 다음 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 사용자 아래에서 upstream 설치 가이드에 따라 이를 설치해야 합니다.

또한 phpenv를 사용하면 다음과 같이 PHP 환경을 쉽게 구성할 수 있습니다:

phpenv config-add my_config.ini

중요한 노트: phpenv/phpenv가 더 이상 유지되지 않은 것으로 보입니다. madumlao/phpenv의 fork가 프로젝트를 다시 살리기 위해 노력하고 있습니다. CHH/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/ 디렉터리에 저장합니다.
# 만약 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

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

예제 프로젝트

편리하게 사용할 수 있도록 예제 PHP 프로젝트를 설정해 두었습니다. 이 프로젝트는 GitLab.com에서 운영되며 저희의 공개적으로 사용 가능한 인스턴스 실행기를 사용합니다.

변경하고 싶으신가요? 포크하고, 커밋하고, 변경사항을 푸시하세요. 잠시 후, 공개 실행기에서 변경사항이 선택되어 작업이 시작됩니다.