기존에 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에 저장된다.
저 화면에서 New repository secret을 누르고 Name과 Secret을 설정해주면 된다.
ssh 키를 넣을 때 주의점
[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에서 확인할 수 있다.
공부하면서 정리한 내용입니다. 모든 지적 감사히 받겠습니다:)
'AWS' 카테고리의 다른 글
[EC2] ubuntu "System restart required" 시 (0) | 2024.04.25 |
---|---|
[AWS] EC2 ssh 접속 시 ssh.ParsePrivateKey: ssh: no key found (0) | 2023.10.04 |
[AWS] AWS 데이터 센터 채용 설명회 후기(feat. 사람인) (0) | 2023.07.20 |
[AWS]SignatureDoesNotMatch 에러 (0) | 2023.03.20 |