발단
기존 프로젝트에서 ec2에 접근하고 수동으로 pull 받아서 pm2를 이용하여 배포를 하고 있었다.
가장 큰 단점은 코드 구현 -> 코드 리뷰 -> 배포 까지의 과정이 너무 길어져 빠르게 대응하기 힘들다는 것이었다.
테스트 코드를 짜고 CI/CD를 구현한다면 좋겠지마는 여기에 드는 리소스를 무시할 수 없으므로 일단 github actions를 이용하여 배포를 할 수 있게 해보도록 하였다.
Github 스크립트 짜기
Repository > Actions에 들어가면 기본적으로 해당 언어에 맞는 템플릿을 제공한다.
우리는 Node.js를 이용할 것이다.
- 스크립트 파일 내용
name: bbang-map-test #배포 파일 이름
on:
workflow_dispatch: #Pull request나 merge시로 설정할 수 있지만, 안전하게 수동 트리거를 하는 방식을 사용했다.
jobs:
build_and_deploy:
runs-on: ubuntu-20.04
steps:
- uses: appleboy/ssh-action@master #ec2에 연결하기 위해 ssh 설정을 하는 방법이다.
with:
host : ${{secrets.TEST_REMOTE_IP}}
username: ${{secrets.TEST_REMOTE_SSH_ID}}
key: ${{secrets.TEST_REMOTE_SSH_KEY}}
port: ${{secrets.TEST_REMOTE_SSH_PORT}}
script: |
sudo git config --global --add safe.directory /home/***/BBang-map-test #디렉토리가 안전하지 않다는 오류를 방지하는 코드
sudo git config --global --add safe.directory ~/BBang-map-test
sudo git config --global --add safe.directory ~/BBang-map-test/BBangMap-Server
sudo git config --global --add safe.directory ~/BBang-map-test/BBangMap-Server/src
cd /home/ubuntu/BBang-map-test/BBangMap-Server/src #pull 받을 경로로 이동
# git pull 명령어 만으로 되는 사람들도 있던데 필자는 username이 없다는 에러가 발생하여 추가하였다.
git pull https://${{secrets.GIT_USERNAME}}:${{secrets.GIT_PASSWORD}}@github.com/bbangmap/BBangMap-Server.git
sudo npm install #디펜던시를 추가해준다.
pm2 restart bbang-map-server #실행되고 있는 pm2의 해당 프로세스를 다시 실행해준다.
uses: 는 github actions에서 미리 정의된 스크립트를 실행한다.
actions/checkout@v3 를 사용하면 git pull을 자동으로 받을 수 있지만,
pull을 받는 경로가 /home/runner/work 로 임의로 설정되어 artifact를 사용하여 업로드하고 다시 다운로드 받거나 해당 위치에서 실행을 하여야한다. 필자는 이미 실행되고 있는 경로에서 계속 pull을 받고 재실행을 하고 싶어 수동으로 pull을 받아서 사용하였다.
- ${{secrets.~~}} 설정하기
Settings > Secrets > Actions에서 Repository secrets을 설정하고, 스크립트 실행 시 불러올 수 있다.
GIT_USERNAME: 깃 로그인시 아이디
GIT_PASSWORD: 깃 로그인시 비밀번호 (최근에 비밀번호를 사용하지 못하게 하여 깃허브 마이페이지에서 비밀번호 토큰을 만들어서 이를 사용)
REMOTE_IP: 연결할 EC2 ip, (ec2-#-##-###-###.ap-northeast-2.compute.amazonaws.com)
REMOTE_ID: 연결할 EC2 id (ubuntu)
REMOTE_SSH_PORT: 연결할 포트 (22)
REMOTE_SSH_KEY: .pem 내용 (터미널에서 cat 명령어로 확인할 수 있다.
주의할 점 : -----BEGIN RSA PRIVATE KEY----- 부터
-----END RSA PRIVATE KEY----- 까지 입력해야한다. (맨 뒤 %가 붙어있다면 꼭 제거하고 복사하기)
- 트리거 실행시키기
Actions > 해당 워크플로우 이름 클릭 > Run workflow를 하여 실행