그외 기록/운영 및 설정

[GitHub Actions] Node.js 서버 자동배포 설정하기

github.com/zlrloy 2026. 6. 21. 16:56

하루에 많으면 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 인증이 필요하다. 서버에서 키를 생성해주자.

  1. 서버 접속
  2. 키 발급
  3. ssh-keygen -t ed25519 -C "github-actions-deploy" -f ~/.ssh/github_actions_deploy
  4. 발급 확인
  5. ~/.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 면 자동배포 완료)

 

 

 

 

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

요청하던 사람도, 배포하던 사람도 모두 편해진 자동화의 효과....😝👍 업무의 질 수직상승!!

앞으로도 반복되는 작업은 꾸준히 자동화해서 개발에 더 집중할 수 있는 환경을 만들어가야겠다.