[GitHub Actions] Node.js 서버 자동배포 설정하기
하루에 많으면 15번 이상 배포 요청이 들어온다.

그때마다 작업을 멈추고 서버에 접속해서 git pull, npm install, build, pm2 restart를 반복했다.
배포 자체는 몇 분 안 걸리는 작업이지만 하고있던 작업 흐름이 끊기는 건 어쩔 수 없다. 🥹
그래서 미뤄놨던 자동배포를 이번에 구축했다.
코드만 올리면 서버까지 자동으로 반영될 수 있도록!
(dev 브랜치에 push → GitHub Actions 실행 → 서버 자동 배포 → PM2 재시작)
1. Workflow 파일 생성
배포할 각 레포지토리에 .github/workflows/deploy-dev.yml 파일을 추가한다.
dev 브랜치에 push가 발생하면 자동으로 배포가 실행된다.
/.github/workflows/deploy-dev.yml 내용 참고
name: Deploy Dev
on:
push:
branches:
- dev
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Deploy to dev server
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.DEV_HOST }}
username: root
key: ${{ secrets.DEV_SSH_KEY }}
script: |
set -e
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
nvm use 22.11.0
#각 서버 경로에 맞게 작성
cd /home/ubuntu/dev/서비스
export GIT_SSH_COMMAND="ssh -i ~/.ssh/github_pull_deploy -o IdentitiesOnly=yes"
git fetch origin
# 배포 전 package, package-lock hash
BEFORE_HASH=$(cat package.json package-lock.json | sha256sum | awk '{print $1}')
git reset --hard origin/dev
# 배포 후 package, package-lock hash
AFTER_HASH=$(cat package.json package-lock.json | sha256sum | awk '{print $1}')
# package-lock 변경 시에만 npm install
if [ "$BEFORE_HASH" != "$AFTER_HASH" ]; then
echo "package.json or package-lock.json changed → npm install"
npm install
else
echo "No dependency changes → skip npm install"
fi
npm run build
pm2 restart all
*package-lock 변경시에만 npm install
*fi는 쉘 스크립트에서 if문의 끝을 의미
2. GitHub Actions 배포 전용 SSH 키 발급
GitHub Actions가 서버에 접속하려면 SSH 인증이 필요하다. 서버에서 키를 생성해주자.
- 서버 접속
- 키 발급
- ssh-keygen -t ed25519 -C "github-actions-deploy" -f ~/.ssh/github_actions_deploy
- 발급 확인
- ~/.ssh/github_actions_deploy → private key ~/.ssh/github_actions_deploy.pub → public key
3. 각 레포지토리 GitHub Secrets에 DEV_HOST 등록
Repository → Settings → Secrets and variables → Actions
XX.XX.XX.XXX
4. 공개키/개인키 등록
*DEV_SSH_KEY=GitHub Actions가 서버에 SSH 접속할 때 사용
- 공개키(Public Key) .pub 서버 root의 ~/.ssh/authorized_keys에 추가
cat ~/.ssh/github_actions_deploy.pub >> ~/.ssh/authorized_keys
- 개인키(Private Key) GitHub Secret DEV_SSH_KEY에 추가

5. SSH 키 발급 및 등록 (비밀번호 미설정)
수동 배포: 기존에는 서버에서 git pull 시 SSH Key 비밀번호(passphrase) 입력
자동 배포: 사람이 직접 비밀번호를 입력할 수 없기 때문에 비밀번호(passphrase) 없는 전용 SSH Key 별도 생성
- 생성
ssh-keygen -t ed25519 -C "github_pull_deploy" -f ~/.ssh/github_pull_deploy
- 등록
공개키(Public Key) .pub
GitHub(회사 계정 로그인) → 프로필 → Settings → SSH and GPG keys → New SSH key
- Title: GCP-calvak-etc-deploy-dev
- Key type: Authentication Key
- Key: github_pull_deploy 값 붙여넣기

- Key 지정
이제 서버에는 기존 수동 배포용 SSH Key(id_rsa)와,
새로 생성한 자동배포용 GitHub Pull 전용 Key(github_pull_deploy)가 함께 존재한다.
- 수동배포
기존처럼 git pull origin dev → 비밀번호 입력 → 배포 진행 - 자동배포
전용 Key(github_pull_deploy)만 사용하도록 설정
/home/ubuntu/dev/서비스
GIT_SSH_COMMAND='ssh -i ~/.ssh/github_pull_deploy -o IdentitiesOnly=yes' git fetch origin
*이 설정이 없으면 서버가 여러 SSH Key 중 어떤 것을 사용할지 헷갈릴 수 있다.
- 수동배포
6. 자동배포 확인
이제 dev 또는 main 브랜치에 push 또는 merge가 발생하면 GitHub Actions가 자동 실행된다.
배포 진행 상태는 각 Repository의 GitHub → Actions 탭에서 확인 가능하다. (상태가 ✅ Success 면 자동배포 완료)

프론트개발자분들의 뜨거운 반응🙌

요청하던 사람도, 배포하던 사람도 모두 편해진 자동화의 효과....😝👍 업무의 질 수직상승!!
앞으로도 반복되는 작업은 꾸준히 자동화해서 개발에 더 집중할 수 있는 환경을 만들어가야겠다.