1. CI/CD란? 🌠
1) CI (Continuous Integration; 지속적 통합)
폭포수 모형의 개발방법을 따를 때에는 소프트웨어 개발 생명주기에 "통합 단계"가 있었고, 그 단계에서 코드가 합쳐졌다. 주로 코드 작성이 모두 끝난 후에 작업이 이루어졌고, 많은 양을 통합해야 하다보니 오래 걸리기 일쑤였다.
XP 등의 애자일 개발방법론이 흔해지면서, 작은 단위의 개발을 반복해서 하게 되니 유닛 단위로 개발을 하고 빈번하게 통합이 이루어지게 됐다. 개발자들은 공유 레포지토리에 작성한 소스코드를 커밋하고, 이는 코드 리뷰를 거쳐 머지(merge)되어, 특정 단위 별로 메인 브랜치 등에 통합되게 되었다. 배포 가능한 브랜치를 주기적으로 빌드해서 테스트 가능한 버전으로 만들어 테스트를 거치고 필요한 수정 과정을 거치는 과정의 반복은 자동화되고 지속적인 통합을 만들어냈다.
"Continuous Integration and Continuous Delivery are the logical results of the permanent implementation of Agile." (https://pepgotesting.com/continuous-integration/)
빌드 자동화, 유닛 및 통합 테스트 수행
작은 단위로 통합하며 테스트 과정을 거치므로 수정이 상대적으로 쉬워지며, 시간이 절약된다.
2) CD
CI를 전제로 한다.
(1) 지속적 제공 (Continuous Delivery)
유효한 코드를 리포지토리에 자동으로 릴리스
목표는 프로덕션 환경으로 배포할 준비가 되어 있는 코드베이스를 확보하는 것이다.
테스트 자동화와 코드 릴리스 자동화가 포함된다.
(2) 지속적 배포 (Continuous Deployment)
지속적 제공에서 자동화된 배포가 추가된 것이다.
2. Jenkins 👴
The leading open source automation server, Jenkins provides hundreds of plugins to support building, deploying and automating any project. (출처: Jenkins 공식 홈페이지)
CI & Continuous Delivery 까지를 포괄하는 소프트웨어로서, 주로 빌드 자동화를 위해 사용한다.
개발자가 레포지토리에 소스 코드를 커밋하고, 빌드를 하려는 브랜치가 업데이트 될 때마다 자동으로 빌드하고 통합을 위한 테스트를 진행한다. 배포를 위해 통합된 코드를 릴리스하는 지속적 제공까지 할 수 있다.
Jenkins의 장점은:
- 쉽게 설치할 수 있다(easy installation)
- 쉽게 사용할 수 있다(easy configuration)
- 외부 플러그인이 다양하게 있어서 확장성이 높다(extensible)
- 분산 환경을 지원하여 다중 플랫폼에서의 빠른 빌드, 테스트, 그리고 배포를 가능하게 한다(distributed)
소스 코드의 용량이 크거나 여러 번 빌드해야 할 때, 하나의 젠킨스 서버로는 부족해진다. 그래서 Jenkins에서는 마스터-슬레이브 구조를 사용할 수 있다.
3. Docker 🐳
"Docker is a tool which is used to automate the deployment of applications in lightweight containers so that applications can work efficiently in different environments. Container is a software package that consists of all the dependencies required to run an application." (Youtube 'Simplilearn')
서로 다른 컴퓨터 환경을 가진 사용자가 애플리케이션을 잘 사용할 수 있게 하려면 애플리케이션이 잘 실행되는 환경을 갖출 수 있도록 해야 한다. 그래서 우리는 VM(virtual machine)이나 Docker을 이용해서 dependency가 잘 갖춰진 가상 환경을 만들어준다.
DevOps에서 Docker를 잘 사용할 수 있다.
❓ DevOps
Development(개발) + Operation(운영)의 결합을 나타내는 말로, 기존에는 개발과 운영이 분리되어 이루어져 왔지만 지속적 통합과 지속적 제공 및 배포 등 개발과 운영 간의 경계가 거의 사라진 것을 의미한다.
호스트 머신에 Docker Engine 또는 Docker를 설치하여 컨테이너를 만들고 실행할 수 있다.
Docker Engine 안의 클라이언트와 서버는 REST API를 통해 통신한다.
※참고
Daemon(데몬): 멀티태스킹 운영 체제에서 데몬은 사용자가 직접적으로 제어하지 않고, 백그라운드에서 돌면서 여러 작업을 하는 프로그램을 말한다.
사용자는 CLI 환경(예: Windows Powershell)을 이용하여 Docker Client에 접근할 수 있고, 여기서 Docker server의 데몬과 레지스트리를 관리할 수 있다. 즉, Docker server가 컨테이너를 어떻게 빌드하고 실행시킬지를 Client에서 관리하는 것이다.
Dockerfile을 통해 컨테이너로 만들려는 애플리케이션을 Docker image로 만들 수 있고, Docker image는 공개 혹은 비공개 Registry에 보관된다. Docker image로 Docker container가 만들어진다.
Docker container는 애플리케이션과 그 애플리케이션의 의존성(dependencies)(라이브러리 등)을 담고 실행가능한 소프트웨어 패키지이다. 여러 컨테이너는 같은 인프라에서 운영체제(OS)를 공유하고 이는 Docker의 강점 중 하나이다. 각 컨테이너는 독립적으로 구성되므로 한 컴퓨터에서 여러 개의 컨테이너들을 별개로 실행할 수 있다.
여러 사람들이 Docker image에 접근할 수 있도록 Docker image를 공개/비공개 레지스트리에 올려놓을 수 있다. Docker 서비스도 자체의 레지스트리인 Docker Hub를 가지고 있다. 사용자들은 레지스트리에 이미지를 push 하여 올려두거나, pull 하여 사용할 수 있다.
참고
- CI/CD란 무엇인가 (Feat.DevOps 엔지니어)
- [YouTube] What Is Jenkins? | What Is Jenkins And How It Works? | Jenkins Tutorial For Beginners | Simplilearn
- [YouTube] What Is Docker? | What Is Docker And How It Works? | Docker Tutorial For Beginners | Simplilearn
- CI/CD(지속적 통합/지속적 제공): 개념, 방법, 장점, 구현 과정
- 데이터 기반으로 지속적인 CI/CD 개선 환경 만들기
- Automated software testing in Continuous Integration (CI) and Continuous Delivery (CD)
- Continuous Integration: A "Typical" Process
- Youtube 'Simplilearn' for images in Jenkins and Docker section
'서버' 카테고리의 다른 글
Nginx에 대하여 (0) | 2022.03.29 |
---|---|
EC2와 SSH (0) | 2022.03.22 |