매번 코드를 수정할 때마다 서버에 접속해서 git pull을 받고, 빌드를 다시 하고, 프로세스를 재시작하는 과정은 번거롭고 실수하기 쉽습니다. 이러한 반복 작업을 자동화하여 개발자가 오직 '코드'에만 집중할 수 있게 해주는 기술이 바로 CI/CD입니다.
오늘은 별도의 서버 설치 없이 GitHub에서 제공하는 강력한 자동화 도구인 GitHub Actions를 사용하여, 코드를 푸시하면 내 EC2 서버에 즉시 배포되는 환경을 만들어보겠습니다.
1. CI/CD란 무엇인가?
- CI (Continuous Integration): 지속적 통합. 개발자들이 작업한 코드를 자주 병합하고, 그때마다 자동으로 테스트와 빌드를 수행하여 코드의 품질을 검증하는 과정입니다.
- CD (Continuous Deployment): 지속적 배포. 검증된 코드를 실제 운영 서버에 자동으로 반영하는 과정입니다.
2. GitHub Actions의 핵심: Workflow 파일
GitHub Actions는 프로젝트 루트의 .github/workflows/ 디렉토리에 있는 YAML 파일을 통해 동작합니다.
2.1 배포 시나리오 (Workflow)
- 개발자가 main 브랜치에 코드를 Push합니다.
- GitHub Actions가 가상 환경을 실행하여 코드를 **빌드(Build)**합니다.
- 빌드가 성공하면 SSH를 통해 내 EC2 서버에 접속합니다.
- 서버에서 최신 코드를 받고 서비스를 재시작합니다.
3. 실전! 자동 배포 스크립트 작성하기
먼저 GitHub 저장소의 Settings > Secrets and variables > Actions에서 서버 접속 정보(IP, Username, SSH Key)를 등록해야 안전합니다.
3.1 deploy.yml 예시
YAML
name: Deploy to EC2
on:
push:
branches: [ main ] # main 브랜치에 푸시될 때 실행
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: 저장소 코드 가져오기
uses: actions/checkout@v3
- name: SSH 접속 후 배포 명령 실행
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_SSH_KEY }}
script: |
cd /home/ubuntu/my-project
git pull origin main
npm install
pm2 restart all # Node.js 서비스 재시작 예시
4. CI/CD 도입 시 얻게 되는 효과
- 빠른 피드백: 코드를 올리자마자 빌드 오류나 테스트 실패 여부를 알 수 있습니다.
- 배포 실수 방지: 수동으로 명령어를 입력하다 발생할 수 있는 오타나 누락을 원천 차단합니다.
- 생산성 향상: 배포에 소요되는 시간을 줄여 핵심 로직 개발에 더 많은 시간을 투자할 수 있습니다.
- 안정적인 릴리즈: 정해진 절차에 따라 기계적으로 배포되므로 서비스의 안정성이 높아집니다.
5. 실무 꿀팁: Slack/Discord 알림 연동
배포가 성공했는지 실패했는지 매번 GitHub 사이트에서 확인할 수는 없습니다. GitHub Actions에 알림 스텝을 추가하면 배포 결과를 실시간으로 메신저로 받아볼 수 있습니다.
6. 결론: 자동화는 선택이 아닌 필수입니다
스무 차례에 걸쳐 리눅스 서버 기초부터 보안, 모니터링, 그리고 자동 배포까지 달려왔습니다. CI/CD 구축은 이 모든 여정의 마침표이자, 진정한 엔지니어로 거듭나는 시작점입니다.