본문 바로가기

Dev.World/개발상식&언어

[개발상식] 23. DevOps란 무엇이며, CI는 무엇인가?



DevOps에 대해서,

하나의 소프트웨어를 개발하기 위해서는 여러 명이 동시에 개발할 수 있는 환경도 필요하며, 수천명의 사용자를 상대로 내놓으려면 서버와 스토리지, 운영체제 등 뒷단에서 관리해줘야 하는 인프라 환경도 갖춰야 한다. 이러한 역할을 수행하는 것이 Ops의 역할이다. 개발자(Dev)는 고객에게 제공한 변경을 빠르게 보길 원하고 운영자(Ops)는 제공하는 서비스 또는 소프트웨어의 안정성에 더 관심을 두게 된다. 또한 개발자는 개발 생산성을 향상시킬 수 있는 새로운 프레임워크를 도입하고 싶어하지만 Ops는 안정성이 보장되지 않는다는 이유로 이를 꺼려한다.

서로 다른 목적을 갖고 다른 프로세스로 다른 도구를 사용하여 개발을 진행하는 것이다. 이런 차이점 때문에 Dev와 Ops간에 충돌이 발생한다. 이러한 배경에서 등장한 것이 DevOps이다. DevOps란 소프트웨어 개발자들과 IT종사자들 사이의 의사 소통, 협업, 융합을 강조한 소프트웨어 개발 방법론이며 소프트웨어 개발과 IT 운영간의 상호 의존관계에 대한 산물이다. 조직에서 DevOps의 역할은 소프트웨어 상품과 서비스를 신속히 생산하는 것에 도움이 되는 임무를 수행하게 된다. Dev와 Ops 간에 그 목적을 일치시키고 프로세스와 도구에 대한 접근을 공유하여 그 차이를 줄이는데 목적이 있다.


CI(Continuous Integration)란 무엇인가?
개발자가 각각 개발한 소스코드를 모아서 한꺼번에 빌드하는 통합 빌드의 과정을 특정 시점이 아니라 주기적으로 수행함으로써 통합에서 발생하는 오류를 사전에 해결하고 이러한 과정들에 소요되는 시간을 줄이기 위한 기법을 말한다. 더이상 빌드는 컴파일만을 의미하지 않는다. 소프트웨어가 거대해지고 복잡해지면서 팀 단위로 개발을 하게 되었고, 그 과정에 있어서 분업과 협업은 필수적이 되었다. 이 분업과 협업의 과정에서 소스 버전 관리 툴을 이용한 소스 코드의 Merge 과정은 까다롭게 되었고, 이 문제를 해결하기 위한 기법이다. Agile 방법론이 대두되면서 이는 더욱 주목받게 되었으며, 배포를 위한 빌드 단계, 테스팅 단계 등에서 시간을 절약하는 효과를 발휘하여 빠른 시장 변화 속도에 발맞춰 대응할 수 있다. 속도와 품질 두 마리의 토끼를 잡을 수 있는 것이다.

CI 시스템 구축을 위한 핵심 구성요소
CI Server
빌드 프로세스를 관리하는 서버로 Jenkins가 여기에 속한다.
ex) Jenkins, Travis CI,  etc

SCM(Source Code Management)
소스코드 형상 관리 시스템으로 Git이 여기에 속한다. 소스코드의 개정과 백업 절차를 자동화하여 오류 수정 과정을 돕는다. 팀 프로젝트의 경우 각자 수정한 부분을 전체가 자동으로 동기화 할 수 있는 시스템이다.
ex) subversion, Git etc

Build Tool
컴파일, 테스트, 정적 분석 등을 실시해 동작가능한 소프트웨어를 생성하는 도구로 Maven이 여기에 속한다. 빌드는 형상 관리 시스템에 있는 소스코드를 가져와 컴파일하여 실행 가능한 파일로 만드는 일련 과정을 일컫는 말이다.
ex) Maven, Gradle, Ant, make etc

Test Tool
작성된 테스트 코드에 따라 자동으로 테스트를 수행해주는 도구로 빌드 툴의 스크립트에서 실행되며 JUnit이 여기에 해당한다.
ex) JUnit, Mocha etc

빌드 스크립트를 통한 CI 자동화 수행 절차
1. 소스코드를 바이너리 파일로 컴파일 한다.
2. 바이너리 파일을 배포 형태로 패키징 한다.

3. 단위 테스트를 수행한다.
4. 정적 분석을 수행한다.
5. 분석 결과를 리포팅 한다.
6. 패키징한 파일을 테스트 서버에 배포한다.


>> 각종 Tool들에 대해서 >>


end