0Pricing
PHP Academy · 강의

GitHub Actions로 CI/CD 구축

푸시할 때마다 PHP를 자동으로 테스트하고 배포합니다.

GitHub Actions로 CI/CD 구축은(는) CoddyKit의 무료 PHP Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 PHP Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. PHP Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

PHP용 CI/CD

모든 푸시는 테스트, 린트, 정적 분석을 거쳐야 하며, 메인 브랜치에서 모든 검사가 통과하면 이미지로 빌드하여 배포해야 합니다. GitHub Actions는 저장소 이벤트를 트리거로 관리형 실행기에서 이 파이프라인을 실행합니다.

실제 MySQL 서비스에서 PHPUnit을 실행하고, Composer를 캐시하며, PHPStan을 실행하고, Docker 이미지를 빌드한 다음 배포하는 워크플로를 구성합니다.

워크플로 구조

워크플로는 .github/workflows/*.yml에 저장됩니다. 워크플로에는 on: 트리거와 하나 이상의 jobs:가 있으며, 각 작업에는 steps:가 있습니다. 작업은 needs:로 연결되지 않는 한 격리된 실행기에서 병렬로 실행됩니다.

name: CI
on:
  push:
    branches: [main]
  pull_request:

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

setup-php 액션

shivammathur/setup-php는 실행기에서 특정 PHP 버전과 선택한 확장 기능 및 도구(Composer, PHPStan 등)를 설치하는 표준 방법입니다. 테스트만을 위해 이미지를 빌드하는 것보다 훨씬 빠릅니다.

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.3'
          extensions: pdo_mysql, intl, redis, zip
          coverage: pcov
          tools: composer:v2, phpstan

Composer 캐싱

실행할 때마다 의존성을 다시 다운로드하면 몇 분이 낭비됩니다. composer.lock 해시를 기준으로 Composer 디렉터리를 캐시하면 의존성이 변경될 때만 캐시가 무효화됩니다.

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

      - uses: actions/cache@v4
        with:
          path: ${{ steps.composer-cache.outputs.dir }}
          key: composer-${{ hashFiles('**/composer.lock') }}
          restore-keys: composer-

      - run: composer install --prefer-dist --no-progress

서비스 컨테이너

작업은 서비스 컨테이너를 실행할 수 있습니다. 서비스 컨테이너는 실행기가 127.0.0.1에서 접근할 수 있는 실제 MySQL 또는 Redis입니다. options를 통해 상태 확인을 추가하여 데이터베이스가 준비되기 전에 단계가 실행되지 않도록 하십시오.

  test:
    runs-on: ubuntu-latest
    services:
      mysql:
        image: mysql:8.4
        env:
          MYSQL_DATABASE: app_test
          MYSQL_ROOT_PASSWORD: root
        ports: ['3306:3306']
        options: >-
          --health-cmd="mysqladmin ping -proot"
          --health-interval=5s --health-retries=10

테스트 및 커버리지 실행

의존성을 설치하고 MySQL을 실행한 뒤 PHPUnit을 실행하십시오. 테스트 DSN이 127.0.0.1:3306을 가리키도록 설정합니다. 커버리지를 생성하고, 선택적으로 기준값보다 낮으면 빌드가 실패하도록 설정할 수 있습니다.

      - name: Run PHPUnit
        env:
          DATABASE_URL: "mysql://root:root@127.0.0.1:3306/app_test"
        run: vendor/bin/phpunit --coverage-clover=coverage.xml

      - name: Static analysis
        run: phpstan analyse src --level=8 --no-progress

매트릭스 빌드

라이브러리는 여러 PHP 버전에서 통과해야 합니다. strategy.matrix를 사용하면 작업이 조합별로 하나씩 병렬 실행으로 확장되며, ${{ matrix.php }}가 단계에 삽입됩니다.

  test:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        php: ['8.2', '8.3', '8.4']
    steps:
      - uses: actions/checkout@v4
      - uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php }}

이미지 태그 계산

배포에는 고유하고 추적 가능한 이미지 태그가 필요합니다. 커밋 SHA를 사용하는 것이 일반적입니다. 이 예제는 워크플로에서 표현할 태그 도출 로직을 보여 줍니다. 참조와 SHA를 레지스트리 태그로 변환하는 방식입니다.

<?php
// Mirrors what the workflow computes for the image tag
$ref = 'refs/heads/main';
$sha = '9f41efadc0de1234567890abcdef0000deadbeef';

$branch = str_replace('refs/heads/', '', $ref);
$shortSha = substr($sha, 0, 7);
$tag = sprintf('registry.example.com/app:%s-%s', $branch, $shortSha);

echo $tag . PHP_EOL;          // registry.example.com/app:main-9f41efa
echo 'is_main: ' . ($branch === 'main' ? 'yes' : 'no') . PHP_EOL;
?>

이미지 빌드 및 푸시

메인 브랜치에서는 BuildKit과 GitHub Actions 캐시를 사용하여 docker/build-push-action으로 Docker 이미지를 빌드하십시오. 먼저 비밀 토큰으로 레지스트리에 로그인하고, 자격 증명을 코드에 직접 작성하지 마십시오.

  build:
    needs: test
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - uses: docker/build-push-action@v6
        with:
          push: true
          target: runtime
          tags: ghcr.io/${{ github.repository }}:${{ github.sha }}
          cache-from: type=gha
          cache-to: type=gha,mode=max

비밀 정보와 OIDC

저장소 또는 환경의 비밀 값에 자격 증명을 저장하고 ${{ secrets.NAME }}으로 참조하십시오. 이러한 값은 로그에서 가려집니다. 클라우드 배포에는 OIDC를 사용하는 것이 좋습니다. 실행기는 permissions: id-token: write를 통해 AWS/GCP에서 짧은 수명의 토큰을 받으므로, 저장소에 장기 키를 보관하지 않아도 됩니다.

  deploy:
    needs: build
    runs-on: ubuntu-latest
    permissions:
      id-token: write     # enables OIDC
      contents: read
    steps:
      - uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: arn:aws:iam::123456789012:role/deploy
          aws-region: eu-central-1

배포 단계와 환경

GitHub environment 뒤에 운영 환경 배포를 두어 실행을 제어하십시오. 필요한 검토자를 지정할 수도 있습니다. 그러면 배포 단계가 롤아웃을 시작하여 Kubernetes 배포 또는 ECS 서비스를 업데이트하거나, SSH로 접속해 새 이미지를 가져오게 합니다.

  deploy:
    needs: build
    runs-on: ubuntu-latest
    environment:
      name: production       # can require manual approval
      url: https://app.example.com
    steps:
      - name: Roll out
        run: |
          kubectl set image deployment/app \
            app=ghcr.io/${{ github.repository }}:${{ github.sha }}
          kubectl rollout status deployment/app --timeout=120s

빠른 확인

Actions에서 저장된 클라우드 키를 사용하는 것보다 OIDC가 제공하는 주요 보안상의 이점은 무엇입니까?

요약

GitHub Actions에서 PHP CI/CD 파이프라인을 구성했습니다. 푸시와 PR을 트리거로 사용하고, 확장 기능을 포함한 setup-php를 구성했으며, 잠금 파일을 기준으로 Composer를 캐시했습니다. 또한 상태 확인 기능이 있는 MySQL 서비스 컨테이너, PHPUnit과 PHPStan, 버전 매트릭스를 구성한 뒤, 메인 브랜치에서만 GHA 캐시를 사용해 이미지를 빌드하고 푸시했으며, OIDC 인증과 환경 승인 절차를 거치는 배포를 구성했습니다.

원칙: 잠금 파일 해시를 기준으로 캐시하고, 상태 확인으로 준비된 서비스를 제어하며, SHA로 이미지에 태그를 지정하고, 저장된 키보다 OIDC를 우선하십시오.

자주 묻는 질문

“GitHub Actions로 CI/CD 구축” 강의는 무료인가요?

네 — “GitHub Actions로 CI/CD 구축” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 PHP Academy 강의 전체를 잠금 해제할 수 있습니다. PHP Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“GitHub Actions로 CI/CD 구축”에서 뭘 배우나요?

푸시할 때마다 PHP를 자동으로 테스트하고 배포합니다. 브라우저에서 직접 실행하는 실습 코드로 PHP Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

PHP Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 PHP Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“GitHub Actions로 CI/CD 구축” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 PHP Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 PHP Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. PHP 애플리케이션 컨테이너화
  2. 다단계 빌드와 최적화
  3. 로컬 스택을 위한 Docker Compose
  4. GitHub Actions로 CI/CD 구축
← PHP Academy(으)로 돌아가기