전에도 비슷한 글을 쓴 적 있지만, 이번에는 조금 더 자세하게 포스팅 하고자 합니다.
이 글을 왜 쓰게 돼었느냐?!
그럼 왜 썼는지 알기 전에 간단하게 제 배포 시퀀스에 대해서 말씀드리겠습니당 ㅎㅎ
와 !! 간단하다~! 9개면 개꿀따리다~ 라고 생각하시는 개발자분 없으시겠죠…???
이 귀찮고 복잡한 프로세스를 수동으로 다 입력해야된다는 말입니다…ㅠㅠ
그렇다면 이 귀찮은 프로세스를 어떻게 해결 할 수 있느냐? 바로바로
github action 입니다!
GitHub Action은 GitHub 저장소에서 소프트웨어 개발 워크플로우를 자동화하는 도구입니다. 코드 변경 시 자동으로 빌드, 테스트, 배포 등의 작업을 수행할 수 있어 개발 프로세스를 간소화하고 효율성을 높입니다.
저는 저 귀찮은 프로세스를 해결하기 위해서 github action 이라는 도구를 사용했고,
어떻게 사용했는지 간단하게 말씀드리겠습니다!
이야기 하기 전에 일단 CI/CD 라는 단어 먼저 짚고 가면 좋을 것 같아요!
많이는 들어봤지만 정확한 개념을 짚고 넘어가봅시다!
CI란? GPT 선생님께 여쭈어봤습니다
CD 란?
CI 이후의 단계로 CD는 Continuous Delivery와 Continuous Deployment로 나뉩니다.
😃 결론적으로는 CI/CD는 코드의 변경사항이 발생했을 때 프로덕션에 배포를 하는데 , 하기전에 테스트, 빌드 등을 할 수 있는 것이군요!
저는 CI/CD 를 모두 github action으로 해결했다~
그렇다면 어떻게 사용했는지 workflow 한 번 보자구요~
name: 서버 배포
on:
push:
branches:
- main
jobs:
deploy:
name: 서버에 배포
runs-on: ubuntu-22.04
steps:
- name: 리포지토리 체크아웃
uses: actions/checkout@v3
- name: SSH 클라이언트 설치
run: sudo apt-get install -y openssh-client
- name: Git을 SSH로 설정
run: |
git remote set-url origin git@github.com:${{ secrets.GITHUB_REPOSITORY }}
- name: SSH를 통해 서버에 배포
uses: appleboy/ssh-action@v0.1.5
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
port: ${{ secrets.SSH_PORT || 22 }}
script: |
# nvm 설치 및 Node.js 버전 관리
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # nvm 초기화
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # bash_completion 초기화
# 원하는 Node.js 버전 설치 및 사용
nvm install 20.9.0
nvm use 20.9.0
node -v
npm -v
# 프로젝트 디렉토리로 이동 및 최신 코드 가져오기
echo "https://${{ secrets.GH_USERNAME }}:${{ secrets.GH_PAT }}@github.com" > ~/.git-credentials
git config --global credential.helper store
cd ~/프로젝트이름
git reset --hard
git pull origin main
# 의존성 설치
npm install
npm run build
# PM2로 애플리케이션 재시작
pm2 restart 프로젝트이름
천천히 워크 플로우를 보면서 말씀드릴게요!
일단 프로젝트의 루트 폴더에 .github > workflows > [워크플로우 이름].yml 로 파일을 만드셔야해요!
레포지토리의 Action 에 들어가셔서 new workflow를 통해 생성하셔도 상관은 없습니다!
저는 dev 브랜치에서 개발이 완료되고, 테스트를 통과했을 때 main 브랜치와 병합합니다.
그래서 main 브랜치에 push 됐을 때 이 워크플로우가 실행됐으면 했습니다!
name: 서버 배포 //원하는 workflow 이름!
on:
push: // push가 workflow를 발생시키는 트리거!
branches: // main 브랜치에서~
- main
현재 ec2 는 ubuntu 22.04 버전이고, node 는 20.9.0 버전을 사용하고 있습니다!
name: 서버에 배포
runs-on: ubuntu-22.04
steps:
- name: 리포지토리 체크아웃
uses: actions/checkout@v3
현재 워크플로우 실행 환경의 파일 시스템에 준비되며 이후 run에서 자유롭게 접근하고 수정할 수 있습니다.
- name: SSH 클라이언트 설치
run: sudo apt-get install -y openssh-client
SSH를 통해 서버에 접속하기 위해 OpenSSH 클라이언트를 설치합니다. github은 https가 아니라 ssh로 인증을 하기 때문에 필요합니다
- name: Git을 SSH로 설정
run: |
git remote set-url origin git@github.com:${{ secrets.GITHUB_REPOSITORY }}
Git 리모트를 SSH 방식으로 변경하여 서버에 SSH 키를 사용해 인증할 수 있도록 설정합니다.
- name: SSH를 통해 서버에 배포
uses: appleboy/ssh-action@v0.1.5
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
port: ${{ secrets.SSH_PORT || 22 }}
script: |
# nvm 설치 및 Node.js 버전 관리
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # nvm 초기화
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # bash_completion 초기화
# 원하는 Node.js 버전 설치 및 사용
nvm install 20.9.0
nvm use 20.9.0
node -v
npm -v
# 프로젝트 디렉토리로 이동 및 최신 코드 가져오기
echo "https://${{ secrets.GH_USERNAME }}:${{ secrets.GH_PAT }}@github.com" > ~/.git-credentials
git config --global credential.helper store
cd ~/프로젝트이름
git reset --hard
git pull origin main
# 의존성 설치
npm install
npm run build
# PM2로 애플리케이션 재시작
pm2 restart 프로젝트이름
저는 기본적으로 인스턴스에 nvm을 설치해서 사용중이기 때문에 nvm을 설치하고 사용하는 명령어를 추가했습니다.
npm을 인식하지 못하는 문제를 많이 겪었기 때문에 다시 한 번 설치해줬습니다.
혹여나 build전에 reset 하는 것은 종종 build 하는 과정에서 다른 파일들이 설치될 수 있기 때문에 그것을
초기화 하기 위해서 reset 해주고 다시 pull 했습니다!
짜잔~ 아주아주 잘됩니다~!!!
이 게시물이 다른분들이 스크립트 작성하는데 도움이 되길 바라며..
혹시나 안되거나 의문점 있으시면 댓글 달아주시면 감사하겠습니다 ㅎㅎ