1. 젠킨스 소개
젠킨스는 지속적인 통합 및 배포를 위한 방법을 제공합니다.
젠킨스의 모태인 허든슨을 개발한 가와구치는 개발 작업에서 빌드가 깨지는 것에 질려서, 코드를 repository에 커밋하기 전에 해당 코드의 동작여부를 알 수 있는 방법을 찾고 싶었습니다.
그래서 이를 가능하게 하는 자동화 서버를 개발했는데, 그것이 허든슨입니다. ( 후에 오픈소스 커뮤니티 간의 분쟁으로 젠킨스로 갈라짐 )
젠킨스는 지속적인 통합, 즉 프로젝트 빌드, 테스트 실행, 배포 등의 통합을 자동화합니다.
즉, 젠킨스는 Maven, Ant, Gradle, Junit, Nexus와 잘 작동하며, Git, SVN과 같은 형상 관리 툴을 지원합니다.
더 놀라운 것은 Java 뿐만 아니라, WAS가 없는 Python, Node.js도 플러그인을 통해 젠킨스로 CI가 가능하다는 점입니다.
2. CI ( Continuous Integration )
젠킨스가 빌드, 테스트, 배포 등을 자동화 해준다고 하는데... 구체적으로 지속적인 통합( CI, Continuous Integration )이란 무엇일까요?
지속적인 통합은 애자일 개발 방법론에서 필요성이 드러납니다.
예를 들어, 프로젝트 중반 쯤 고객이 프로젝트 진행 상황을 알고 싶다고 합니다.
그래서 여러 개발자가 자신의 코드를 통합을 하는데, 이 때 다음과 같은 문제점들이 발생할 것입니다.
- 다른 개발자의 코드들을 합쳐보니 실행이 안된다. ( 머지 이슈 )
- 내 PC에서는 됐는데 통합하니 실행이 안된다. ( 환경적인 이슈 )
- 통합되기 전에는 자신이 갖고 있는 소스가 최근 통합된 코드가 아닐 수 있다.
즉, 지속적으로 여러 개발자들이 통합을 하지 않은 상태에서는 개발 중간 과정을 직접 눈으로 확인하기가 어렵습니다.
젠킨스를 통해 코드를 지속적으로 통합하면, 고객에게 프로젝트 진행 상황을 직접 눈으로 확인시켜 줄 수 있는 장점이 있습니다.
고객은 그 때 그 때 바로 확인하여 원하는 요구사항이 아니었다면, 바로 다음 날에 수정요청을 할 수 있기 때문에 프로젝트의 성공 가능성이 높아집니다.
이와 같이 개발하는 기법을 애자일 개발 방법론이라고 합니다.
따라서 Jenkins에서 가장 중요한 것은 고객이 수시로 확인할 수 있도록 항상 빌드가 유지해야 한다는 것입니다.
3. CI가 이루어지기 까지
그렇다면 Jenkins는 어떤 과정을 통해 CI를 할까요?
- 각 개발자들은 깃헙에서 코드를 공유합니다.
- Jenkins는 깃헙에서 코드를 가져와서 오류를 체크합니다.
- 그리고 의존 관계에 있는 라이브러리들을 다운 받습니다.
- 테스트 코드가 있으면 테스트를 실행합니다.
- 테스트에 성공할 경우, 빌드를 해서 실서버에 재배포 합니다.
Jenkins에 대해 오해할 만한 것이 있는데, Jenkins는 빌드, 테스트, 배포 등을 직접 실행하는 것이 아닙니다.
단지 빌드, 테스트, 배포를 실행시키는 역할을 할 뿐입니다.
즉, work flow를 제어하는 것이지, 소스를 가져오거나 Maven을 직접 실행하는게 아니라는 것입니다.
이상으로 애자일 개발 방법론과 관련있는 지속적인 통합( CI )과 무료 오픈소스인 Jenkins에 대해 알아보았습니다.
Jenkins를 사용하는 방법은 여기를 참고해주세요.