Skip to content

[프로젝트] CD 파이프라인 구축

이은비 edited this page Jun 3, 2023 · 1 revision

자동화된 배포 파이프라인 구축

Github Actions와 AWS S3, CodeDeploy를 이용해 배포를 진행합니다. 해당 도구를 이용하는 이유는 앞서 주말의집 서비스에서 이미 적용된 파이프라인이기 때문입니다. ( 동일한 파이프라인 방식을 따라가는 것이 팀의 일관성을 유지하는 방식이라고 생각했고, 유지보수에도 용이하기 때문입니다. )

아래 코드는 실제 CD에 사용 중인 yml 파일입니다. 각 코드가 의미하는 바는 주석으로 설명을 대체하겠습니다.

name: Deploy
on: # 이벤트 타켓 설정
  push:
    branches:
      - main
env:
  PROJECT_NAME: duaily-tech-client
  
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout source code
        uses: actions/checkout@master
        
      - name: Check Node v # Node v 확인
        run: node -v

      - name: Cache node modules # 캐싱 처리 ( 속도 향상 )
        uses: actions/cache@v1
        with:
          path: node_modules
          key: ${{ runner.OS }}-build-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.OS }}-build-
            ${{ runner.OS }}-

      - name: Install # 빌드를 위한 패키지 매니저 설치 ( 로컬에서도 npm 사용 중 )
        run: npm install

      - name: Build
        run: npm run build
        
        
      - name: zip create # zip 파일 생성
        run: zip -r ./$GITHUB_SHA.zip ./dist appspec.yml  # appspec.yml 파일 별도로 작성 필요
        shell: bash
        
      - name: Configure AWS credentials # AWS S3로 접근을 위한 인증 과정 필요
        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: ${{ secrets.AWS_REGION }}

      - name: Upload to S3 # S3에 파일 업로드 ( 버킷 내에 서버/프론트엔드 폴더가 이미 존재하기에 폴더명으로 식별하고 있음 )
        run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://${{ secrets.S3_BUCKET_NAME }}/$PROJECT_NAME/$GITHUB_SHA.zip

      - name: Code Deploy # CodeDeploy 배포
        run: |
          aws deploy create-deployment \
          --application-name duaily-deploy \
          --deployment-config-name CodeDeployDefault.AllAtOnce \
          --deployment-group-name duaily-deploy-group-tech-client \
          --s3-location bucket=${{ secrets.S3_BUCKET_NAME }},bundleType=zip,key=$PROJECT_NAME/$GITHUB_SHA.zip

위에 파일에서도 언급했듯이 appspec.yml 파일이 별도로 필요합니다.

version: 0.0
os: linux
files:
  - source: /
    destination: /home/ubuntu/back-office
    overwrite: yes
file_exists_behavior: OVERWRITE
permissions:
  - object: /
    pattern: '**'
    owner: root
    group: root
    mode: 775

AWS EC2 서버 내에 /home/ubuntu/back-office 경로에 현재 레포지토리 코드를 업로드할 예정입니다. 이는 ngnix에서 바라보는 곳이기도 합니다. 이때, file_exists_behavior: OVERWRITE 를 추가하지 않으면 오류가 발생합니다. 이유는, 이미 수동 배포로 현재 레포지토리의 코드가 업로드된 상태이기 때문에 동일한 폴더명이 존재함으로 오류가 발생합니다. 해결하기 위해서는 덮어쓰기를 허용해주어야 합니다.

이 외에 AWS 사이트에서 직접 처리해주어야 하는 작업들이 있습니다.

  1. S3에 버킷에서 프로젝트 명으로 폴더 생성
  2. CodeDeploy에서 deploy 그룹 새로 생성