개발 💻/메모
Github Actions 이용하여 개발서버에 자동배포 만들기
감사로봇
2025. 4. 23. 21:48
프로젝트를 개발하다 보면, 변경사항을 서버에 자동으로 반영하고 싶은 경우가 많습니다. 특히 GCP(Google Cloud Platform) 같은 클라우드 서버를 개발 서버로 사용하는 경우, 매번 수동으로 접속해서 git pull 하고, 빌드 및 실행 명령을 입력하는 과정은 번거롭고 실수도 발생할 수 있습니다.
이 글에서는 Github Actions를 이용하여 GCP 개발 서버에 자동으로 배포되는 구조를 만드는 방법을 소개합니다. CI는 기본 테스트를, CD는 서버 반영까지 자동으로 수행하는 구조입니다.
⛳ 목표 아키텍처
- Github에 코드가 develop 브랜치에 push되면,
- Github Actions가 실행되어,
- 테스트 코드가 통과한 뒤,
- GCP 개발 서버에 SSH로 접속해,
- 최신 코드를 git pull 받고,
- 준비해 둔 실행 스크립트를 실행하여 서버를 다시 띄웁니다.
Github Actions 워크플로우 작성
먼저, Github 저장소 내에 워크플로우 파일을 하나 생성합니다.
📄 .github/workflows/deploy.yml
name: Deploy to GCP via SSH
on:
push:
branches: [develop]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: ✅ Checkout the code (optional for test)
uses: actions/checkout@v3
- name: ✅ Install dependencies and run tests
run: |
yarn install --frozen-lockfile
yarn test
- name: 🔐 Setup SSH key
uses: webfactory/ssh-agent@v0.9.0
with:
ssh-private-key: ${{ secrets.GCP_SSH_KEY }}
- name: 🚀 SSH to GCP and deploy
run: |
ssh -o StrictHostKeyChecking=no ${{ secrets.GCP_USERNAME }}@${{ secrets.GCP_HOST }} << 'EOF'
cd /home/${{ secrets.GCP_USERNAME }}/your-project
git pull origin develop
chmod +x ./script/docker/run.sh
./script/docker/run.sh
EOF
- `on.push.branches` : 이곳에서 해당 Push 동작으로 Workflow 를 동작시킬 브랜치명을 지정합니다.
- YARN 패키지를 사용중인 프로젝트를 가정으로 하여, 종속성 설치 이후 테스트 코드를 실행합니다. (CI)
- SSH Key Setup 및 접속이 완료되고 나면, 해당 브랜치를 Pulling 합니다.
따라서, 대상 branch 명이 `develop` 이 아니라면, 해당 브랜치명에 맞게 수정하도록 합니다. - 마지막으로 준비된 실행 스크립트를 실행합니다. 해당 실행 스크립트 파일명이나 명령어를 맞춰 수정합니다.
🔨 원격 서버(GCP 인스턴스)에서 해야 할 작업
1. 프로젝트 clone 및 SSH 설정
- GCP 인스턴스에 프로젝트를 clone 해놓고, develop 브랜치가 기본 브랜치가 되도록 설정합니다.
- SSH 키를 생성하고, 이 공개키를 Github 계정의 SSH Key로 등록합니다.
ssh-keygen -t rsa -b 4096 -C "gcp-server"
cat ~/.ssh/id_rsa.pub # 이 내용을 복사해서 Github 에 SSH Key로 등록
2. git pull 이 가능하게 설정
- GCP 서버에서 해당 프로젝트 폴더로 이동한 후,
git remote set-url origin git@github.com:yourname/your-repo.git
- 그런 다음 정상적으로 Github에 SSH로 접근 가능한지 확인합니다:
ssh -T git@github.com
🔐 Github Secrets 설정
자동화 과정에서 민감한 정보를 저장하고 접근하기 위해 Github에서는 Secrets 기능을 제공합니다.
Secrets 위치:
- Github 저장소 > Settings > Secrets and variables > Actions > New repository secret
등록해야 할 값들:
Name | 설명 |
GCP_HOST | GCP 인스턴스의 공인 IP 또는 도메인 |
GCP_USERNAME | 예: ubuntu, ec2-user 등 GCP 로그인 계정 |
GCP_SSH_KEY | Github Actions에서 GCP 서버에 접속할 때 사용할 비공개 SSH 키 (id_rsa 내용 전체) |
배포 스크립트 예시 (run.sh)
서버에서는 보통 `.env` 를 주입하고, Docker로 컨테이너를 빌드/재시작하는 스크립트를 준비해둡니다.
#!/bin/bash
source .env
docker build -t my-app .
docker stop my-app || true
docker rm my-app || true
docker run -d --name my-app --env-file .env -p 3000:3000 my-app
👍 마무리
위의 과정을 통해 Github 저장소에 develop 브랜치로 push를 하면, 자동으로 GCP 개발 서버에 접속하여 배포가 진행됩니다. 테스트를 통과한 경우에만 서버에 반영되므로, 안정성과 자동화 두 마리 토끼를 모두 잡을 수 있습니다.
이 구조는 프로덕션 배포에도 응용할 수 있으며, main 브랜치 기준으로 프로덕션 서버에 배포하는 분기 처리도 쉽게 추가할 수 있습니다. 더 정교하게 하고 싶다면, 슬랙 알림, 롤백 처리, 배포 상태 체크 등도 추가 확장 가능합니다.