오늘 면접에서 깃, 깃허브, CI/CD, 형상관리, 젠킨스에 관해서 공부를 해두는 것이 좋다는 이야기를 듣게 되었다.
그래서 적어보는 글이고, 내가 혼란스러웠던 내용도 풀어나가보려고 한다.
Jenkins에 대한 활용법이 아니라 CI/CD이론에 대한 내용만 존재한다는 점(....)
사용법이나 활용법에 대해서는 추후 공부를 하고 적용을 해보면서 올릴 것이다!
https://www.youtube.com/watch?v=0Emq5FypiMM&t=216s
내가 맨 처음 접했던 것은 이 영상이였다.
부트캠프를 다니기 전 이것저것 자료를 보면서 봤던 것 중 하나였는데 그때는 그냥 넘어갔다.(이게 무슨 말인데?)
그리고 수업을 진행하면서 CI/CD라는 것을 배우면서 어떤 것인지에 대한 이해는 생겼다.
그래서 프로젝트에는 적용해놨다고 내 이력서에도 박아놨다.
그런데 아무리 생각해도 이해가 되지 않는 것이 있었다.
CI(Continuous Integration)는 지속적 통합이라는 뜻을 가지고 있다.
CD(Continuous Deployment)는 두가지 뜻이 있지만, 나는 지속적 배포라는 말로 주로 사용한다.
지속적 제공이라는 의미도 존재한다.
하지만? 여기서 CI란 도대체 무엇인가?
CD는 명확하다. 지속적 배포라는 것으로 특정한 프로그램에 의하여 레포에 내용이 바뀔 경우 그것을 갱신해주는 것이다.
CI는? 지속적 통합이라는 말 자체가 상당히 애매모호한 이야기라고 생각한다.
그리고 툭하면 붙는 것은 Jenkins를 활용한 CI/CD인데
그렇다면 Jenkins는 내가 작업한 것을 키가 입력할 경우에 알아서 커밋 풀리퀘 머지까지 다 해준다는 뜻인걸까?
말이 안된다. 왜냐하면 코드상에 문제가 있을 수도 있는데 머지까지 한다는 것은 절대로 발생하면 안되는 중대사항이다.
아니 그래서 CI가 뭔데
활동하고 있는 커뮤니티에 물어본 결과 CI는 어떠한 애플리케이션이 아니라 사람의 행동이라는 것이었다.
즉 개발을 하면서 자신이 작업을 한 것에 대하여 끊임없이 PR을 날리고 Merge를 하는 것 자체가 CI(지속적 통합)이였다.
그럼 여기서 다시 한번 정리를 해놓고 다음 이야기로 넘어가도록 하자.
그럼 왜 사람들은 맨날 Jenkins에 의한 CI/CD라고 이야기를 하는 것일까?
이것도 선배 개발자분에게 답변을 받았는데.
그렇게 이야기를 하는 것은 CI 이후에 벌어질 수 있는 다양한 일들을 자동화하기 위해서. 라고 알려주셨다.
이것이 왜 그런 것이냐? 라고 한다면 아래와 같은 상황때문에 그렇다.
코드상에 문제가 없어서 많은 개발자들의 병합이 완료되면서 CD로 인하여 배포가 이루어졌다.
그런데 갑자기 서버가 죽었다.(와 호러물)
로그를 확인해보니 한두개가 문제가 아니라 수없이 많은 에러가 발생했다는 것을 알게 됐다.
그럼 여기서 해야하는 것은?
막말로 롤백밖에 방법이 없다(....)
당장 서비스는 진행되어야하는데, 라이브서버가 죽었다면 답이 없으니 말이다.
(물론 확인도 안해보고 메인서버에 올라가서 배포가 된게 문제긴 한데 픽션이니까요 네..)
그래서 필요한 것이 Jenkins
이다. (이외에도 많은 애플리케이션이 있다. 요즘은 git action도 쓰이는 듯?)
특정한 상황에 트리거가 발동되어, 미리 작성해놓은 다양한 에러코드를 잡을 수 있는 테스트가 돌아가도록 하는 것이다.
특정한 상황이라는 것은 직접 정할 수 있는데 대표적으로는 깃허브에 Push, PR 같은 상황에서 이루어지는 것으로 확인됐다.
결국은 다양한 문제가 발생할 수 있는 것들을 Jenkins로 만들어놓은 트리거
를 통해서 발동시키는 것때문에 Jenkins를 활용한 CI/CD라고 부르는 것이였다.
현재 팀프로젝트는 GCP의 Cloud build를 통해서 CD가 진행되고 있는데
젠킨스를 활용해서 CI/CD를 구축해보는 것을 주말의 목표?로 잡아보고 한번 써봐야할 것 같다.
끗
해당 글을 작성하기 위하여 질문을 했을 때 답변해주신 탐정토끼님, utilForever님 감사합니다!