본문 바로가기
AWS

[AWS] Github Action으로 EC2에 Nestjs 자동 배포

by BK0625 2023. 10. 4.
반응형

기존에 AWS EC2에 Nest 프로젝트를 하나 띄워놨었다. 

 

기존 방식은 저장소를 클론해서 pull을 받고 npm run build로 빌드하는 식.

이런 방식이면 배포 브랜치에 커밋이 추가 될 때마다 해당 EC2 인스턴스에 접속해서 pull을 받고 다시 배포를 해야되는 상황이 생겨 불편함이 야기 될 게 뻔했다.

 

그래서 CI/CD에 대해서 조사를 하던 중에 github action을 사용해서 간단하게 자동 배포 파이프라인을 구축했다.

 

방식은 다음과 같은데

 

내가 로컬 컴퓨터에서 깃허브의 레포지토리로 push를 했을 때 github action이 실행되고 github action에서 EC2에 ssh 접속을 해서 작성해둔 스크립트로 pull을 받고 서버를 다시 재가동하는 방식이다.

 

일단 당연히 EC2(ubuntu) 인스턴스를 생성하고 ssh 키를 발급 받아야 한다.

 

그리고 설치해야 될 것들을 먼저 설치를 한다.

 

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install git
sudo apt-get install npm
sudo npm i -g pm2

 

그런 다음 깃허브 레포지토리 주소로 클론한다.

 

git clone ${레포지토리 주소}

 

그 다음 GitHub Action을 통해 배포 파이프라인을 구축해보자.

 

Github action에 대해서는 나중에 자세히 포스팅 하도록 하고 간단하게 설명하면 깃허브에서 제공하는 테스트 코드, 배포 등을 자동화 할 수 잇는 소프트웨어 도구이다.

 

프로젝트에 ..github/workflows 폴더를 생성하고 yml 파일을 작성한다.

 

 

name: master branch auto ci process script

on: # 아래 job을 실행시킬 상황
  push:
    branches: [ master]

jobs:
  deploy:
    name: deploy
    runs-on: ubuntu-latest # 실행될 인스턴스 OS와 버전

    steps:
      - name: excuting remote ssh commands
        uses: appleboy/ssh-action@v0.1.6 # ssh 접속하는 오픈소스
        with:
          host: ${{ secrets.REMOTE_IP }} # 인스턴스 IP
          username: ${{ secrets.REMOTE_USER }} # 우분투 아이디
          key: ${{ secrets.REMOTE_PRIVATE_KEY }} # ec2 instance pem key
          port: ${{ secrets.REMOTE_SSH_PORT }} # 접속포트
          script: | # 실행할 스크립트
            cd /home/ubuntu/app/Nest-Project
            git pull origin master
            pm2 kill
            npm i --legacy-peer-deps  
            npm run build
            pm2 start dist/main.js

 

해당 파일은 다음과 같은데 간단히 설명하면

 

- on

아래에 있는 job을 실행시킬 상황을 설명해준다. 나는 master 브랜치에 머지 되었을 때 실행되게 한다.

 

- jobs

실행 될 프로세스의 내용이다.

 

- uses

ssh 접속을 편리하게 해주는 오픈소스인 ssh-action 사용

 

- with

EC2에 접속하려면 해당 인스턴스에 대한 정보를 알아야되는데 이걸 당연히 파일안에 직접 적어 넣을 수는 없다. 따라서 깃허브 레포지토리에 해당 액션에서 사용할 변수들을 설정할 수 있고 이 설정들은 repository secrets에 저장된다.

 

settings - security - Secrets and variables - Actions

 

저 화면에서 New repository secret을 누르고 Name과 Secret을 설정해주면 된다.

 

 

ssh 키를 넣을 때 주의점

https://bk0625.tistory.com/94

 

[AWS] EC2 ssh 접속 시 ssh.ParsePrivateKey: ssh: no key found

현재 AWS EC2에 Nest.js 프로젝트 하나가 띄워져 있다. github actions을 사용하여 배포 파이프라인을 만들기 위해 IP 주소,포트,ssh 키 등 암호화할 정보들을 깃헙 레포지토리에 저장하고 두근대는 마음

bk0625.tistory.com

 

 

- scripts

접속 한 뒤 실행할 스크립트. 프로젝트 디렉토리에 접근해 pull을 받고 npm install 후 다시 서버를 재가동한다.

 

각 항목에 대해서는 나중에 github actions에 대해 자세히 포스팅 할 때 추가적으로 설명하겠다.

 

 

어쨌든 이렇게 작성 후에 master 브랜치(혹은 다른 브랜치로 하고 싶다면 다른 브랜치로 설정해도 된다.)에 머지를 하게 되면 자동으로 배포가 되며 결과는 레포지토리의 Actions에서 확인할 수 있다.

 

 

 

잘 배포가 되었다.

 

 

공부하면서 정리한 내용입니다. 모든 지적 감사히 받겠습니다:)

반응형