PHP 프로젝트 테스트

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

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

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

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

PHP 앱을 어떤 시스템에서도 테스트할 수 있지만, 개발자가 수동으로 설정해야 할 수도 있습니다. 이를 극복하기 위해 공식 PHP Docker 이미지를 사용합니다. 이 이미지는 Docker Hub에서 찾을 수 있습니다.

이를 통해 다른 버전의 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 구성

사용자가 .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 프로젝트 테스트

셸 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에 푸시하여 테스트를 시작하세요!

다양한 PHP 버전에서 Shell 빌드를 테스트합니다

phpenv 프로젝트를 사용하면 각각의 구성을 가진 다양한 PHP 버전을 쉽게 관리할 수 있습니다. 이는 Shell 실행기로 PHP 프로젝트를 테스트할 때 특히 유용합니다.

gitlab-runner 사용자의 빌드 머신에 상위 스트림 설치 안내를 따라 설치해야 합니다.

또한, phpenv를 사용하면 PHP 환경을 쉽게 구성할 수도 있습니다:

phpenv config-add my_config.ini

중요 사항: phpenv/phpenv폐기된 것으로 보입니다. madumlao/phpenv에는 프로젝트를 다시 살리려는 노력이 있습니다. 또한, CHH/phpenv도 좋은 대안으로 보입니다. 언급된 도구 중 하나를 선택하는 것은 이 튜토리얼의 범위를 벗어납니다.*

사용자 정의 확장 설치

PHP 환경의 기본 설치이므로 빌드 머신에 현재 없는 몇 가지 확장이 필요할 수 있습니다.

추가적인 확장을 설치하려면 다음을 실행하세요:

pecl install <확장명>

.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/ 디렉토리가 귀하의 git 저장소에 커밋되어 있다면 아래를 사용하지 마십시오.
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 '설치 프로그램 확인됨'; } else { echo '설치 프로그램이 손상됨'; 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를 사용하는 경우 서비스를 정의하여 이 기능을 활용할 수 있습니다.

이 기능은 CI 서비스 설명서에서 다루고 있습니다.

로컬로 테스트

GitLab Runner 1.0에서는 로컬로 모든 변경사항을 테스트할 수 있습니다. 터미널에서 다음을 실행하세요:

# 도커 실행기 사용 확인
gitlab-runner exec docker test:app

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

예제 프로젝트

예제 PHP 프로젝트를 설정하여 편리하게 사용할 수 있습니다. 이 프로젝트는 GitLab.com에서 공개용 실행기를 사용하여 실행됩니다.

원하는대로 사용하실 수 있습니다. 포크를 만들고 변경 내용을 커밋하고 푸시하세요. 잠시 후 공개 실행기에서 변경 사항이 감지되고 작업이 시작됩니다.