정의 : CI(지속적인 통합) / CD (지속적인 배포)를 통하여 애자일 방법론을 실현시킨다. 애자일을 실현시키기 위하여 ci/cd한다
애자일에 대해 간략 설명하자면, 기존의 폭포수 모델의 개발 방법론은 최초 고객의 요구사항을 얻어 개발이 진행된다. 그러나 고객의 요구사항은 수시로 바뀌고 처음 설계한 컨셉과 달라지기 때문에 유연하게 대처하기가 곤란해지며 이는 일정 지연, 품질의 저하로 이어진다. 이러한 요구사항에 대응하기 위하여 폭포수 모델과 달리 개발 과정 중에 수시로 고객에게 프로토타입으로써 결과물을 보여주고 피드백을 받고 수정하여 대응한다.
우측 상단, Continuous Visibility를 실현
CI를 실시함으로써의 이점은 다음과 같다.
프로젝트 표준 컴파일 환경에서의 컴파일 오류 검출
자동화 테스트 수행 ( 테스트를 거치지 않는 CI는 불완전하다. 반드시 수행해야함)
정적 코드 분석에 의한 코딩 규약 준수여부 체크
프로파일링 툴을 이용한 소스 변경에 따른 성능 변화 감시
결합 테스트 환경에 대한 배포작업
단점은 다음과 같다.
다른 개발자의 코드들을 합쳐보니 실행이 안된다. ( 머지 이슈 )
내 PC에서는 됐는데 통합하니 실행이 안된다. ( 환경적인 이슈 )
통합되기 전에는 자신이 갖고 있는 소스가 최근 통합된 코드가 아닐 수 있다.
통합되기 전에는 개발 중간 과정을 눈으로 확인하기 힘들다.
체계가 확립되지 않은 곳에서는 개발자가 war파일을 ftp로 직접 업로드 후 WEB/WAS를 재시작하거나 수정된 일부분의 파일을 직접적으로 올리면서 수정하고 있다.
개발환경을 맞추었다고는 하나 여러명의 개발자가 자신의 pc에서 각자 개발한 소스를 최종적으로 병합하는 과정에서의 문제가 발생할 수 있고, 서버에 반영하는 과정에서의 Human error등의 위험성이 있다.
또한 Local에서 개발하여 테스트 후 다시 운영 서버에 반영 후 테스트등의 작업에 적잖은 시간을 소모한다.
이를 위해 CI 툴인 jenkins등을 통하여 아래와 같은 방법으로 CI를 실현한다.
1. 각자 개발자는 형상관리 서버에 커밋한다.
2. CI툴(젠킨스)는 소스 변경을 탐지(혹은 스케줄링등 특정 조건에서 발동하게 셋팅가능)
3. 젠킨스에 설정한 JDK등의 컴파일러 여러 기타 도구(maven, gradle)을 통하여 빌드
4. 빌드에 성공하면 junit등의 테스트 수행
5. 테스트까지 성공하면 WEB/WAS서버에 자동으로 배포( 쉘 스크립트등을 통한 web 서버 재시작)
"고객이 확인할 수 있게 항상 빌드가 깨지지 않게 유지하는 것이 중요합니다."
간단히 요약하자면 "커밋하면 자동으로 테스트(테스트코드가 있다면)와 빌드를 수행하고, 에러가 발생하지 않는다면 타겟(개발/운영)서버에 배포해준다."