본문 바로가기

Dev.World/Tool

[개발상식] 24. 각종 DevOps Tool - Jenkins / Travis CI / Docker / Ansible with YAML


Continuous Integration Tool


Jenkins란
젠킨서버란 오픈 소스 CI(Continuous Integration) Tool 로 Java로 만들어졌다. CI란 팀 구성원들이 작업한 내용을 정기적으로 통합하는 것을 의미한다. 만약 github을 통해 협업 중이라면 각각의 version controller 에 각자 작업한 내용을 commit을 하게 되는데, 이렇게 commit된 소스코드들을 정기적으로 통합시켜주는 것을 도와준다. 지속적으로 코드의 퀄리티를 관리할 수 있으며, 소프트웨어의 질적 향상과 소프트웨어를 배포하는데 걸리는 시간을 줄이는데 그 목적이 있다. 현재 csv, svn, git 등의 소스 툴들을 지원하고 ant와 maven 등의 빌드 툴을 지원하며 배포 형태는 war 파일을 통해 배포한다.

그 기능을 자세히 알아보자면 다음과 같다.
GUI 제공 / 소스 코드 체크아웃 / 분산 빌드 / 지속적인 빌드 및 테스트 자동화와 배포 자동화 / 테스트 보고서 작성 / Groovy script를 이용한 Job Scheduling 기능 / CLI 제공 / 실행 결과를 통보하고 결과물을 저장
프로젝트의 빌드가 정상적으로 되고 있는지 체크할 때 사용하며, 자동으로 유닛 테스트와 통합 테스트들의 정기적인 실행을 해줘 만약 문제가 발생하면 리포트를 해준다.



Travis CI
Jenkins와 비슷한 CI Tool이다. Jenkins는 서버가 필요하지만 Travis는 그렇지 않다.
GitHub을 이용하여 협업 프로젝트를 진행할 때, CI를 위한 오픈소스 프로젝트이다.
Git에 commit이나 push가 일어날 때 마다, 자동으로 프로젝트 빌드와 테스트를 진행할 수 있다.




Virtual Machines vs Docker


Virtual Machine
Virtual Machine이란 가상머신은 물리적인 컴퓨터에서 구동되는 운영체제와 응용프로그램으로 이루어진 소프트웨어 컨테이너를 지칭한다. 컴퓨팅 환경을 소프트웨어로 구현한 것으로 컴퓨터를 애뮬레이션하는 소프트웨어이다. 가상머신은 하드웨어 구성요소가 전혀없는 소프트웨어로 구성되므로 물리적인 하드웨어를 넘어서는 여러 가지 장점을 갖고 있다 가상자원(vCPU, vMem, vDisk, vNIC)을 갖고 있기 때문에 운영체제, 애플리케이션, 다른 컴퓨터의 네트워크들은 가상머신과 물리적인 장치의 차이를 인지하지 못하게 되는 것이다. 대표적인 Tool로 Oracle 사의 Virtual Box가 있다.



Docker
Docker는 오픈소스 프로젝트 명인 동시에 기업명이기도 한다. Go 언어로 작성된 리눅스 컨테이너 런타임 패키징 오픈 플랫폼으로 리눅스 컨테이너 기술을 자동화하여 쉽게 사용할 수 있게 해준다. 컨테이너라는 것은 새로운 개념은 아니다. 기존부터 존재한 기술이었지만 복잡하고 어려워 활발하게 사용되지는 않았다. 하지만 닷클라우드란 기업이 도커에 대한 기술지원을 시작하면서 활발해졌다. 리눅스 컨테이너 기술은 가상화 기술과 비슷한 기술이다. 하지만 가상화 기술은 하이퍼바이저란 기술이 반드시 있어야 한다. ( 하이퍼바이저는 하나의 컴퓨터에서 여러 개의 OS를 사용할 수 있게 도와주는 기술을 말한다. ) 가상화 기술을 통해 갖춰진 가상화 환경은 Host OS를 공유하며 그 위에 Guest OS가 올라가는 것이다. 

도커는 하이퍼바이저와 달리 Guest OS를 두지 않고 호스트 OS의 커널을 바로 사용한다. 때문에 리눅스 커널이 작동되는 곳에서라면 어느 곳에서든 작동한다. 하이퍼바이저 대신 도커 엔진이 올라가 호스트 OS와 여러 애플리케이션을 연결해주는 역할을 한다. 따라서 도커를 사용하면 가상화보다는 내부에서 더 적은 일을 처리하고 애플리케이션을 좀 더 빠르고 효율적으로 실행시킬 수 있다.

두 가지의 차이점 정리
가상머신은 수 GB에 달하는 애플리케이션, 바이너리/라이브러리 및 게스트 OS를 포함하고 있다.
VM이 생성될 때마다 내 PC 애플리케이션 공간에 게스트 OS가 구동되며 크기, 속도의 문제가 있다.


Provision Tool

Ansible이란?
ansible이란 테스트 환경을 구축하는데 사용되는 Tool이다. 즉, Provision & configuration management tool로 오픈 소스 버전과 Enterprise 버전이 따로 존재한다. 다른 provision tool로는 Chef, Puppet, Chpistrano 가 존재한다. 다른 provistion tool이 ruby로 개발된 반면에 ansible은 python으로 개발되었다. YAML이라는 언어를 통해 정의할 수 있고 json으로 통신하며 github에서 정말 활발한 활동성을 보인다. 
ansible 선택에 따른 이점은 빠른 SSH 통신, 빠른 provision이 가능하다. 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질은 멱등성을 제공하며 자동 배포 환경이 쉽다. 그리고 오픈소스 버전이 존재하기 때문에 개발 가능성이 높다.
>> provision 이란? >>


cf> YAML 이란
YAML은 Yet Another Markup Language의 약자(현재 공식적인 약자)로 사람이 쉽게 읽을 수 있는 데이터 직렬화 양식이다. 핵심은 문서 마크업이 아닌 데이터 중심에 있다. YAML은 모든 데이터를 리스트, 해쉬 , 스칼라 데이터의 조합으로 적절히 표현할 수 있다는 믿음에 만들어졌다. 문법은 상대적으로 이해하기 쉽고 XML과 거의 비슷하다. ruby, python개발자에게는 property 파일로 활용되나 다른 언어 개발자들에게는 생소할 수 있는 언어이다.

최근에는 Spring 진영에서도 외부에서 데이터를 로드하는 경우에 사용된다. 자바의 properties 파일의 사용에는 표현의 한계가 존재하기 때문에 properties에 YAML을 사용한다. Spring Boot에는 SnakeYAML을 포함하고 있어서 쉽게 외부 파일을 YAML으로 작성하여 로드할 수 있으며 객체로 매핑할 수 있다.



end