작지만 꾸준한 반복

Github Action을 이용한 EC2 자동배포 적용기 본문

카테고리 없음

Github Action을 이용한 EC2 자동배포 적용기

iamjooon2 2023. 1. 22. 21:30

이전 프로젝트에서 배포를 담당했다.

main 브랜치에 팀원들의 개발 내역이 머지되면, EC2에서 브랜치를 pull 하는 방식으로 배포를 진행했는데,

이 과정이 정말 너무나도 번거로웠다.

그래서 다음 프로젝트에서는 꼭 자동 배포 파이프라인을 구축해야지 마음먹었다.

이번 프로젝트에서 적용했고, 그 대략적인 과정을 정리해보려고 한다

 

내가 구축한 프로세스는 다음과 같다

 

1. 로컬 컴퓨터에서 깃허브의 저장소로 push했을 때

2. 깃허브 액션이 실행된다

3. 깃허브 액션에서 EC2에 ssh 접속을 한 후,

4. 작성해둔 스크립트를 실행한다

    - 스크립트 내용

    4-1. 저장소를 클론해놓은 경로로 이동한 후

    4-2. 지정한 branch를 git pull 한다 (업데이트 내역 반영)

    4-3. 현재 실행중인 서버를 잠시 중단한 후

    4-4. package.json를 바탕으로 npm 파일을 업데이트 한다

    4-5. 그 후 배포 환경에서 실행할 파일을 만들어주고

    4-6. 서버를 다시 재가동한다

5. 배포 완료!

 

 

 

EC2

AWS에서 EC2 인스턴스(우분투)를 생성한 후 ssh 접속하여 git, npm, pm2를 설치했다

 

git

sudo apt-get update && upgrade // apt-get 업데이트 && 업그레이드
sudo apt-get install git // git 설치

우리 서버인 EC2는 우분투라서, apt-get을 이용했다

apt-get을 업그레이드한 후, git을 설치했다.

 

npm

sudo apt-get install npm

npm을 설치했다

 

pm2

sudo npm i -g pm2

무중단 서비스를 위해 pm2를 전역으로 설치했다.

 

git clone

git clone {깃허브 저장소 주소}

 

우리 프로젝트는 공개 레포라 git만 설치했지만, 만약 비공개 레포라면 ssh 키를 발급해 깃허브에 등록해주는 과정이 필요하다.

 

Github Action

깃허브에서 제공하는 테스트코드, 배포등을 자동화할 수 있는 소프트웨어 도구이다.

사용법과 개념은 이 블로그에 잘 설명되어 있다

 

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

내가 작성한 파일은 아래와 같다

# dev.yml
name: dev branch auto ci process script

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

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/Server-V2
            git pull origin dev
            pm2 kill
            npm i --force
            npm run build
            pm2 start dist/main.js

 

아주 간단한 설명을 달자면

on:

아래 job이 실행될 상황을 적어주면 된다. 나는 dev 브랜치에 머지되었을 때 실행되도록 작성했다

jobs:

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

uses:

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

 

GitHub - appleboy/ssh-action: GitHub Actions for executing remote ssh commands.

GitHub Actions for executing remote ssh commands. Contribute to appleboy/ssh-action development by creating an account on GitHub.

github.com

 

 

with:

깃허브 레포에서 settings - secrets and varaibles - actions - new repository secret를 통해 깃허브 액션에서 사용할 비밀들(?)을 설정할 수 있고, 이렇게 만든 비밀들은 아래 repository secrets에 저장된다

 

나는 IP 주소, 포트, ssh 키 등 암호화할 정보들을 저장했다

 

 

 

아래 사진과 같이 Name에 만들어줄 이름을 정한 다음, Secret 안에 비밀을 집어넣어주면 된다

 

scripts:

실제 접속한 후, 실행할 명령어들을 적어주면 된다

내용은 초반에 작성한 것과 같다

scripts: |
	cd /home/ubuntu/Server-V2
	git pull origin dev
	pm2 kill
	npm i --force
	npm run build
	pm2 start dist/main.js

 

결과 확인

레포지토리의 Actions에서 결과를 확인할 수 있다

 

여태껏 실행된 action 내역이다

위와 같이 초록색 체크 표시가 뜨면, 성공적으로 실행됐다는 뜻이다!
다만, github action 상의 플로우가 성공적으로 실행됐다는 것이지, EC2에서 다른 문제가 생겼다는 뜻은 아니니 주의하길 바란다

 

작업한 레포는 이곳에서 확인할 수 있다.

 

IT 공부는 하면 할수록 할게 많은데, 하면 할수록 너무 재밌는 것 같다

모든걸 다 알고싶다면 욕심이겠지만.. 그래도 해보고싶은게 너무 많다

꾸준하게 하는 수 밖에 없는 것 같다. 계속 공부해봐야징