본문 바로가기
DEV/Web 개발

Web개발 :: github action을 활용한 CI/CD _TIL77

by 올커 2022. 12. 28.

■ JITHub 개발일지 77일차

□  TIL(Today I Learned) ::

Github action을 활용한 CI/CD

  - CI/CD란?

    지속적 통합, 지속적 배포를 뜻하며 이를 통해 코드를 검증 및 통합하고 배포하는 일련의 과정을 말한다. 이를 제공하는 서비스들이 많지만 본 프로젝트에서는 github action을 사용했다.

 

  - 현재 배포되어 있는 서비스는 프론트 엔드, 백엔드 두 개의 repository로 나뉘어있기 때문에 각각 CI/CD를 지정해주어야 한다.

 

  - 아래는 먼저 프론트엔드의 배포 코드이다.

  - 처음에 워크플로우를 짜주어야 하는데 yml파일을 잘 이해하지 못해 어려움이 있었으나, 아래 영상을 통해 많은 도움을 받을 수 있었다. (※ 참고 링크 : 유튜브) 생활코딩 - github.com - action)

 - 위의 영상을 참고하여 작성한 프론트엔드 cd 코드이다.

   S3서버에 접근하기 위하여 필요한 정보들을 옵션으로 입력해준다.

# GaGgaMaGga_FE/.github/workflows/cd_front.yml
name: CD-Front


on:
  push:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest

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

      - name: S3 Deploy
        run: |
              aws s3 cp \
              --recursive \
              --region ap-northeast-2 \
              /home/runner/work/GaGgaMaGga_FE/GaGgaMaGga_FE s3://gaggamagga.shop
        env: 
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_REGION: ${{ secrets.AWS_REGION }}

      - name: Create CloudFront Cache Invalidation
        uses: chetan/invalidate-cloudfront-action@master
        env:
          DISTRIBUTION: ${{ secrets.AWS_DISTRIBUTION_ID  }}
          PATHS: '/*'
          AWS_REGION: 'eu-central-1'
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

 

 - 코드를 보면 secret 키들이 많이 보이는데 이는 아래 Settings - Secrets - Actions에서 지정해줄 수 있었다.

 

 

 - 이제 백엔드 레포지토리의 코드이다. 현재 백엔드는 도커를 통해 연결해야 하므로 이에 알맞게 수정해주었으며 , ssh를 사용하였다.

 

# GaGgaMaGga_BE/.github/workflows/gaggamaggaCD.yml
name: gaggamagga CD

on:
  push:
    branches: ['main']

jobs:
  deploy:
    name: CD Pipeline
    runs-on: ubuntu-latest

    strategy:
      matrix:
        python-version: ["3.10.8"]

    steps:
      - name: Deploy
        uses: appleboy/ssh-action@v0.1.5
        with:
          key: ${{ secrets.EC2_KEY }}
          host: ${{ secrets.EC2_IP }}
          username: ${{ secrets.EC2_NAME }}
          port: ${{ secrets.EC2_PORT }}
          script: |
            cd ${{ secrets.EC2_PATH }}
            git pull origin main
            cd ../../
            sudo docker compose restart backend

 - 백엔드에서는 CI에서 통합할 때 마다 테스트코드를 실행시킬 수 있도록 하여, 작업이 끝난 후 merge할 때 테스트코드가 동작 하여 이상이 없는지 확인할 수 있도록 하였다.

# GaGgaMaGga_BE/.github/workflows/gaggamaggaCI.yml

name: gaggamagga CI

on:
  push:
    branches: [ "main" ]
  
  pull_request:
    branches: [ "main" ]

jobs:
  build:

    runs-on: ubuntu-latest
    strategy:
      max-parallel: 4
      matrix:
        python-version: ["3.10.8"]

    steps:
    - uses: actions/checkout@v3
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v3
      with:
        python-version: ${{ matrix.python-version }}
        
    - name: Decrypt secrets.json
      run: gpg --quiet --batch --yes --decrypt --passphrase="$PASS_PHRASE" --output $HOME/secrets.json secrets.json.gpg
      env:
        PASS_PHRASE: ${{ secrets.PASS_PHRASE }}

    - name: Move secrets.json
      run: mv $HOME/secrets.json /home/runner/work/GaGgaMaGga_BE/GaGgaMaGga_BE

    - name: Install Dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt
    - name: Run User App Tests
      run: |
        python manage.py test users
    - name: Run Place App Tests
      run: |
        python manage.py test places
    - name: Run Review App Tests
      run: |
        python manage.py test reviews
    - name: Run Notification App Tests
      run: |
        python manage.py test notification

 

 

 

반응형

댓글