Step3-kakao-tech-campus / Team3_BE

[카테캠 1기] 번개 지향 볼링 모집 커뮤니티 "번개볼링"의 백엔드 서버입니다.
2 stars 4 forks source link

CI/CD 파이프라인 구축 #129

Closed jagaldol closed 10 months ago

jagaldol commented 10 months ago

Summary

CI와 CD 파이프라인을 구축하였습니다. 크램폴린 상의 배포는 아니고 AWS EC2 상의 배포입니다.

Description

별도의 레포를 만들어 서버 상에서 CI로 PR merge block이 잘되는지, CD로 배포가 잘되는지 확인하였습니다.

또한, 현재 AWS 상의 spring boot application은 기존 screen 쉘로 배포가 아닌 nohup으로 배포가 되는 중입니다.

CI(Continuous Integration)

master, develop, weekly/** 브랜치에 대해 Pull request가 발생할 때 일어나는 액션입니다.

레포를 받은 뒤, ./gradlew build를 통해 정상 빌드가 되는지 확인합니다.

build 과정에 test도 포함되어 있기 때문에 테스트 및 빌드가 정상적으로 되는지 1차적으로 확인해주는 역할을 합니다.

image

브랜치 룰의 Require status checks to pass before merging을 활성화하여 해당 job을 등록함으로써 CI가 성공해야지 merge를 able하도록 강제하였습니다.

CD(Continous Deployment)

master, develop, weekly/** 브랜치에 대해 push가 발생할 때 일어나는 액션입니다.

저희 브랜치가 과하게 많아서 3가지 브랜치 타입을 다 등록하였지만, 카테캠이 종료되고 완전한 배포 단계에 돌입하면 master 브랜치에만 CD를 거는게 나을 거 같습니다.

그때가 되면 weekly도 쓸 필요 없고 develop에서 개발하여, master에 업로드하면 배포 하는 식이 나을 거 같습니다.
현재는 편의성을 위해 전부 넣었습니다.

행동은 ssh로 접속하여 git pull 받은 후 build 후 nohup으로 실행하는 것입니다.

image

ssh 접속을 위한 secret은 위와 같이 등록하였습니다. REMOTE_IP의 경우 도메인이 새로 구입할 예정이기 때문에 도메인을 넣지 않고 ec2의 public ip address로 넣었습니다.

  1. secret 정보를 사용하여 ssh 접속
  2. 레포 폴더로 이동
  3. git pull
  4. application 재빌드
  5. .env를 사용하여 환경변수 설정
  6. nohup.sh 실행

nohup.sh

이제 screen이 아닌 nohup으로 백그라운드로 실행합니다.

주요하게 봐야하는 명령어는 이 명령어입니다.

nohup java -jar -Dspring.profiles.active=product build/libs/server-0.0.1.jar >> "$filePath" 2>&1 &

>> "$filePath" 2>&1로 $filePath에 로그를 기록하라고 해놨습니다. 2>&1는 에러 로그나 실행 로그 전부 다 기록하라는 것입니다.

filePath는 아래의 코드로 만들어집니다.

date=`date +%y-%m-%dT%H-%M-%S`
filePath=~/logs/springboot_nohup.$date.out

따라서 생성은 아래와 같이 되어있습니다.

~/logs$ ls
springboot_nohup.23-11-09T02-09-45.out  springboot_nohup.23-11-09T02-18-27.out

실행 시간별로 파일을 새로 만들도록 하였습니다. 단순하게 cat 명령어나 혹은 별도의 실시간 트랙 가능한 명령어를 사용하여 로그를 확인할 수 있습니다.

8080 포트를 겹치게 사용할 수 없으므로 실행 전에 기존 java 프로세스를 종료합니다.

# 기존에 실행 중인 Java 프로세스 종료
PID=$(ps -ef | grep '[j]ava -jar' | awk '{print $2}')
if [ ! -z "$PID" ]; then
  echo "기존 Java 프로세스 종료: $PID"
  kill $PID
fi

이건 서버에 자바가 하나만 돌아가고 있다고 가정하여 kill하는 코드입니다.

이상으로 CI/CD 파이프 라인을 구축하였습니다.

Related Issue

Issue Number: close #94

jagaldol commented 10 months ago

아직 weekly 브랜치에 workflow 파일들이 안들어가서 이 PR에는 CI 액션이 동작하지 않고 있습니다. 마찬가지로 브랜치룰도 이 레포에는 아직 적용하지 못하고 있습니다. merge되는 대로 적용하겠습니다.

테스트 레포에서 실행한 github action 실행 결과를 참고하시면 좋겠습니다.

현재 AWS EC2에 테스트 레포의 CD를 통해 이상없이 배포중입니다.

jagaldol commented 10 months ago

오.. 기본적인 설정은 잘 들어가 있는 것 같네요! 이 정도면 기본적인 테스트로는 괜찮은 것 같아요

추후에 리팩토링 할 수 있는 점으로 아이디어를 생각해보자면,

  • 저희가 s3로 사용하고 있어서, access key도 설정해줄 수도 있고요.
  • 여기서 server time zone 설정도 해줄 수 있습니다!
  • Locale 설정도 가능합니다

추가적인 팁이 있다면.. docker image를 사용할 때는 버전을 알 수 없는 latest 보다 버전을 알 수 있도록 명시된 버전을 사용하는 게 더 좋아요 😄 ex. ubuntu-20.04

@sososo0 일단 테스트 내부적으로는 s3를 mock하여 상관없게 하였습니다. 물론 s3 동작 테스트도 하면 좋겠지만 시간이 부족했거든요. 팁 감사합니다. 추후(카테캠 이후) 업데이트할 여건이 된다면 반영해보겠습니다!