Dev/DevOps, Infra

[DevOps] CI/CD

HJChung 2021. 1. 15. 21:49

DevOps

DevOps란 개발(Development)과 운영(Operation)의 합성어로, 개발과 운영을 하나로 합쳐서 일하는 철학, 도구, 환경, 문화 등의 조합을 나타낸다. 개발부터 배포까지 모든 단계에 자동화와 모니터링을 도입해서 더 짧은 개발 주기, 더 많은 배포 빈도, 안정적인 소프트웨어를 배포하자는 목표를 가지고 있다.

 

위의 설명을 보면 '자동화'와 '모니터링'이 필요한 것 같다. 그래서 데브옵스는 서버 구성, 배포, 테스트에 있는 반복작업을 최대한 자동화하여 배포 리소스를 줄이는 것이 시작이다.

 

데브옵스를 실천하는 방식은 여러가지가 있고, 그 중 One-Step 빌드와 배포가 있다.

빌드(Build)란 여러 개발자가 개발한 소스 코드 파일을 통합하고, 실제 동작 가능한 독립적인 S/W 변환하는 작업을 말한다.

배포(Deploy)란 빌드된 파일을 사용할 수 있게 전달하는 과정을 말한다.

빌드와 배포가 자동으로 안정적이고 자주 이루어지게 되면 결함을 빨리 발견할 수 있고, 이는 서비스의 장애를 일이 커지기 전에 해결하고 막을 수 있다는 것이 된다.

빌드와 배포가 자동으로 안정적이고 자주 이루어지게 되면 작은 단위로도 배포를 여러번 할 수 있고, 이는 배포환경에서 테스트를 미루다가 매번 개발환경에서만 작동확인을 하여서 발견하지 못했던 여러 이슈들을 미리미리 발견할 수 있게 도와준다.

이를 위한 자동화 서비스를 CI/CD라고 하며 CI, CD가 뭔지에 대해 정리해 보고자 한다.

 

 

CI(Continuous Integration; 지속적 통합)

CI는 데브옵스의 개발 방식중 하나로, 개발자들이 작업한 코드를 main 브랜치에 머지하는 시간을 최대한 앞당겨서 버그를 빨리 찾을 수 있게 하는 것이다.

 

첫 번째와 두 번째 프로젝트에서 4명의 개발자가 함께 작업했던 때를 생각해보면, 작업한 코드를 하나의 브랜치에 PR하고, 머지하려할 때 각 코드간 충돌 문제가 굉장히 빈번하게 발생하였다. 물론 같은 파일을 건드리는게 불가피하기 때문에 충돌은 언제나 발생할 수 있지만, 문제는 이 PR이 그때그때 머지되지 않고, 쌓여있다가 한 번에 머지되려고 할 때였다.

 

이러한 상황을 배포상황에 맞게 생각해 보면,

오랜 시간 동안 많은 양의 코드를 다른 브랜치에서 작성 하고, 배포를 위해 마지막에 main 브랜치에 머지하는 경우, 너무 많은 코드를 그때 그때 충돌 해결하지 않고 한 번에 병합하면서 그제야 충돌을 해결하려고 하니 시간도 오래 걸리고, 버그의 위험성도 커진다. 그리고 일찍 개발된 기능들이 있어도 후에 개발된 기능들이 머지 될 때까지 기다렸다가 병합되기때문에 고객들은 개선된 기능을 사용할 수 있는 시기가 늦춰진다.

이러한 문제에 지속적 통합인 CI가 필요하다.

 

CI(지속적 통합)가 도입되면 개발자들이 main 브랜치에 새로운 코드나 코드 변경사항을 업로드할 때마다 자동으로 빌드 및 전체 유닛 테스트를 실행하여서 애플리케이션에 제대로 적용되었는지 검사를 하게 된다. 그리고 테스트가 실패한 경우에는 알람을 보내 해당 내용을 업로드한 개발자가 문제를 해결하게 한다.

단 CI가 되입되기 위해서는 테스트의 통과가 제품의 품질을 보장할 수 있다고 보장 가능할 만큼 테스트가 잘 작성되어 있어야 한다.

 

출처: The Product Managers’ Guide to Continuous Delivery and DevOps

 

이처럼 소스코드  자동으로 실행해주니 자신이 작성한 코드가 다른 기능에 영향을 미치진 않을까하는 걱정을 덜 하고 자주 업로드할 수 있게 된다. 그리고 작은 단위로 자주 업로드 된다는 것은 버그를 빨리 잡을 수 있는 것은 물론, 머지 할 때 코드 충돌 문제도 미리미리 방지할 수 있다는 얘기도 된다. 그리고 사용자들은 개발된 기능의 없데이트를 빠르게 제공받을 수 있다. 

 

CD(Continuous Delivery/ Continuous Deploy; 지속적 전달/지속적 배포)

CD(지속적 전달)은 자동으로 CI가 해주는 것에 이어 유닛 테스트를 진행하고, 완료된 코드를 를 운영 서버에 배포하기 전 단계인 스테이지 서버에 배포하고, 거기서 UI테스트, 연동 테스트 등 다양한 테스트를 진행한다. 여기까지는 자동으로 진행되고, 

그 다음에 메뉴얼에 따라 수동으로 사람이 운영 서버로의 release를 승인한다.

이러한 과정을 거치면 운영 환경으로 배포할 준비가 된 코드를 확보할 수 있고,  변경 사항을 작은 단위로 배포하면서 문제 발생시 어디서 문제가 발생했는지 파악 및 해결이 쉽다. 그리고 운영 환경과 동일 환경에서 전체 프로세스를 사전 검검이 모니터링 가능하다는 점도 좋다. 

 

CD(지속적 배포)는 지속적 전달에서 스테이지 서버에서 QA테스트를 수행하고, QA테스트 통과시 운영 환경으로 전달되어 최종 확정 및 배포까지 자동화 한 것을 말한다. 

이렇게 해서 개발 테스트 및 운영 환경 전반에서 워크플로우가 생성된다.

 

하지만 드는 생각은,, 자동화를 위한 테스트가 매우 잘 작성되어 있어야 하겠고, 이게 어렵겠다... 라는 생각이 든다. 

 

 

이전(불과 첫번째 SAFU 프로젝트를 진행할 때만 해도)에는 이러한 개념을 몰랐는데, 그 당시에는 필요성을 모르고 작은 단위의 배포를 진행하지 않아서 거의 서비스가 완성 된 후 배포환경에서 문제가 있다는 것을 그제서야 알게되었지만 진행된 코드가 너무 많아서 어디를 고쳐야 할지를 찾는데도 많은 리소스가 들어가야 했던 문제가 발생했었다. 
여기서 깨달은 점을 Final 프로젝트인 약올림을 진행하면서 Heroku를 통해서 배포환경 테스트를 개발 단계에서부터 병행하였기에 큰 문제없이 기능상의 버그는 이전단계에서 모두 대응했거나/알고있던 문제였다.
그래서 나에게 더욱 더 DevOps와 CI/CD의 필요성이 잘 와닿는 것 같다.

그리고 프로젝트 팀장이었을 때, 팀원 분들이 PR해주시는 것 마다 => 그걸 임의로 먼저 받아가서 적용한 뒤, => 서비스 전체 기능에 이상이 없는지 다시 한 바퀴 다 돌려보면서 코드리뷰를 하고 => 그 때 확인 된 사항을 '이 부분에서 이런 문제가 발생하니 수정해주시면 될 것 같다.'/ 또는 '이상 없이 잘 작동하니 머지 해도 될 것 같다' 라는 리뷰를 작동되는 영상을 gif와 함께 제공해드렸었다. 

 

후에 모든 팀원분들이 이런 프로세스가 매우 좋았다고 피드백을 주셨는데, 내가 한 일과 비슷한 작업이 자동으로 매번 전체 테스트를 실행해준다니! 정말 멋지고 필요한 기능인 것 같다!! 

 

AWS와 DevOps

AWS는 DevOps에 필요한 서비스를 제공한다. 

이 중 CI/CD에 관련된 것은 AWS CodeBuild, AWS CodeDeploy, AWS CodePipeline, AWS CodeStar 등이 있다. 

출처: CI/CD – How automation makes the software development fast, efficient and reliable

알아보던 중 'AWS IAM, CodeBuild, CodeDeploy, CodePipeline 과 Docker 를 활용하여 Node.js 프로젝트의 CI/CD 를 구축하는 과정'에 대해 정리 해 놓은 을 보게 되었는데.. 참고해서 CI/CD를 구축한다는 것이 뭔지 실습해보고 싶다. 

출처: Docker, AWS CodeBuild, CodeDeploy 그리고 CodePipeline 으로 Node.js 프로젝트 CI/CD 구축하기

 

 

처음 AWS를 배웠을 때 해본 Deploy Architecture는 EC2, S3, RDS가 다였다. 

그러다가 약 2-3개월 후 프로젝트를 진행하면서 https의 필요성을 알게 된 후 진행한 SAFU 웹사이트 Deploy Architecture는 이렇게 발전되었다. 

 

 

그리고 오늘 CI/CD를 배운 후 이렇게 Deploy Architecture가 형성된다는 것이 이제서야 보인다. 

전에는 보이지 않고, 이해되지 않던 것들이 점차 보이는게 정말 신기하고 백엔드와 DevOps의 매력에 빠져든다 빠져들어....🤤

 

reference

The Product Managers’ Guide to Continuous Delivery and DevOps

AWS 인프라 구축 가이드 11장. 데브옵스 - 김담형 지음

아마존 웹 서비스로 시작한는 데브옵스 3장 AWS DevOps를 위한 개발 Toolkit - 권영환 지음

Docker, AWS CodeBuild, CodeDeploy 그리고 CodePipeline 으로 Node.js 프로젝트 CI/CD 구축하기

[QA] 컴파일? 빌드? 배포? 개념과 차이는 무엇일까?