기주

[CI/CD] 컨테이너 환경에서 CI/CD 구축하기(+code deploy 적용) 본문

devops/CICD

[CI/CD] 컨테이너 환경에서 CI/CD 구축하기(+code deploy 적용)

기주그지마 2024. 12. 14. 17:35

 

컨테이너 환경에서 CI/CD 구축하기(+code deploy 적용)

 

 

 

code deploy 적용 시 장점 / 단점 / 언제 적용하면 좋은지?

https://ki-ju.tistory.com/199

 

[CI/CD] github-actions를 이용한 CI/CD구축-3 (+AWS code deploy)

github-actions를 이용한 CI/CD구축-3 (+AWS code deploy) code deploy를 사용하는이유 (장점)code deploy는 여러대의 ec2 서버에 자동 배포를 쉽게 구축할 수 있다쉽게 무중단 배포를 적용할 수 있다.그외 장점(둘

kiju.pro

 

 

 

 

 

적용

 

1. Github Actions 코드 수정

codedeploy를 적용함으로써 기존 SSH로 EC2에 직접 접속하는 로직이 사라지고,  새롭게 code deploy에 필요한 <appspec.yml, /scripts>를 압축하여 S3에 업로드하고, EC2가 이를 다운받아 배포하도록 하는 로직이 추가되었다

 

.github/workflows/deploy.yml

name: Deploy To EC2

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Github Repository 파일 불러오기
        uses: actions/checkout@v4

      - name: Node 설치
        uses: actions/setup-node@v4
        with:
          node-version: "20"

      - name: 의존성(라이브러리) 설치
        run: npm ci

      - name: .env 파일 만들기
        run: |
          touch .env
          echo '${{ secrets.ENV }}' >> .env

      - name: 테스트 코드 실행
        run: npm run test

      - name: AWS Resource에 접근할 수 있게 AWS credentials 설정
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-region: ap-northeast-2
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

      - name: ECR에 로그인하기
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v2

      - name: Docker 이미지 생성
        run: docker build -t docker-cicd-practice .

      - name: Docker 이미지에 Tag 붙이기
        run: docker tag docker-cicd-practice ${{ steps.login-ecr.outputs.registry }}/docker-cicd-practice:latest

      - name: ECR에 Docker 이미지 Push하기
        run: docker push ${{ steps.login-ecr.outputs.registry }}/docker-cicd-practice:latest

#code deploy에 필요한 로직
      - name: 압축하기
        run: tar -czvf $GITHUB_SHA.tar.gz appspec.yml scripts

      - name: S3에 프로젝트 폴더 업로드하기
        run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.tar.gz s3://docker-cicd-practice/$GITHUB_SHA.tar.gz

      - name: Code Deploy를 활용해 EC2에 프로젝트 코드 배포
        run: aws deploy create-deployment
          --application-name docker-cicd-practice
          --deployment-config-name CodeDeployDefault.AllAtOnce
          --deployment-group-name Production
          --s3-location bucket=docker-cicd-practice,bundleType=tgz,key=$GITHUB_SHA.tar.gz

 

 

 

appspec.yml파일은 로직 유지

 

appspec.yml

version: 0.0
os: linux

files:
  # CodeDeploy가 S3로부터 가져온 파일 중 destination으로 이동시킬 대상을 지정한다.
  # / 이라고 지정하면 S3로부터 가져온 전체 파일을 뜻한다.
  - source: /
    # CodeDeploy가 S3로부터 가져온 파일을 EC2의 어떤 경로에 저장할 지 지정한다.
    destination: /home/ubuntu/docker-cicd-practice

permissions:
  - object: /
    owner: ubuntu
    group: ubuntu

hooks:
  ApplicationStart:
    - location: scripts/start-server.sh
      timeout: 60
      runas: ubuntu

 

 

 

scripts/start-server.sh

#!/bin/bash

echo "--------------- 서버 배포 시작 -----------------"
docker stop instagram-server || true
docker rm instagram-server || true
docker pull {ECR Repository 주소}/instagram-server:latest
docker run -d --name instagram-server -p 3000:3000 {ECR Repository 주소}/instagram-server:latest
echo "--------------- 서버 배포 끝 ------------------"