Git
GitHub Actions로 CI/CD 자동화하기
코샵
2025. 1. 7. 10:19
반응형
소개
GitHub Actions을 사용하여 CI/CD 파이프라인을 구축하는 방법을 처음부터 차근차근 알아보겠습니다. 실제 프로젝트에서 바로 사용할 수 있는 예제도 함께 살펴보겠습니다.
GitHub Actions란?
GitHub Actions는 빌드, 테스트, 배포 파이프라인을 자동화할 수 있는 CI/CD 플랫폼입니다. git push 등의 이벤트가 발생했을 때 자동으로 정의된 작업을 실행할 수 있습니다.
기본 워크플로우 생성
1. 워크플로우 파일 위치
프로젝트 루트에 다음 경로로 yml 파일을 생성합니다:
your-project/
├── .github/
│ └── workflows/
│ └── main.yml
2. 기본 워크플로우 구조
name: CI/CD Pipeline
# 워크플로우 실행 조건
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
# 실행할 작업들
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install dependencies
run: npm install
- name: Run tests
run: npm test
실전 예제: React 프로젝트 배포
1. React 빌드 및 테스트
name: React Deploy
on:
push:
branches: [ main ]
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
cache: 'npm' # npm 캐시 사용
- name: Install dependencies
run: npm ci # clean install
- name: Run tests
run: npm test
- name: Build project
run: npm run build
# 빌드 결과물 저장
- name: Upload build artifacts
uses: actions/upload-artifact@v3
with:
name: build-files
path: build/
2. AWS S3 배포
name: Deploy to AWS
jobs:
deploy:
needs: build-and-test # 이전 작업 완료 후 실행
runs-on: ubuntu-latest
steps:
# 빌드 결과물 다운로드
- name: Download build artifacts
uses: actions/download-artifact@v3
with:
name: build-files
path: build
# AWS 인증 설정
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-2
# S3에 업로드
- name: Upload to S3
run: |
aws s3 sync build/ s3://${{ secrets.AWS_S3_BUCKET }} --delete
환경별 배포 설정 (개발/스테이징/운영)
name: Multi-environment Deploy
on:
push:
branches:
- develop
- staging
- main
jobs:
deploy:
runs-on: ubuntu-latest
# 환경별 설정
environment:
${{ github.ref == 'refs/heads/main' && 'production' ||
github.ref == 'refs/heads/staging' && 'staging' ||
'development' }}
steps:
- uses: actions/checkout@v3
- name: Set environment variables
run: |
if [[ $GITHUB_REF == 'refs/heads/main' ]]; then
echo "ENV=production" >> $GITHUB_ENV
elif [[ $GITHUB_REF == 'refs/heads/staging' ]]; then
echo "ENV=staging" >> $GITHUB_ENV
else
echo "ENV=development" >> $GITHUB_ENV
fi
- name: Deploy to environment
run: |
echo "Deploying to ${{ env.ENV }} environment"
# 실제 배포 스크립트
캐시 활용하기
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
# npm 캐시
- name: Cache node modules
uses: actions/cache@v3
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
# 빌드 캐시
- name: Cache build output
uses: actions/cache@v3
with:
path: |
build
node_modules/.cache
key: ${{ runner.os }}-build-${{ github.sha }}
보안 설정
1. 시크릿 설정
GitHub 레포지토리의 Settings > Secrets and variables > Actions에서 시크릿을 설정할 수 있습니다.
steps:
- name: Deploy with secrets
env:
API_KEY: ${{ secrets.API_KEY }}
DATABASE_URL: ${{ secrets.DATABASE_URL }}
run: |
echo "Using secrets for deployment"
2. 환경 보호 규칙
jobs:
deploy:
environment:
name: production
url: https://www.example.com
# 필요한 승인자 설정
needs: [build, test]
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
실행 결과 알림
1. Slack 알림
steps:
- name: Notify Slack
uses: 8398a7/action-slack@v3
with:
status: ${{ job.status }}
fields: repo,message,commit,author,action,eventName,ref,workflow,job,took
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
if: always() # 성공/실패 모두 알림
작업 매트릭스 활용
여러 버전이나 환경에서 테스트할 때 유용합니다.
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [14.x, 16.x, 18.x]
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
마치며
GitHub Actions를 활용하면 개발부터 배포까지의 과정을 자동화할 수 있습니다. 초기 설정에 시간이 들 수 있지만, 한번 설정해두면 개발 생산성을 크게 향상시킬 수 있습니다.