애자일한 개발 더 나아가 DevOps까지 개발 파이프라인을 확장하고 싶어 하는 조직이 늘고 있습니다. 관련해 많은 지속적 통합과 배포 도구들 살피느라 요즘 정신없는 개발 조직도 많죠. 오늘은 구글 클라우드 컴퓨팅(GCP)에서 지속적 통합을 하는 방법의 하나인 젠킨스(Jenkins) 환경 꾸미기를 알아봅니다.
“너무 유명해 따로 설명이 필요 없는 Jenkins”
지속적 통합(CI: Continuous Integration)은 처음은 쉽지만 갈수록 어렵습니다. 단일 서버상에서 단위 소프트웨어나 모듈 몇 개를 놓고 빌드와 테스트를 하는 것은 간단하죠. 하지만 수십, 수백 대의 가상 머신을 대상으로 빌드와 테스트를 한다고 생각해 보면? 신경 쓸 것이 꽤 생깁니다.
그나마 다행인 것은 GCP 환경에서는 이 작업도 쉽습니다. 구글 컴퓨트 엔진 플러그인을 이용하면 인스턴스 템플릿을 생성해 필요할 때 배포할 수 있습니다. 다음 그림은 인스턴스 템플릿 설정 예입니다. 배포 작업 단위가 커서 젠킨스 서버 노드에 부하가 많이 걸리면? 사전에 만들어둔 템플릿 인스턴스를 온디맨드로 프로비져닝해 작업을 처리하면 됩니다. 빌드 작업이 마무리되면 추가된 인스턴스는 삭제되어, 원래 환경으로 돌아갑니다. 이 같은 오토 스케일링 기능 덕에 깜빡 까먹고 인스턴스를 놀릴 일이 없죠.
“지속적 통합 작업이 너무 느리면 ~ 개발자에게 또 다른 민폐”
이처럼 배포, 테스트 작업 규모에 맞게 젠킨스 실행 환경이 커졌다, 줄었다 하는 게 왜 중요하냐? 서버가 느려서 기다리느라 개발자가 시간 허비할 필요가 없죠. 비용을 더 줄여야 한다! 이런 조건이라면 초 단위로 비용이 청구되는 선점형 가상 머신을 이용해 최대 80% 요금을 낮출 수도 있습니다.
지속적 통합 이야기가 나올 때마다 항상 따라오는 것이 보안입니다. 이런 우려를 해소하기 위해 구글 컴퓨트 플러그인은 젠킨스와 연결을 위해 가장 최신의 안전한 JNLP(Java Network Launch Protocol)을 사용합니다. 젠킨스 서버에서 빌드 작업이 부트스트랩 될 때 구글 컴퓨트 엔진 플러그인은 일회용 SSH 키를 생성하고, 이를 각각의 빌드 인스턴스에 주입합니다. 이를 통해 자격 증명 정보의 훼손이나 탈취가 일어나도 해당 피해가 하나의 인스턴스에서 끝나게 합니다.
이 밖에도 구글 컴퓨트 엔진 플러그인은 다음과 같은 구성도 지원합니다.
- 외부 IP 비활성화로 워커 가상 머신에 대한 외부 접근 차단
- 공유 VPN 네트워크를 통한 환경 격리
- 방화벽 룰을 개선하기 위해 커스텀 네트워크 태그 적용이 가능
또한, 구글 컴퓨트 플러그인을 이용하면 더 빠른 빌드와 테스트 수행을 위해 하드웨어 자원도 GPU, SSD 등을 선택적으로 구성할 수 있습니다.
참고로 보안 등의 이유로 젠킨스 서버를 온프레미스 환경에 둘 경우도 구글 컴퓨트 엔진 플러그인을 통해 하이브리드 형태로 클라우드와 연계 구성이 가능합니다. 대규모 빌드 작업을 한다거나 할 때 외부 자원을 적절히 이용할 수 있는 구성이죠.
그렇다면 구글 컴퓨트 엔진 상에서 어떻게 젠킨스 기반 지속적 통합 환경을 구축할 수 있는지 알아보죠. 개념과 구성은 다음 그림과 같습니다. 먼저 접근 제어 및 신원 증명 정보 관리를 위해 IAM에서 서비스 계정을 설정합니다. 일단 빌드 작업을 클라우드 상에서 하게 되면, 스토리지 이용 전략을 잘 짜야 합니다. 쉽게 말해 자주 쓰이는 최근 데이터와 장기 보관 목적의 데이터를 구분한 다음 거기에 맞는 구글 클라우드 스토리지 버킷을 선택하면 됩니다. 참고로 구글 컴퓨트 엔진처럼 클라우드 스토리지도 젠킨스를 위한 플러그인을 제공합니다. 따라서 관리자가 일일이 데이터를 더 싼 버킷으로 옮기지 않아도, 사전에 정의한 시간이 지나면 자동으로 더 저렴한 스토리지로 데이터가 옮겨집니다.