📚 PHP 최상급 - 4주차: CI/CD (지속적 통합/지속적 배포) 파이프라인 구축- 03 PHP 프로젝트를 위한 CI/CD 파이프라인 설계 및 구현

2025. 10. 15. 14:14프로그램/PHP 최상급

#PHP애플리케이션 을 위한 CI/CD 파이프라인 설계 개요

📚 PHP 최상급 - 4주차: CI/CD (지속적 통합/지속적 배포) 파이프라인 구축- 03 PHP 프로젝트를 위한 CI/CD 파이프라인 설계 및 구현


지난 시간에는 #CI/CD 의 개념과 주요 도구(GitLab CI/CD, GitHub Actions)에 대해 학습했습니다. 이제 이론을 바탕으로 실제 #PHP애플리케이션 에 적용 가능한 CI/CD 파이프라인을 설계하고 구현하는 구체적인 방법을 알아보겠습니다. 이 과정은 개발된 코드를 안정적으로 빌드하고, 테스트하며, 최종적으로 운영 환경에 배포하는 일련의 자동화 단계를 포함합니다.

우리가 목표로 하는 #CI/CD파이프라인 은 다음과 같은 주요 단계를 거치게 됩니다.

  1. 코드 커밋(Code Commit): 개발자가 Git 저장소에 코드를 푸시합니다
  2. 빌드(Build): #Composer 의존성을 설치하고, #Docker이미지 를 빌드합니다
  3. 테스트(Test): 단위 테스트, 정적 분석(Linter), 코드 스타일 검사 등을 수행합니다
  4. 배포(Deploy): 테스트를 통과한 #Docker이미지 를 컨테이너 레지스트리에 푸시하고, 운영 서버에 배포합니다

이러한 파이프라인을 통해 #PHP개발 팀은 더 빠르고 안정적인 소프트웨어 릴리스를 달성할 수 있습니다.


1. #CI/CD 파이프라인 설계 단계


1.1 Git 저장소 및 브랜칭 전략

가장 먼저 #CI/CD 의 트리거가 될 Git 저장소와 효과적인 브랜칭 전략을 수립해야 합니다.

  • 중앙 저장소: GitHub, GitLab, Bitbucket 등
  • 브랜칭 전략: Git Flow, GitHub Flow 등 프로젝트 규모와 팀의 특성에 맞는 전략을 선택합니다. 일반적으로 Pull Request(Merge Request)가 생성되거나 main 브랜치에 코드가 병합될 때 #CI/CD 가 트리거되도록 설정합니다.

1.2 #Docker 기반 환경 구축

#Docker 는 #CI/CD 파이프라인의 핵심입니다. 빌드와 배포의 일관성을 보장합니다.

  • #Dockerfile: #PHP애플리케이션 을 위한 최적화된 #Dockerfile 을 작성하여, 필요한 #PHP버전 , 확장, 라이브러리, 의존성 등을 정의합니다.
  • #DockerCompose: 개발 환경을 위해 웹 서버(Nginx/Apache), #PHP-FPM, 데이터베이스(MySQL) 등을 #DockerCompose 로 정의하여 일관된 개발 환경을 제공합니다. 이는 CI/CD 과정에서도 테스트 환경을 구축하는 데 활용될 수 있습니다.

1.3 테스트 전략 수립

자동화된 테스트는 #CI/CD 의 신뢰성을 확보하는 가장 중요한 요소입니다.

  • 단위 테스트(Unit Test): PHPUnit 등을 사용하여 각 함수나 클래스의 동작을 개별적으로 검증합니다.
  • 정적 분석(Static Analysis): #PHPStan, #Psalm, PHP CS Fixer 등을 사용하여 잠재적인 버그나 코드 스타일 위반을 빌드 단계에서 미리 감지합니다.
  • 통합 테스트(Integration Test): 여러 컴포넌트 간의 상호작용을 검증합니다.

2. #CI/CD 파이프라인 구현 예시 (GitHub Actions)


이제 앞에서 설계한 내용을 바탕으로 GitHub Actions를 사용하여 #PHP애플리케이션 을 위한 #CI/CD파이프라인 을 구현해 보겠습니다. 다음은 .github/workflows/main.yml 파일의 예시입니다.

YAML
 
name: PHP CI/CD Pipeline

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  build_test:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v3

    - name: Setup PHP
      uses: shivammathur/setup-php@v2
      with:
        php-version: '8.3' # 사용할 PHP 버전
        extensions: pdo_mysql, zip, gd # 필요한 PHP 확장
        ini-values: post_max_size=256M, upload_max_filesize=256M
        tools: composer # Composer 설치 포함

    - name: Get Composer Cache Directory
      id: composer-cache
      run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT

    - name: Cache Composer dependencies
      uses: actions/cache@v3
      with:
        path: ${{ steps.composer-cache.outputs.dir }}
        key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
        restore-keys: ${{ runner.os }}-composer-

    - name: Install Composer dependencies
      run: composer install --no-dev --prefer-dist

    - name: Run PHPUnit tests
      run: vendor/bin/phpunit --configuration phpunit.xml

    - name: Run PHPStan (Static Analysis)
      run: vendor/bin/phpstan analyse src --level max

    - name: Build Docker Image
      run: docker build -t your-docker-registry/your-app:${{ github.sha }} .

    - name: Push Docker Image to Registry (e.g., Docker Hub)
      if: github.ref == 'refs/heads/main' # main 브랜치에 푸시될 때만 실행
      run: |
        echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
        docker push your-docker-registry/your-app:${{ github.sha }}

  deploy:
    needs: build_test # build_test Job이 성공해야 실행
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main' # main 브랜치에 푸시될 때만 실행

    steps:
    - name: Deploy to Production Server via SSH
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.SSH_HOST }}
        username: ${{ secrets.SSH_USERNAME }}
        key: ${{ secrets.SSH_PRIVATE_KEY }}
        script: |
          # 서버에 접속하여 최신 Docker 이미지 pull 및 컨테이너 재시작
          docker pull your-docker-registry/your-app:${{ github.sha }}
          docker stop your-app-container || true
          docker rm your-app-container || true
          docker run -d --name your-app-container -p 80:80 your-docker-registry/your-app:${{ github.sha }}
          # 필요한 경우 데이터베이스 마이그레이션 등 실행
          # docker exec your-app-container php artisan migrate --force

💡 GitHub Actions Secret 관리

위 예시에서 secrets.DOCKER_PASSWORD, secrets.DOCKER_USERNAME, secrets.SSH_HOST 등은 GitHub 저장소의 Settings -> Secrets -> Actions에서 설정해야 하는 민감한 정보들입니다. 절대로 코드에 직접 노출해서는 안 됩니다.


결론


이로써 우리는 #PHP애플리케이션 을 위한 #CI/CD파이프라인 의 설계부터 GitHub Actions를 활용한 구현까지 살펴보았습니다. 이 파이프라인은 코드가 푸시되는 순간부터 빌드, 테스트, 배포에 이르는 모든 과정을 자동화하여 개발 생산성을 극대화하고 서비스의 안정성을 보장합니다. 이제 개발자는 더욱 빠르게 혁신하고, 사용자에게 더 나은 경험을 제공하는 데 집중할 수 있습니다.

 

 

무료체험, 끊김없이 빠른VPN VPN, 국내 다량IP, 모바일가능, 본사 품질관리 신뢰할 수 있는 보안성 높은 VPN 서비스

https://xn--299ao67b9qbmsf04c.net/

 

VPN 5,500원 / IP교체 1,100원 / 유동프록시 22,000원 | LuzenVPN 루젠VPN

국내최저가 고정IP서비스,유동프록시(IP4000개이상제공),PPTP,L2TP,IPSec,OpenVPNVPN,통신사VPN,VPN프로그램,고정IP,고정아이피,PPTP,저렴한VPN,리니지MVPN,리니지VPN,아이온VPN,던파VPN,유동프록시,유동PROXY,바이

vpn.luzensoft.com