DevOps란 애플리케이션과 서비스를 빠른 속도로 제공할 수 있는 있도록 조직의 역량을 향상시키는 문화 철학, 방식 및 도구의 조합이다. 기존의 소프트웨어 개발 및 인프라 관리 프로세스를 사용하는 조직보다 제품을 더 빠르게 혁신하고 개선할 수 있다. 이러한 빠른 속도를 통해 조직은 고객을 더 잘 지원하고 시장에서 좀 더 효과적으로 경쟁할 수 있다.
DevOps의 모범 사례는 다음과 같다.
CI는 Continuous Integration의 줄임말로, 지속적인 통합을 의미한다.
CI를 성공적으로 구현할 경우, 애플리케이션에 대한 새로운 코드 변경 사항이 정기적으로 빌드 및 테스트되어 공유 repository에 통합되므로 여러 명의 개발자가 동시에 애플리케이션 개발과 관련된 코드 작업을 할 경우 서로 충돌할 수 있는 문제를 해결할 수 있다.
CD는 지속적인 서비스 제공 (Continuous Delivery) 또는 **지속적인 배포(Continuous Deployment)**를 의미하며 두 용어는 상호 교환적으로 사용된다.
Jenkins
Jenkins는 자바 기반의 프로그램이다. 젠킨스는 플러그인 아키텍처를 통해 확장이 가능해서 거의 불가능 한 부분이 없을 정도로 많은 가능성을 제공한다. Jenkins는 dedicated server를 요구하기 때문에 추가적인 금액이 발생할 수 있고, configuration / customization 하는데 시간이 필요한 것이 단점이다.
젠킨스는 플러그인을 통해 많은 커스터마이징이 가능하므로 큰 프로젝트에 많이 사용된다. 즉, 빠르게 CI 시스템을 사용해야 한다면 젠킨스는 좋은 선택이 아닐 수 있다.
Travis CI
Travis CI는 클라우드 기반의 서버이며, YAML file로 구성하고, 테스트를 실행하도록 docker를 지원한다.
CI 시스템중에 가장 많은 언어를 지원한다. Travis CI는 빠르고, YAML config를 사용해 가볍고, 무료이지만 Circle CI와 비교했을 때, 기업 플랜이 더 비싸고 커스터마이징이 제한되어 있다.
Travis CI는 여러 환경에서 테스트되야 하는 오픈 소스 프로젝트에 적합하다.
Circle CI
Circle CI 역시 클라우드 기반의 시스템이며 Travis CI와 매우 흡사하다. 즉, Circle CI는 YAML config로 가볍고, 빠르게 시작할 수 있다. Circle CI를 사용하면 dedicated sever(단독으로 제공된 서버 위에서 하나의 서비스를 제공하는 서비스)가 필요 없으며, 관리할 필요가 없어진다 (Travis CI 동일).
Circle CI는 최대한 빨리 통합해야하는 목적을 가진 작은 프로젝트에 적합하다.
그 외, Gitlab CI, TeamCity같은 툴도 있다.
마이크로서비스는 애플리케이션 구축을 위한 아키텍처 기반의 접근 방식이다.
마이크로서비스를 전통적인 monolithic 접근 방식과 구별 짓는 기준은, 애플리케이션을 핵심 기능으로 세분화하는 방식을 사용하는가이다. 마이크로서비스에서는 각 기능을 서비스라고 부르고, 독립적으로 구축하고 배포할 수 있다. 이렇게 함으로 개별 서비스가 다른 서비스에 부정적 영향을 주지 않으면서 작동(또는 장애가 발생)할 수 있다.
쉽게 비유하면, 어떤 쇼핑몰에 접속했을 때 보이는 검색창, 추천 내역, 장바구니, 이 모든 것이 하나의 서비스이다.
즉, 마이크로서비스란 애플리케이션의 핵심 기능이면서 다른 서비스들과 독립적으로 작동한다.
애플리케이션 핵심 기능을 유연하게 결합할 뿐 아니라, 불가피한 장애, 향후 확장 여부 및 새로운 기능 통합에 대비할 수 있도록 서비스 간 커뮤니케이션 및 개발팀의 구조를 조정하는 practice이다.
'프로그래밍형 인프라'라고도 불리는 **코드형 인프라 (Infrastructure as Code)**는 인프라 구성을 마치 소프트웨어를 프로그래밍하는 것처럼 처리하는 방식을 가리킨다.