“JARVIS! 배포해”

영화 스트리밍 서비스 넷플릭스(Netflix)는 AWS를 인프라로 사용하면서 하루에도 수백 번 배포를 진행하기 위해 모든 과정을 자동화했습니다. 페이스북은 전체 소스가 1.5기가가 넘고 빌드에만 30분 가까운 시간이 소요되는데 이 많은 소스를 여러 서버에 동시에 배포하기 위해서 P2P 시스템인 BitTorrent를 사용하는 것으로 알려져 있습니다. DevOpse 라는 용어가 말해주는 것처럼 일반 사용자를 대상으로 한 서비스를 개발하고 운영한다면 빌드와 배포 자동화는 이제 선택이 아니라 필수라고 말할 수 있습니다.  SK planet에서는 지난 2013년 4월부터 12월까지 약 7개월간 7명의 개발자가 참여하여 빌드와 배포를 자동으로 수행하는 시스템을 개발했습니다. 이 시스템이 바로 JARVIS 입니다. 본 포스트에서는 JARVIS를 개발하면서 고민했던 내용들을 정리했습니다.

시작

빌드하면 뭐가 떠오르시나요? 요즘 많이 사용되는 빌드서버 Jenkins, 지속적인 통합(CI, Continuous Integration), 클라우드 빌드 서비스 CloudBee, Travis CI 정도가 생각나네요. 빌드서버를 사용해본 경험이 있는 분 중에는 Jenkins로도 충분한데 굳이 빌드배포 시스템 같은게 필요할까 하는 의문도 가질 거 같습니다. 시스템을 기획하면서 가졌던 첫 번째 고민입니다.

빌드배포 시스템의 범위를 어디까지로 볼것인가?

작게 보면 Ant나  Maven을 가지고 소스코드를 컴파일하고 패키징하는 것으로 볼 수도 있지만 크게 보면 Chef나 Puppet같은 Configuration Management 시스템까지 포함할 수 있습니다. 저희는 빌드배포시스템을 다음과 같이 정의했습니다.

모바일앱이든 웹서비스든 SK planet에서 개발한 서비스는 빌드배포 시스템의 대상이며 서비스를 빌드/배포 하는데 필요한 모든 작업을 수행하는 시스템이 빌드배포시스템이다.

시스템  범위를 개략적으로 정의했지만 완성되고 나면 어떤 모습이어야 할지 감을 잡을 수 없었습니다. 그러던 중 아마존의 제품 개발방법 Working Backwards(http://curioe.com/5)라는 글을 읽고 이 방법을 도입해보기로 했습니다. 먼저 빌드배포시스템의 보도자료를 작성했습니다. 다음은 보도자료의 일부입니다.

클라우드 기반 릴리즈 서비스 ‘ReleaseX'(가칭)

개발자라면 누구나, 언제든지, 가장 쉽게 소프트웨어를 배포할수 있다.

SK planet에서 기술력으로 인정받는 SQE팀에서는 웹 상에서 간편하게 시스템을 빌드하고 배포할 수 있는 ‘ReleaseX’를 X월X일 베타 오픈했다. ReleaseX는 프로젝트에서 바로 간편하게 사용할 수 있는 빌드/배포 서비스 이다.

프로젝트마다 개발된 서비스나 앱을 빌드하고 배포하기 위한 기술을 가지고 있다. 하지만 그 방법이 다양하고 자동화되지 않아 같은 실수나 노력을 반복하기 때문에 많은 비용이 낭비되고 있으며, 신규 프로젝트인 경우에는 이런 환경을 빨리 갖추는 게 어렵다.

ReleaseX는 프로젝트 별로 설치할 필요가 없어 매우 간편하다. VPN이 연결된 네트워크에서는 웹 브라우저를 통해 언제 어디서나 사용할 수 있다.  배포하고자 하는 서비스나 웹을 처음 한번 등록해 놓으면, 원 클릭만으로 빌드/배포가 가능하다. 배포 단계에서 발생한 문제를 즉각 SMS등으로 통보 받을 수 있으며, 장애가 발생한 경우 즉시 이전 버전으로 롤백이 가능하여 유용하다. 각 단계별로 현재 빌드/배포가 얼마나 진행되었는지 비쥬얼하게 확인이 가능하며, 실행결과도 결과 레포트, 데이터(JSON, XML), API로 확인할 수 있어서 향후 모니터링 서비스와 연계 시 사용성이 더 좋아질 것으로 예상된다.

금방 쓸수 있을거 같았는데 막상 쓰려니 막막해서 수많은 오픈소스, 상용 솔루션의 Features를 확인하고난 후에야 완성할수 있었습니다. 그러면서 모듈 구성과 Feature List가 만들어 졌고 조금씩 JARVIS의 구체적인 모습이 보이기 시작했습니다.

아키텍처

검증된 오픈소스나 솔루션을 도입하고 여기에 필요한 기능을 추가하는 방식은 단기간에 안정된 시스템을 구축하는데 유리합니다. 만들것인지 살것인지를 결정하기 위해서 빌드배포 관련 오픈소스/상용 솔루션에 대한 POC(Proof of Concept)를 진행했습니다. POC 결과 오픈소스는 기능이 많이 부족했고 상용 솔루션들은 당장 필요없는 기능이 많아 복잡하다는 결론을 내렸습니다.

이름 라이센스 특징 사이트
Control Tier 오픈소스 구버전, 단종 http://www.controltier.org/
Glu 오픈소스 LinkedIn 적용사례, API 지원 http://pongasoft.github.io/glu/docs/latest/html/
System Center 상용 Microsoft 솔루션 http://www.microsoft.com/en-us/server-cloud/products/system-center-2012-r2
uDeploy 상용 다양한 기능, 국내 기술지원 불가 http://www.urbancode.com/html/products/deploy/
Bamboo 상용 Atlassian 솔루션, Jira/FishEye등 연계 용이 https://www.atlassian.com/software/bamboo

사실 자체 개발이 솔루션 도입에 비해 꼭 유리한 것은 아닙니다. 하지만 커스터마이징이나 기술 지원을 받기 힘든 상용 솔루션을 도입하기 보다는 오픈소스를 기반으로 꼭 필요한 기능만 구축하는 게 좋겠다고 결정했습니다.  오랜 고민끝에 저희가 선택한 오픈소스는 glu(http://pongasoft.github.io/glu/docs/latest/html/)입니다.

glu는 LinkedIn에서 개발하여 사용하다가 오픈소스로 공개된 빌드/배포/모니터링 플랫폼입니다. glu의 특징을 간단하게 살펴보겠습니다.

  • 다양한 배포정책(다중배포, 순차배포) 지원
  • 배포 단계별 실시간 모니터링 가능
  • 에이전트를 통해 다양한 작업 수행가능
  • 웹 콘솔 지원
  • API 제공

그림1. Glu 시스템 구성

이미 팀 별/프로젝트 별로 빌드서버(Jenkins)를 구축하여 사용하고 있었기 때문에 필요한 건 배포 서버였습니다. 다양한 배포 시나리오를 지원하면서 모니터링 기능을 갖고 있는 glu는 저희 프로젝트에 딱 맞는 오픈소스였습니다. 하지만 직접 도입하다 보니 이슈가 발생했습니다. glu로 배포설정을 하려면 JSon으로 모델을 만들고 Groovy로 스크립트를 작성해야 했습니다. Groovy 스크립트를 사용하는 수준이 간단한 DSL 정도이긴 했지만 개발자만 이 시스템을 사용하는게 아니었기 때문에 대안이 필요했습니다.

Jenkins처럼 배포를 웹상에서 편하게 설정하고 실행할수 있는 웹 애플리케이션을 제공하자.

Groovy 스크립트 외에 glu가 가진 또 다른 이슈는 예약 기능이었습니다. glu는 특정 스케줄에 맞춰서 배포를 실행하는 기능을 지원하지 않습니다. 그래서 예약된 시간에 배포가 진행되는 기능을 구현하기 위하여 스케줄링 관련 오픈소스 검증을 진행했습니다.

특징

Chronos

Azkaban

oozie

라이센스

Apache 2.0 License

Apache 2.0 License

Apache 2.0 License

언어

Scala, Java

Java

Java

지원 Job 유형

Java, Shell, Mapreduce

Java, Mapreduce, hive, pig

Java, Maprduce, hive, pig 등

인터페이스

API, Web UI

Web UI

API, Web UI

장애

실행 실패 시 재 실행 가능

실행 실패 시 재 실행 가능

실행 실패 시 재 실행 가능

잡 종속성

프로세스당 자원 할당에서 독립성 보장

스레드당 Job 실행

스레드당 Job 실행

자원 소비

자체 자원제어 가능

Job 실행 서버의 자원점유에 영향을
받음

Job 실행 서버의 자원점유에 영향을
받음

여러 가지 특징을 고려했을 때 API와 Web UI를 동시에 지원하고, Job의 실행환경도 클러스터링 기반으로 지원 가능하며, Job의 자원 소비도 Job 별로 분배하여 영향도가 적은 Chronos로 선정했습니다. 참고로 Chronos는 Airbnb에서 cron을 대체할 명목으로 개발된 프로젝트입니다.

이런 시스템에서 중요한 기능 중 하나가 Notification 입니다. 누가 배포를 실행했고 현재 상태가 어떻고 무슨 장애가 생겼다는 것을 이메일, SMS 등으로 빨리 담당자에게 알려줘야 합니다. 저희는 페이스북이나 트렐로처럼 대쉬보드에 로그인해서 현재 작업중인 사람들에게 실시간 노티를 보내고 싶었습니다. 이를 위해서 Realtime Web(Push) 기술을 도입하기로 했고 리서치 결과 Atmosphere(https://github.com/Atmosphere/atmosphere)를 사용하기로 했습니다.

Atmosphere는 Java로 되어 있고 아래 그림처럼 다양한 서버군을 지원하며, Spring 연동이 가능하고, 무엇보다 스케쥴링을 적용하여 클라이언트에 broadcasting이 가능하기 때문에 별도의 백엔드 서버가 없어도 백엔드에서 발생된 데이터에 대해서 클라이언트로 실시간 푸시가 가능합니다.

그림2. Atomoshpere Framework Stack

과거 경험에 비추어 봤을때 이런 사내시스템을 만들고 나면 각 조직에서 필요한 기능을 추가해 달라는 요청도 많고 연계해야 하는 시스템도 많습니다. 시스템이 복잡해 지지 않도록 가능하면 꼭 필요한 기능만 넣고 싶었습니다. 그래서 다른 시스템이나 팀에서 원하는 기능이 배포 시스템 맞지 않으면 기능은 제공하지 않지만 API를 호출하여 구현할수 있도록 RESTful 구조의 API를 제공하기로 합니다. 하지만 얼마나 사용할지 모르는데 굳이 API용과 웹 애플리케이션용으로 백엔드를 두 번 구현하는 것은 낭비인 것 같았습니다. 백엔드를 하나로 하려면 웹 애플리케이션도 요청에 대한 응답을 JSon으로 받아야 합니다. 이를 해결하기 위하여 자바스크립트 프레임워크 Angular JS를 프런트 엔드 구현을 위해 사용했습니다. Angular JS는 HTML에서 MVC 구현을 도와주는 프레임워크로 뷰의 입력/출력 파트와 JSon 모델을 양방향 바인딩해주기 때문에 이 경우에 가장 적합한 솔루션이라고 생각합니다.

그림3. Angular JS 데이터 바이딩(출처:http://docs.angularjs.org/guide/databinding)

지금까지 설명했던 오픈소스를 기반으로 만들어진 JARVIS의 구성입니다. JARVIS가 주요 시스템과 어떻게 연계되어 동작하는지를 간단히 표현해 보았습니다. (실제로는 내부적으로 더 많은 작업이 일어납니다.)

그림4. Jarvis Module Architecture

워크플로

주로 개발자들이 사용할 사내 시스템이지만 가능한 쉽고 직관적인 UI를 개발하기 위해서 고민했습니다. JARVIS의 전체 워크플로는 5단계로 나눠집니다.

  • 1단계는 소스 코드 레파지터리에서 배포하고 싶은 작업을 임포트 하는 부분입니다. 어떤 설정도 필요 없고 클릭 몇번 만으로 필요한 내용을 소스코드 레파지터리로부터 임포트합니다.
  • 2단계와 3단계는 빌드/배포 설정입니다. 처음 임포트 했다면 빌드나 배포에 대한 설정이 전혀 안되어 있어서 빌드/배포 설정이 Off로 보입니다. 빌드서버나 잡(Job)을 맵핑하면 빌드설정이 On으로 바뀝니다. 배포할 서버와 일정, 정책, 승인절차를 설정하면 배포설정도 On이 됩니다. On/Off로 설정을 단순화 시켰습니다.
  • 4단계는 실행입니다.빌드와 배포 설정을 On 시키고 나면 실제로 배포할 수 있습니다. 여기서 중요한 건 승인절차입니다. 마지막은 모니터링입니다. 배포결과는 모두 기록되고 모니터링되기 때문에 한 곳에서 모든 내용을 확인하는 게 가능합니다.

그림5. Jarvis 워크플로

맺음말

간단하게 빌드배포 시스템을 개발하면서 고민했던 내용들을 설명했습니다. 기술적인 내용만 주로 설명했지만 실제로 이런 시스템을 사내에 개발하기 위해서는 인프라조직, 보안조직, 운영조직과 협력이 굉장히 중요합니다. 이 부분은 조직마다 다를 수 있는 부분이라 여기서는 생략하였습니다.

개발 초기 배포시스템의 코드명은 ReleaseX 였습니다. 우리가 만드는 시스템이 개발자들이 정말 편하게 개발에만 전념할수 있도록 해줄수 있으면 좋겠다는 바램에서 JARVIS로 명명했습니다. JARVIS는 아이언맨에 나오는 지능형 컴퓨터로 토니 스타크가 말만하면 척척 일을 처리해줍니다. JARVIS는 이제 막 오픈해서 확산지원 및 추가개발에 정신이 없습니다만 언젠가는  ‘JARVIS! 배포해!’라고 말하면 배포가 이루어지는 날을 기대해 봅니다 🙂

그림6. JARVIS 개발팀(왼쪽 뒤부터 황상철,박하영,하호진,김선준,최종욱,윤혁신)

참고자료

  1. http://www.infoq.com/news/2013/06/netflix
  2. http://java.dzone.com/articles/how-facebook-does-deployment
  3. http://jenkins-ci.org/
  4. https://travis-ci.org/
  5. http://martinfowler.com/articles/continuousIntegration.html
  6. http://pongasoft.github.io/glu/docs/latest/html/
  7. https://github.com/airbnb/chronos

공유하기