본문 바로가기

Backend/Node.js

GitHub Actions로 Node.js 자동 배포하기

발단

기존 프로젝트에서 ec2에 접근하고 수동으로 pull 받아서 pm2를 이용하여 배포를 하고 있었다. 

가장 큰 단점은 코드 구현 -> 코드 리뷰 -> 배포 까지의 과정이 너무 길어져 빠르게 대응하기 힘들다는 것이었다.

 

테스트 코드를 짜고 CI/CD를 구현한다면 좋겠지마는 여기에 드는 리소스를 무시할 수 없으므로 일단 github actions를 이용하여 배포를 할 수 있게 해보도록 하였다.

 

 Github 스크립트 짜기

Repository > Actions에 들어가면 기본적으로 해당 언어에 맞는 템플릿을 제공한다.

우리는 Node.js를 이용할 것이다. 

  • 스크립트 파일 내용
name: bbang-map-test #배포 파일 이름

on:
  workflow_dispatch: #Pull request나 merge시로 설정할 수 있지만, 안전하게 수동 트리거를 하는 방식을 사용했다.

jobs:
  build_and_deploy:
    runs-on: ubuntu-20.04

    steps:
      - uses: appleboy/ssh-action@master #ec2에 연결하기 위해 ssh 설정을 하는 방법이다.
        with:
          host : ${{secrets.TEST_REMOTE_IP}}
          username: ${{secrets.TEST_REMOTE_SSH_ID}}
          key: ${{secrets.TEST_REMOTE_SSH_KEY}}
          port: ${{secrets.TEST_REMOTE_SSH_PORT}}
          script: |
            sudo git config --global --add safe.directory /home/***/BBang-map-test #디렉토리가 안전하지 않다는 오류를 방지하는 코드
            sudo git config --global --add safe.directory ~/BBang-map-test
            sudo git config --global --add safe.directory ~/BBang-map-test/BBangMap-Server
            sudo git config --global --add safe.directory ~/BBang-map-test/BBangMap-Server/src
            cd /home/ubuntu/BBang-map-test/BBangMap-Server/src #pull 받을 경로로 이동
            # git pull 명령어 만으로 되는 사람들도 있던데 필자는 username이 없다는 에러가 발생하여 추가하였다.
            git pull https://${{secrets.GIT_USERNAME}}:${{secrets.GIT_PASSWORD}}@github.com/bbangmap/BBangMap-Server.git
            sudo npm install #디펜던시를 추가해준다.
            pm2 restart bbang-map-server #실행되고 있는 pm2의 해당 프로세스를 다시 실행해준다.

uses:  는 github actions에서 미리 정의된 스크립트를 실행한다. 

actions/checkout@v3 를 사용하면 git pull을 자동으로 받을 수 있지만,

pull을 받는 경로가 /home/runner/work 로 임의로 설정되어 artifact를 사용하여 업로드하고 다시 다운로드 받거나 해당 위치에서 실행을 하여야한다. 필자는 이미 실행되고 있는 경로에서 계속 pull을 받고 재실행을 하고 싶어 수동으로 pull을 받아서 사용하였다.

 

  • ${{secrets.~~}} 설정하기

Settings > Secrets > Actions에서 Repository secrets을 설정하고, 스크립트 실행 시 불러올 수 있다.

GIT_USERNAME: 깃 로그인시 아이디

GIT_PASSWORD: 깃 로그인시 비밀번호 (최근에 비밀번호를 사용하지 못하게 하여 깃허브 마이페이지에서 비밀번호 토큰을 만들어서 이를 사용)

 

REMOTE_IP: 연결할 EC2 ip, (ec2-#-##-###-###.ap-northeast-2.compute.amazonaws.com)

REMOTE_ID: 연결할 EC2 id (ubuntu)

REMOTE_SSH_PORT: 연결할 포트 (22)

REMOTE_SSH_KEY: .pem 내용 (터미널에서 cat 명령어로 확인할 수 있다.

주의할 점 : -----BEGIN RSA PRIVATE KEY----- 부터
-----END RSA PRIVATE KEY----- 까지 입력해야한다. (맨 뒤 %가 붙어있다면 꼭 제거하고 복사하기)

 

  • 트리거 실행시키기

Actions > 해당 워크플로우 이름 클릭 > Run workflow를 하여 실행