주뇽's 저장소
[CI/CD] 배포를 자동화하는 방법: 깃액션과 SSH로 EC2에 프론트엔드를 배포하기🚀 본문
배포를 자동화하는 방법: 깃액션과 SSH로 EC2에 프론트엔드를 배포하는 이야기 🚀
개발을 하다 보면, 배포 과정이 정말 귀찮을 때가 있다. 특히나 프론트엔드 배포처럼 간단하지만 반복적인 작업을 계속해야 할 때는 더 그렇다. 매번 코드를 수정할 때마다 git push
를 하고, EC2에 접속해서 git pull
, 그리고 npm run dev
를 하는 일이 반복되다 보면 정말 지루해진다. 이 단순하고 반복적인 작업을 자동화할 수는 없을까? 바로 그 해답이 CI/CD다! 💡
문제점: 수동 배포는 너무 귀찮다 😩
배포 과정을 자동화하지 않으면, 다음과 같은 흐름으로 배포 작업을 해야 한다:
- 로컬에서 코드를 수정하고
git push
한다. - AWS EC2 서버에 접속한다.
- 서버에서
git pull
명령어를 실행한다. - 최신 코드로
npm run dev
를 실행한다.
이 과정을 매번 하다 보면 어느 순간부터 귀찮다는 생각이 든다. 게다가 사람이 하는 일은 실수가 발생하기 마련이다. 간단한 배포인데 왜 이렇게 복잡할까? 🤔 자동화가 답이다.
해결책: CI/CD로 배포 자동화하기! ✨
이런 반복적인 작업을 깃액션(GitHub Actions)을 통해 자동화할 수 있다. 깃액션을 사용하면 git push
한 번으로 EC2 서버에 자동으로 배포가 진행되도록 설정할 수 있다. 이제 수동으로 EC2에 접속하고 명령어를 실행하는 대신, 깃액션이 알아서 해준다. 이 과정에서 SSH 키를 이용해 안전하게 EC2 서버에 접속하고, 필요한 명령어를 실행한다.
SSH 시크릿 키 설정 🎯
여기서 중요한 점은 SSH 시크릿 키 설정이다. 깃액션 시크릿에 프라이빗 키를 저장할 때, 개행 없이 한 줄로 넣어야 한다. 또한 큰따옴표를 포함하지 않고, -----BEGIN OPENSSH PRIVATE KEY-----
부터 -----END OPENSSH PRIVATE KEY-----
까지 그대로 입력해야 한다. 실수로 개행이나 따옴표를 포함하면 배포 과정에서 SSH 연결에 실패할 수 있다. 😵
백그라운드 실행을 위한 tmux 사용
배포 스크립트에서 저는 백그라운드 실행을 위해 tmux
를 사용했다. 이렇게 하면 배포 후 EC2에서 실행 중인 서버가 계속 돌아가도록 설정할 수 있다. 이 내용을 run.sh
에 넣어 EC2 서버에서 백그라운드로 리액트 앱이 실행되도록 했다.
디버깅을 위한 깃액션 워크플로우 수정 🛠️
자동 배포를 설정하면서 SSH 연결에 문제가 생길 수 있기 때문에, 중간에 SSH 연결을 테스트하는 과정을 추가했다. 이 명령어는 SSH 키가 제대로 작동하는지 미리 확인해주며, 줄바꿈 문제를 해결하기 위해 tr
명령어로 윈도우와 유닉스 간의 줄바꿈 차이를 처리했다.
수정된 깃액션 워크플로우 코드 👇
name: React App CI/CD
on:
push:
branches:
- main
paths:
- 'FE/**'
pull_request:
branches:
- main
paths:
- 'FE/**'
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
- name: Install dependencies
run: |
cd FE/pdf_quiz
npm install
- name: Build the React app
run: |
cd FE/pdf_quiz
npm run build
deploy:
runs-on: ubuntu-latest
needs: build
env:
EC2_HOST: ${{ secrets.EC2_REACT_HOST }}
EC2_USER: ${{ secrets.EC2_USER }}
SSH_KEY: ${{ secrets.EC2_SSH_REACT_KEY }}
steps:
- name: Check out code
uses: actions/checkout@v4
- name: Check environment variables
run: |
echo "EC2_HOST: $EC2_HOST"
echo "EC2_USER: $EC2_USER"
- name: Add SSH key to agent
run: |
echo "$SSH_KEY" | tr -d '\r' > key.pem # Windows와 Unix 줄바꿈 문제 해결
chmod 400 key.pem
eval "$(ssh-agent -s)"
ssh-add key.pem
- name: Test SSH connection
run: |
ssh -o StrictHostKeyChecking=no -i key.pem $EC2_USER@$EC2_HOST "echo Connection successful"
- name: Deploy to EC2
run: |
ssh -o StrictHostKeyChecking=no -i key.pem $EC2_USER@$EC2_HOST << 'ENDSSH'
echo "Running run.sh on EC2"
tmux new-session -d -s mysession 'sh run.sh' # 백그라운드에서 run.sh 실행
echo "Finished running run.sh"
ENDSSH
결론: 귀찮음을 해결하는 자동화 🏆
CI/CD를 통해 배포 과정을 자동화하면, 더 이상 수동으로 EC2에 접속해 배포할 필요가 없다. 깃에 커밋하고 푸시만 하면 자동으로 배포가 진행되니, 얼마나 편한가! 게다가, 오류가 발생해도 자동화된 프로세스 덕분에 쉽게 문제를 파악하고 수정할 수 있다.
자동화는 개발자의 귀찮음을 덜어주는 강력한 도구다. 이제 반복적인 작업을 자동화하고, 더 중요한 일에 집중할 수 있게 된다. 🌟
'Git' 카테고리의 다른 글
풀 리퀘스트 승인을 위한 6가지 필수 코딩 패턴 (2) | 2024.09.05 |
---|---|
Git 충돌, 두려워 말자! 초보자도 쉽게 해결하는 방법 (0) | 2024.08.19 |
[Git Action] AWS-Lambda 배포 자동화 하기 (0) | 2024.08.02 |