
개요
Docker를 통해 컨테이너에서 서버를 띄울 준비가 완료 되었으므로 이제 빌드 및 배포 자동화를 적용하기에 적합한 환경이 되었다. 해당 프로젝트에서는 github의 gitActions을 통한 CI/CD파이프라인 구축했다.
CI/CD의 장점은 로컬 환경에서 로직 수정 후 github에 push하게 될 경우 빌드 및 배포의 전 과정이 자동으로 수행되게 된다. 즉, 윈도우 환경의 Visual Studio에서 로직 변경 및 테스트 후 이상이 없어 github에 push를 하게 되면 gitActions를 통해 AWS EC2 인스턴스에 SSH연결 후 서버 재빌드 및 docker down과 up을 수행하여 최신 버전의 서버를 배포할 수 있게 된다.
github secret설정
AWS EC2 인스턴스에 접속이 필요한 경우 관련 환경 변수를 레포지토리의 secret에 설정해 주면 된다.

레포지토리 설정 -> Secrets and variables -> Actions로 이동하게 되면 secret을 등록할 수 있는 화면을 볼 수 있다.

New repository secret버튼을 클릭하면 새로운 secret을 등록할 수 있는 화면이 노출된다.
이전의 포스트에서 마치 .env파일을 작성하여 시스템 환경변수를 사용했던 것 처럼 해당 secret을 작성하게 돠면 깃 허브 액션 관련 워크플로우에서 등록한 secret을 환경 변수로 사용할 수 있게 된다.
주로 노출되면 안되는 AWS EC2 IP, 포트, pemkey등의 민감 데이터를 환경 변수로 등록하고, CI/CD관련 yml파일에서 해당 secret의 이름을 사용하여 은닉화의 용도로 사용하면 된다.
.github/workflows/deploy.yml
gitActions를 활용한 CI/CD파이프라인을 구축하기 위해선 레포지토리의 루트 디렉토리에 .github디렉토리가 존재해야 한다, 그 하위 디렉토리에 workflows디렉토리를 생성하고 내부에 yml파일이 존재한다면 push등 github저장소에 이벤트가 발생될 경우 정의해 놓은 워크플로우를 실행하게 된다.
name: Deploy to EC2
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: SSH and run ci.sh
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_SSH_KEY }}
script: |
cd ~/smashup-server-test/MatchingServer
chmod +x ci.sh
./ci.sh
해당 파일은 main브랜치에 push이벤트가 발생한 경우 EC2에 접속하여 서버 빌드 및 배포 자동화를 진행하는 워크 플로우를 정의해놓은 파일이다. 이벤트가 발생하면 정의해 놓은 secret을 활용하여 AWS EC2에 SSH접속을 진행하며, 서버가 위치한 디렉토리를 이동해 linux환경에서의 빌드 및 배포를 진행하게 된다.
스크립트에서 볼 수 있듯 우분투 홈 디렉토리에서 smashup-server-test/MatchingServer 디렉토리로 이동하게 된다, 이후 ci.sh파일의 권한을 수정하여 실행 가능한 상태로 만든 후 ci.sh파일을 실행하여 linux환경에서의 빌드 및 배포 자동화 스크립트를 실행한다.
[메타버스 게임] 캐쥬얼 배틀로얄 프로젝트 Linux 빌드 환경 세팅(Makefile)
[메타버스 게임] 캐쥬얼 배틀로얄 프로젝트 Linux 빌드 환경 세팅(Makefile)
개요Windows에선 VisualStudio를 통해 편하게 빌드할 수 있었다면, Linux환경에선 Makefile을 통해 편하게 빌드할 수 있다.CMake가 크로스 플랫폼에서의 빌드 환경에 강점이 있다고 하는데 실제로 사용해
zzzz955.tistory.com
리눅스 환경에서의 빌드 자동화는 위 포스트를 참고하면 된다.
회고
지난 프로젝트에서도 Docker를 활용한 서버 컨테이너화와 CI/CD파이프라인을 구축을 해보았지만, 로컬 환경에서의 배포 이전 개발 단계 혹은 테스트 단계를 지나 실제 배포가 된 이후에는 CI/CD를 통해 로컬 개발 환경과 배포 개발 환경의 동기화를 자동으로 수행해 주는 것이 주는 편리함이 정말 크게 와닿았다.
비록 이전 프로젝트는 웹 프레임워크를 활용한 stateless서버이므로 이미 서버가 배포된 상태에서의 재빌드 및 배포가 어느정도 자유로웠지만 현재 프로젝트는 소켓 서버로서 연결된 클라이언트가 존재할 경우 서버를 내리고 다시 올리는 행위가 제한적이었다. 따라서 서버와 세션의 소멸자에 현재 상황에서 강제로 소켓과 서버를 닫을 때의 방어 코드 작성이 매우 중요하다는 것을 깨닫게 되었다.
'프로젝트 > 메타버스 게임' 카테고리의 다른 글
[메타버스 게임] 캐쥬얼 배틀로얄 프로젝트 트러블 슈팅 (1) | 2025.04.17 |
---|---|
[메타버스 게임] 캐쥬얼 배틀로얄 프로젝트 docker 컨테이너화 (1) | 2025.04.10 |
[메타버스 게임] 캐쥬얼 배틀로얄 프로젝트 환경변수 세팅(.env) (0) | 2025.04.09 |
[메타버스 게임] 캐쥬얼 배틀로얄 프로젝트 유틸리티 (1) | 2025.04.09 |
[메타버스 게임] 캐쥬얼 배틀로얄 프로젝트 레포지토리 계층 (1) | 2025.04.09 |