봇 배포에 Github Action 적용

2024. 1. 17. 17:13·Study/Others

사실 지금 굴리는 봇은 크기도 크지 않고 구현 요구 사항에 따라 이리저리 서버를 옮겨다니기도 했다. 테스트용 Repo와 내가 실제로 배포하기 위해 사용하는 비공개 Repo 그리고 공개용 Repo가 계정을 넘나들며 있었기 때문에 역시 갈수록 번거로워짐이 커지기도 했다. 따라서 공개 Repo로 배포까지 할 수 있게 하고 그 Repo에서 테스트용 브랜치를 만들어 한방에 관리하기로 했다. 진작 했어야 했는데 늦어진 것은 사실이다. 주요 변경점은 아래와 같다.

 

 

  1. Repo들의 통합
    공개용, 배포용, 테스트용을 하나의 Repo로 통합
  2. Github Action 적용
    공개용 main 브랜치에 push 이벤트가 있다면 인스턴스에서의 배포까지 자동 수행
  3. 서버 변경
    Cloudtype이 본격적으로 유료화를 시작했기 때문에 즉시 이탈 후 Amazon EC2로 돌아갔다.

 

 

1. Amazon EC2 인스턴스로 복귀

이전에 잠시 사용하던 우분투 인스턴스로 돌아갔을 뿐이다. SSH 사용을 위해 잠시 손본 것 말곤 달라진 것이 없다.

 

 

2. Repo들의 통합

테스트용은 로컬에, 배포용 비공개 Repo는 옛 계정에, 공개용 Repo는 현 계정에 있었다. 로컬에서 테스트한 후 실제 배포 시에 문제가 없다면 공개 Repo에 최종 코드를 커밋했었다. 의도한 것이 아니라 하다 보니 이렇게 된 것이라 흐름 상 계속 이렇게 하게 됐는데 솔직히 하던 중간에도 이게 뭔 짓인가 싶었으니... 옛 계정은 완전히 버리고 현 계정에 통합했다. main 브랜치를 통해 코드 공개 및 배포를 하고, test 브랜치로 테스트 후 문제가 없다면 main 브랜치로 PR을 넣어 Merge 하는 형태가 되었다. 이게 맞지.

 

 

3. Github Action 적용

이게 다 워크플로우를 통한 원클릭 배포를 위한 과정이었다.

 

  1. main 브랜치에 push가 일어나면
  2. EC2 인스턴스에 ssh로 접속
  3. 기존 실행 중인 봇 종료
  4. 변경 사항을 pull
  5. 봇 재실행

 

을 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' 카테고리의 다른 글

제11회 빅데이터분석기사 합격 후기  (0) 2025.12.19
제11회 빅데이터분석기사 필기 짧은 후기  (0) 2025.09.21
리눅스 업데이트 미러에 카카오 미러 적용  (0) 2024.11.20
[WSL2] 가상 디스크 용량 압축하기  (0) 2023.02.13
'Study/Others' 카테고리의 다른 글
  • 제11회 빅데이터분석기사 합격 후기
  • 제11회 빅데이터분석기사 필기 짧은 후기
  • 리눅스 업데이트 미러에 카카오 미러 적용
  • [WSL2] 가상 디스크 용량 압축하기
BVM
BVM
  • BVM
    E:\
    BVM
  • 전체
    오늘
    어제
    • 분류 전체보기 (173)
      • Thoughts (14)
      • Study (75)
        • Japanese (3)
        • C++ & C# (50)
        • Javascript (3)
        • Python (14)
        • Others (5)
      • Play (1)
        • Battlefield (1)
      • Others (10)
      • Camp (73)
        • T.I.L. (57)
        • Temp (1)
        • Standard (10)
        • Challenge (3)
        • Project (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • 본 블로그 개설의 목적
  • 인기 글

  • 태그

    네트워크 프로그래밍
    클라우드
    Dalamud
    C++
    베데스다
    cloudtype
    Selenium
    Server
    docker
    7계층
    boost
    FF14
    로깅
    포인터
    네트워크
    JS
    db
    암호화
    discord py
    OSI
    bot
    Python
    c#
    IOCP
    프로그래머스
    Asio
    Network
    discord
    스타필드
    서버
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
BVM
봇 배포에 Github Action 적용
상단으로

티스토리툴바