본문 바로가기
개발/개발 방법 정리

CI/CD 어떻게 구현했는지 흐름 정리

by 슴새 2023. 1. 28.
반응형

이번 프로젝트에서 처음으로 ci/cd를 구축해보았다.

난 배포 쪽은 경험이 많지 않아서 다른 백엔드 팀원분의 도움을 많이 받았다.

하지만 그만큼 배운 것도 많아서 까먹기 전에 어떤식으로 구축했는지 흐름만 간략히 정리해 보려고 한다.

 

혹시 강좌글 같은 걸 기대하고 이 글을 클릭하셨다면.. 신속한 뒤로가기를 추천합니다....

cicd 구축에는 docker, ansilbe, aws를 사용하였다.

프론트는 react, socket.io를 이용하였고 백엔드는 intlleij, mysql을 이용하였다.

 

- jenkins: 커밋/푸시가 발생하면 자동으로 빌드

- docker: 리눅스의 응용 프로그램들을 프로세스 격리 기술들을 사용해 컨테이너로 실행하고 관리하는 오픈 소스 프로젝트

- ansible: 여러개의 서버를 효율적으로 관리할 수 있게 해주는 환경 자동화 도구

 

협업에는 gitlab을 사용하고 있는데 gitflow 전략을 사용하고 있다.  react는 develop_front 브랜치에서, 소켓 서버 관련 코드들이 develop_front_server 브랜치에서, 백엔드 코드들은 develop_back 브랜치에서 작업을 하고 있다.

 

aws ec2 인스턴스를 만들면서 발급할 수 있는 ppk 키를 사용하여 ec2에 접속한다. putty든 cmd든 뭐 편한걸로.

그리고 거기에다 docker를 설치한다.

 

이후 docker에 jenkins 컨테이너와 ansible 컨테이너를 만든다. 

jenkins에는 총 3개의 아이템이 있는데 front_jeankins, socket_jenkins, backend_jenkins라고 이름붙였다.

front_jeankins는 develop_front 브랜치의 변화를 감지하면 빌드-tar 파일을 만들어 ansible 서버로 넘긴다.

backend_jenkins는 develop_back 브랜치의 변화를 감지하면 빌드-war 파일을 만들어 ansible 서버로 넘긴다. 

socket_jenkins는 조금 다른데, develop_front_server 브랜치의 변화를 감지하면 server.js와 package.json, package-lock.json 코드를 ansible로 넘긴다.(프론트의 소켓 서버는 빌드 결과물이 필요한게 아니라 서버 관련 코드들이 필요하기 때문)

jenkins는 기본적으로 8080 포트에서 돌아간다. 서버도메인:8080으로 접속하면 jenkins 웹에 접근할 수 있는데 여기서 이런 일련의 과정을 설정할 수 있다. 

 

ansible은 전달받은 빌드 결과물들을 가지고 docker image를 만든다. docker image는 실행 프로그램 같은 것이다. 이후 이 이미지를 가지고 컨테이너를 만든다. 이렇게 빌드 결과물을 컨테이너로 만드는 과정은 ansible 서버에 yml 파일을 작성하여 설정한다. yml 파일에는 기존에 돌아가고 있던 컨테이너를 멈춘 뒤 없애고 새로 전달받은 빌드 결과물을 통해 이미지 만들고 그걸로 다시 컨테이너 만들어서 ㅁㅁㅁ포트에서 돌려! 뭐 이런 명령어들이 들어가 있다. yml 파일 작성 외에도....각 컨테이너에 접속하기 위한 keygen 설정이나 host 설정 등도 추가로 해야한다.

 

그러면 이제 완료된 것이다...

깃헙에 푸시만 하면 자동으로 배포가 진행된다.

변경사항이 있을때마다 빌드하고 그 결과물을 aws에 낑낑대며 올리는 그런짓을 할 필요가 없다...푸시만 하면 배포가 자동으로...혁명이네...

 

아 그리고 데이터베이스의 경우 아직 서버에 구축은 안했는데... 일단 계획상으로는 mysql 컨테이너를 따로 만들 것 같다. 처음엔 사비가 좀 더 나가더라도 aws의 rds를 사용하려고 했는데 이 미친 도커에서 무려 mysql 컨테이너도 만들 수 있다는 것을 깨닫고 급 노선 변경... rds냐 docker 컨테이너냐는 개발자마다 의견이 분분한 것 같긴 한데 우리팀은 일단 사비가 안나가는게 중요하니까 도커 컨테이너로 쓸 것 같다. 

 

...난 도커에 대해 다른 머신에서도 같은 환경을 구축할 수 있는 편리한 가상화도구~ 뭐 이정도로 인식을 하고 있었는데...

각기 다른 컨테이너를 여럿 둠으로써 ec2 인스턴스 하나만 가지고 이 모든 것을 다 할 수 있다는 것이 너무나도 충격적이었다. 난 우리 프로젝트 배포하려면 인스턴스 한 3개는 만들어야 할 줄... 도커에 대해 찾아볼때 관련 설명을 본 것 같기도 한데...역시 몸으로 직접 겪으니까 도커가 얼마나 미쳤는지 더욱 와닿는거 같다. 

 

근데 mysql은 보안 설정 제대로 안하면 해킹당해서 데이터가 다 날아가고 '너의 데이터들을 살리고 싶다면 내게 비트코인을 보내라' 라는 데이터를 담은 테이블만 하나 달랑 남는다는 소리를 들어서....(aws 해킹 과금처럼 그랬다더라가 아니라 선배들, 옆팀 팀원들이 겪은 충격실화) 겁이 나는 상황이기 때문에 db 관련한 부분은 이번주 주말~다음주중에 조금 신중하게 시작하려고 한다. 데이터야 뭐 우리가 회사도 아니니 중요하지 않긴 한데... 해킹당해서 인스턴스 초기화하게 되면 이 모든 짓을 다시 해야 한다는게 너무 두려움...

 

반응형

댓글