CI/CD

yboy·2022년 9월 13일
1

Learning Log 

목록 보기
18/41
post-thumbnail
post-custom-banner

학습동기

우아한테크코스 프로젝트에서 CI/CD를 적용해 봤다. 처음 접하는 개념이라 적용하는데 꽤나 애먹었었는데 정작 개인적으로 기록은 하지 못했었다. 차근차근 정리를 해보기 위해 학습을 다짐하게 되었다.

학습내용

우선 CI/CD가 뭔지 부터 알아보자.

애플리케이션 개발 단계를 자동화하여 애플리케이션을 보다 짧은 주기로 사용자에게 제공하는 방법

내가 느낀 CI/CD는 간단하게 말해서 위와 같다. 그럼 이제 CI, CD를 분리해서 각각이 뭔지에 대해 알아보자.

CI (Continuous Integration)

빌드/테스트 자동화 과정

사실 개발자가 직접 빌드/테스트를 할 수도 있는데 왜 CI를 해야만 할까? 그리고 우리 팀은 왜 CI를 적용했을까?

우리 팀이 CI를 적용한 이유는 한 마디로 배포 때문이다. 배포를 한다는 건 우리가 만든 서버가 실 사용자들이 사용할 수 있는 서버가 된다는 것이다. 이런 배포된 서버의 테스트와 빌드가 안되는게 말이 될까? 말이 안된다고 생각한다. 그리고 인간은 충분히 실수할 수 있는 존재이기 때문에 실수를 사전에 예방하기 위해 CI를 해야 한다고 생각한다.

사용자 측면에서 바라보는 것을 넘어서 개발자 측면에서 생각해 봤을 때도 빌드/테스트를 배포 전에 자동화 해주는 것은 생산성에 아주 좋다고 생각한다.

정리해 보자면,

1. 사용자들이 사용하게 될 서버의 빌드/테스트는 무조건적으로 성공해야 한다.
2. CI를 하면 개발자의 생산성이 향상된다.

두 가지 이유에서 우리는 CI를 적용하였다.

그럼 이제 우리가 CI를 어떻게 적용했는지 알아보자.
우리는 github actionjenkins를 이용해 CI를 적용했다. 왜 도구를 두 개나 이용했을까?

Github action

우선 github action으로 feature -> develop(프로젝트에서 github flow에서 hotfix 브랜치가 추가된 브랜치 전략을 사용하고 있다.) 브랜치로 머지될 기능을 테스트, 빌드해 잘못된 코드가 develop 브랜치로 머지되는 것을 사전에 방지하고자 했다.

Jenkins

그리고 jenkins로 develop 브랜치의 코드가 제일 중요한 배포 서버에서 테스트, 빌드가 안돌아가는 상황을 방지하고자 했다.

이제 CD에 대해 알아보자.

CD(Continuous Deployment/ Delivery)

배포 자동화 과정

CD는 왜 필요할까?
답을 하기 위해 우리가 어떻게 배포를 해왔는지 순서대로 알아보자.

1. 배포를 할 때마다 인스턴스에 접근해 git pull을 받고 build하고 jar를 실행한다.

2. 배포를 할 때마다 인스턴스에 접근해 shell script를 실행한다(./deploy.sh)

3. CD 도구를 이용해 위의 모든 것을 자동화 한다.

1, 2, 3 순서로 배포 방식을 개선해 나가면서 생산성이 점점 증대되었다. 생산성 면에서 CD는 필수 불가결한게 아닐까? 라는 생각을 한다.

정리해 보자면,

  1. 개발자의 수고를 줄여줌으로서 개발자가 더 생산적인 일에 몰두할 수 있게 도와준다.
  2. 중복되고 반복되는 일을 줄여준다.

크게 두 가지 이유에서 CD를 적용하였다.

그럼 우리는 어떻게 CD를 적용했을까?

Jenkins

jenkins가 또 등장했다. jenkins를 CI/CD 도구라고 하는데 그럼 다른 CI/CD 도구들도 많을 텐데 왜 jenkins를 사용했을까?

  1. 커뮤니티가 활성화 되어 있어 처음 CI/CD를 도입하는 입장에서 레퍼런스가 많았다.
  2. CI/CD의 모든 기능을 무료로 사용할 수 있다.

두 가지 이유에서 jenkins를 선택하였는데 CI/CD를 처음 써보는 입장에서 1번의 이유가 매력적으로 다가왔다.

동작방식

  1. develop이나 main에 코드가 머지되었을 때 github hook을 jenkins가 감지한다.
  2. 젠킨스가 코드를 test&build 한다.
  3. ssh로 build의 산출물인 jar 파일을 was 서버로 전송 후(jenkins 서버와 was 서버를 따로 두었다.), 스크립트가 실행된다.

Trouble Shooting

aws의 값 싼 ec2인 t4.micro를 사용하기 때문에 발생 했던 것으로 보인다....

Swap Memory

trouble.

성능이 낮은 t4.micro 인스턴스를 사용하고 있다. 성능의 문제로 jenkins가 실행되는 서버가 다운되는 상황이 발생했다. (cpu 사용량 증폭)

solution.

swap memory를 설정해 주어 HDD의 자원을 사용해 cpu 사용량 증폭 문제 해결

참고
swap memory
:RAM이 부족할 경우가 있으므로 HDD의 일정공간을 마치 RAM처럼 사용하는 것이다. 반 강제적으로 RAM을 증설한 듯한 효과를 볼 수 있다.

마무리

CI/CD를 처음 접해봤는데 정말 신기하고 편리한 기술인 것 같다. 새로운 기술을 처음 접할 때는 적용하기 매우 까다롭고 힘들지만 고통을 이겨내면 꿀이 떨어질 수도? 있다는 걸 깨달았다. web server로 nginx도 도입해 봤는데 다음엔 nginx에 대해서 정리해 봐야겠다.

post-custom-banner

0개의 댓글