사실 지금 굴리는 봇은 크기도 크지 않고 구현 요구 사항에 따라 이리저리 서버를 옮겨다니기도 했다. 테스트용 Repo와 내가 실제로 배포하기 위해 사용하는 비공개 Repo 그리고 공개용 Repo가 계정을 넘나들며 있었기 때문에 역시 갈수록 번거로워짐이 커지기도 했다. 따라서 공개 Repo로 배포까지 할 수 있게 하고 그 Repo에서 테스트용 브랜치를 만들어 한방에 관리하기로 했다. 진작 했어야 했는데 늦어진 것은 사실이다. 주요 변경점은 아래와 같다.
- Repo들의 통합
공개용, 배포용, 테스트용을 하나의 Repo로 통합 - Github Action 적용
공개용 main 브랜치에 push 이벤트가 있다면 인스턴스에서의 배포까지 자동 수행 - 서버 변경
Cloudtype이 본격적으로 유료화를 시작했기 때문에 즉시 이탈 후 Amazon EC2로 돌아갔다.
1. Amazon EC2 인스턴스로 복귀
이전에 잠시 사용하던 우분투 인스턴스로 돌아갔을 뿐이다. SSH 사용을 위해 잠시 손본 것 말곤 달라진 것이 없다.
2. Repo들의 통합
테스트용은 로컬에, 배포용 비공개 Repo는 옛 계정에, 공개용 Repo는 현 계정에 있었다. 로컬에서 테스트한 후 실제 배포 시에 문제가 없다면 공개 Repo에 최종 코드를 커밋했었다. 의도한 것이 아니라 하다 보니 이렇게 된 것이라 흐름 상 계속 이렇게 하게 됐는데 솔직히 하던 중간에도 이게 뭔 짓인가 싶었으니... 옛 계정은 완전히 버리고 현 계정에 통합했다. main 브랜치를 통해 코드 공개 및 배포를 하고, test 브랜치로 테스트 후 문제가 없다면 main 브랜치로 PR을 넣어 Merge 하는 형태가 되었다. 이게 맞지.
3. Github Action 적용
이게 다 워크플로우를 통한 원클릭 배포를 위한 과정이었다.
- main 브랜치에 push가 일어나면
- EC2 인스턴스에 ssh로 접속
- 기존 실행 중인 봇 종료
- 변경 사항을 pull
- 봇 재실행
을 push 한방에 해결하게 되는 식이다. 명령어 핫 리로드 같은게 분명 가능할 텐데... Discord.js엔 편리한 핫 리로드 방법이 있을지도 모른다. 어차피 봇을 파이썬에서 JS로 재작성할 생각이니 그때 알아보기로 하자.
워크플로우 적용을 위해 아래와 같이 yml 파일을 작성했다.
name: Update and restart script on EC2
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3.3.0
- name: Connect to EC2 and restart script
uses: appleboy/ssh-action@master
with:
key: ${{ secrets.PRIVATE_KEY }}
host: ${{ secrets.HOST }}
username: ${{ secrets.USER }}
port: ${{ secrets.PORT }}
timeout: 40s
script: |
(
echo "### Change directory to the bot folder ###"
cd ${{ secrets.BOT_DIR }}
echo "### Current directory ###"
pwd
echo "### Kill the bot ###"
./kill_bot.sh
echo "### Pull the latest code ###"
git pull
chmod -R 750 ../Chariot
echo "### Restart the script ###"
nohup python3 chariot.py > chariot.log 2>&1 &
)
권한 문제 때문에 정말 시간을 많이 날렸다. 큰 문제는 Repo를 clone해 올 때 ssh를 통해 clone 해오는 방식으로 해결했다. 그렇다면 pull이나 commit 및 push 같은 행동들에 대해 자격 증명을 요구하지 않는다. 봇 프로세스를 죽이는 과정에서 한방에 여러 개의 프로세스를 죽이게 되면 에러가 생기면서 Job이 제대로 진행되지 않고 중간에 끊겨버리는 일이 발생했다. 이는 핵심적인 프로세스 단 하나만 죽이는 것으로 일단은 해결했다. 나중에 문제가 생길 수도 있을 것 같다.
많은 실패가 있었으나 어떻게든 내가 원하는 동작은 하게 됐다. 아마 js로 재작성하게 되면 과정이 더 깔끔해질 수 있을 것 같다.
좀 일이 커질 수도 있지만 봇 관리용 GUI 프로그램도 만들 구상도 하고 있으나 정말 할 지는 모르겠다.
'Study > Others' 카테고리의 다른 글
리눅스 업데이트 미러에 카카오 미러 적용 (0) | 2024.11.20 |
---|---|
[WSL2] 가상 디스크 용량 압축하기 (0) | 2023.02.13 |