Web Project/shop

GitHub Actions로 CI/CD 구성

hmmmmmmmmmmmm 2025. 9. 5. 01:11

로컬에서 코드를 수정 후 git push 시 GitHub이 GitHub Actions을 시켜 EC2 서버에 자동으로 배포한다

더 이상 SSH로 접속해서 git pull, docker compose up 같은 명령어를 직접 칠 필요가 없다

 

1단계: EC2 서버에 접속할 비밀 정보 등록 (GitHub Secrets)

Actions Runner가 EC2 서버에 SSH로 접속할 수 있도록 비밀번호와 같은 접속 정보를 안전하게 등록한다

 

1. GitHub 프로젝트 저장소로 이동

2. [Settings] > [Secrets and variables] > [Actions] 메뉴로 이동

3. [New repository secret] 버튼을 클릭하여 아래 3개의 비밀 정보를 차례대로 등록

4. 

(1) HOST (서버 주소)

- Name: HOST

- Secret: 18.176.190.123 (EC2 서버의 탄력적 IP 주소)

(2) USERNAME (서버 접속 계정)

- Name: USERNAME

- Secret: ubuntu

(3) SSH_PRIVATE_KEY (서버 비밀키)

- Name: SSH_PRIVATE_KEY

- Secret: 로컬 PC에 저장된 shop-key-new.pem 파일을 메모장으로 열어서, -----BEGIN RSA PRIVATE KEY----- 부터 -----END RSA PRIVATE KEY----- 까지 모든 내용을 그대로 복사하여 붙여넣기.

 

2단계: 자동 배포 시나리오 파일 작성 (deploy.yml)

Actions Runner에게 시킬 일의 순서를 적은 '시나리오 파일'(Workflow file)을 작성한다

(1) 로컬 PC의 shop 프로젝트 폴더 최상단에 .github 라는 폴더 생성

(2) 그 .github 폴더 안에 workflows 라는 폴더 생성

(3) workflows 폴더 안에 deploy.yml 이라는 파일을 만들고, 아래 내용을 그대로 복사해서 붙여넣기

# deploy.yml

name: Deploy to AWS EC2

# 이 시나리오가 언제 실행될지 정의합니다: main 브랜치에 push 이벤트가 발생했을 때
on:
  push:
    branches:
      - main

# 실행될 작업들을 정의합니다.
jobs:
  deploy:
    # 작업이 실행될 가상 환경을 정의합니다.
    runs-on: ubuntu-latest

    # 작업의 단계들을 정의합니다.
    steps:
      # 1. GitHub 저장소의 코드를 가상 환경으로 내려받습니다.
      - name: Checkout code
        uses: actions/checkout@v3

      # 2. SSH로 EC2에 접속해서 배포 스크립트를 실행합니다.
      - name: Deploy to EC2
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.HOST }}             # 1단계에서 등록한 HOST 비밀키
          username: ${{ secrets.USERNAME }}       # 1단계에서 등록한 USERNAME 비밀키
          key: ${{ secrets.SSH_PRIVATE_KEY }}   # 1단계에서 등록한 SSH_PRIVATE_KEY 비밀키
          script: |
               cd ~/shop
               git fetch origin
               git reset --hard origin/main
               docker compose down
               docker compose up -d --build
               docker image prune -f

 

script 부분이 GitHub 로봇이 EC2 서버에 접속해서 실행할 명령어

docker image prune -f는 배포 후 남는 옛날 버전의 이미지를 자동으로 삭제해주는 정리 명령어