일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- object
- 라이징캠프
- 동일성
- JWT
- 왕실의나이트
- 동빈북
- 나동빈
- 우아한테크코스
- 이것이취업을위한코딩테스트다
- 딕셔너리
- forloop
- nestJS
- 동등성
- 컴공선배
- 해커톤
- 이코테
- remove
- loop
- 너디너리
- Hackathon
- CICD
- CMC
- github action
- Payload
- makeus
- Signature
- equlas
- ssh-action
- 우테코
- HashCode
- Today
- Total
iamjooon2님의 블로그
Github Action을 이용한 EC2 자동배포 적용기 본문
이전 프로젝트에서 배포를 담당했다.
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 공부는 하면 할수록 할게 많은데, 하면 할수록 너무 재밌는 것 같다
모든걸 다 알고싶다면 욕심이겠지만.. 그래도 해보고싶은게 너무 많다
꾸준하게 하는 수 밖에 없는 것 같다. 계속 공부해봐야징