CI CD 구축을 통한 생산성 향상 - boostcampwm-2022/web30-TODY GitHub Wiki

CI/CD 구축을 통한 생산성 향상

💡 통합과 배포를 용이하게 하기 위해서 프로젝트 초기에 GitHub Actions를 활용한 CI/CD 파이프라인을 구축했습니다. CI를 통해 조기에 오류를 포착할 수 있었고, CD를 통해 재빠른 수동 테스트와 버그 수정을 할 수 있었습니다.

목표

  • CI
    • 깃브랜치 지속적 통합을 위한 테스트 프로세스 자동화
    • main/develop 브랜치에 pull request를 보냈을 때 린트 테스트(eslint), 유닛 테스트(jest), 빌드(typescript 컴파일) 등을 실행
    • frontend와 backend CI를 별도로 구축
  • CD
    • 배포 프로세스 자동화
    • main 브랜치에 push(merge) 됐을 때 자동으로 빌드 결과를 운영 서버에 배포
    • frontend와 backend CD를 별도로 구축

방법

  • 툴 : GitHub Actions
  • 레포의 .github/workflows 폴더 아래 workflow 파일을 yaml로 작성
  • GitHub Actions가 정의된 조건(on)에 맞춰 workflow를 트리거함
  • GitHub Actions Secrets를 활용해 환경변수 저장
    • 코드로 살펴보기(FE)

      name: cd-frontend
      
      on:
        push:
          branches: ["main"]
          paths:
            - "frontend/**"
      
      jobs:
        deploy-frontend:
          name: deploy-frontend
          runs-on: ubuntu-latest
          defaults:
            run:
              working-directory: frontend
      
          steps:
            - name: checkout
              uses: actions/checkout@v3
      
            - name: create env files
              run: |
                touch .env.production
                cat << EOF >> .env.production
                ${{ secrets.FE_ENV_PRODUCTION }} 
                EOF
      
            - name: install dependencies
              run: npm ci
      
            - name: build
              run: npm run build
      
            - name: deploy build outputs
              uses: appleboy/scp-action@master
              with:
                host: ${{ secrets.FE_HOST }}
                username: ${{ secrets.FE_USERNAME }}
                password: ${{ secrets.FE_PASSWORD }}
                port: ${{ secrets.FE_PORT }}
                source: "frontend/build/*"
                target: "/tody
    • 코드로 살펴보기(BE)

      name: cd-backend
      
      on:
        push:
          branches: ["main"]
          paths:
            - "backend/**"
      
      jobs:
        deploy-backend:
          name: deploy-backend
          runs-on: ubuntu-latest
          steps:
            - name: deploy to prod
              uses: appleboy/ssh-action@master
              with:
                host: ${{secrets.BE_HOST}}
                username: ${{secrets.BE_USERNAME}}
                password: ${{secrets.BE_PASSWORD}}
                port: ${{secrets.BE_PORT}}
                script: |
                  cd tody
                  git pull origin main
                  cd backend
                  npm ci
                  npm run build
                  pm2 reload main

성과

  • CI를 통해 조기에 오류를 포착
  • CD를 통해 재빠른 수동 테스트와 버그 수정
⚠️ **GitHub.com Fallback** ⚠️