개발 다했다!! 이제 배포하자!!
근데?! 왜 로컬에서 잘 돌아가던 것이 서버에서는 동작이 잘 안하는 것일까...?
또!! 내가 모르고 잘못하고 버그가 있는 코드를 git에 올려버렸단 말이다? 그걸 모르고 배포해서... 버그도 못찾고 원인도 모르는 경우도 있다.
근데 이 배포과정 계속 반복되는데 안그래도 실패 떠서 울상인데...
이거 개발자는 반복하는거 못참즤!!!!!!
그래서 나온 것이 CI/CD라는 것이다!
1. CI/CD 정의
CI(Continuous Integration)
- 지속적 통합
- 개발을 진행하면서도 품질을 관리 할 수 있도록 하는 것
- 여러 명이 하나의 코드에 대해서 수정을 진행해도 지속적으로 통합하면서 관리
- CI를 적용하게 되면 각자의 개발자가 자신이 구현해야할 기능을 구현한다.
- 이후 완성이 되면 main 브랜치와 병합하려고 할 것이다. 그때 코드가 잘 빌드되는지 보고, 올바르게 동작하는지 테스트하며 코드에 버그가 있다면 해결한다.
- 이를 자동화하면 개발자가 빌드와 테스트를 직접 하지 않고도 수정한 코드를 브랜치에 병합하기만 하면 자동으로 빌드와 테스트를 검증할 수 있다.
- 개발자가 단위별로 구현한 부분을 병합할 때마다 자동화된 빌드와 테스트가 트리거되어 실행된다. 결과를 통해 어떤 부분에서 문제가 있는지 배포 전에 버그를 빠르고 정확하게 확인하여 해결 할 수 있다.
- 그 결과로 소프트웨어 품질을 개선하고 새로운 소프트웨어 업데이트를 검증하고 릴리즈하는데에 걸리는 시간을 단축할 수 있다.
- CI 진행 순서
- 개발자가 구현한 코드를 기존 코드와 병합한다.
- 병합된 코드가 올바르게 동작하고 빌드되는지 검증한다.
- 테스트 결과에 문제가 있따면 수정하고 다시 1로 돌아간다. 문제가 없다면 배포를 진행한다.
용어
빌드
소스코드 파일을 컴퓨터에서 실행할 수 있는 소프트웨어 산출물로 만드는 과정
java에서는 maven
, gradle
과 같은 빌드 도구를 이용하여 컴파일과 함께 소스코드 파일(.jar, .war)와 같은 산출물로 변환
배포
빌드의 결과물을 사용자가 접근할 수 있는 환경에 배치하는 것
마틴 파울러가 제시하는 CI의 4가지 규칙
- 모든 소스코드가 살아 있고 누구든 현재의 소스에 접근할 수 있는 단일 지점을 유지할 것
- 빌드 프로세스를 자동화해서 누구든 소스로부터 시스템을 빌드할 수 있게 할 것
- 테스팅을 자동화해서 언제든지 시스템에 대한 건전한 테스트 수트를 실행할 수 있게 할 것
- 누구든 현재 실행 파일을 얻으면 지금까지 가장 완전한 실행 파일을 얻었다는 확신을 하게 할 것
CD(Continuous Deployment)
- 지속적 배포
- 지속적 제공(Continuous Delivery)로 사용되기도 한다.
- 지속적 제공은 CI를 통해서 새로운 소스코드의 빌드와 테스트 병합까지 성공적으로 진행되었다면, 빌드와 테스트를 거쳐 github와 같은 저장소로 업로드 하는것을 의미
- 지속적 배포는 이렇게 성공적으로 병합된 내역을 저장소뿐만 아니라 사용자가 사용할 수 있는 배포환경까지 릴리즈 하는 것을 의미
- 즉, 빌드의 결과물을 프로덕션으로 릴리스 하는 작업을 자동화 하는 것
CI/CD흐름
- 이 그림을 보면 CD는 CI의 연장선에 있는 개념
- 빌드 결과물이 만들어지면 배포 환경에 소프트웨어 결과물을 Deploy한 것 까지 포함
CI/CD는 개발하고 있는 소프트웨어의 품질 개선을 위해 빌드 -> 배포 과정을 자동화 하는 과정이라고 볼 수 있다.
개발자는 개발에 더 집중할 수 있고, 배포되는 환경에서의 버그도 더 빠르게 찾을 수 있다.
나도 이번 프로젝트에 한번 적용해봐야겠다.
다음 글에서는 Jenkins 서버를 구축하고 CI/CD를 적용해보겠다.
[출처]