CI
CI(Continuous Integration)
: 빌드/테스트 자동화 과정. 개발자를 위한 자동화 프로세스인 지속적인 통합을 의미한다.
한 마디로 여러 개발자들의 코드를 계속해서 통합하는 것이다.
CI를 왜 사용하는가?
- CI를 성공적으로 구현할 경우 애플리케이션에 대한 새로운 코드 변경 사항이 정기적으로 빌드 및 테스트되어 공유 레포지토리에 통합된다.
- 여러 명의 개발자가 동시에 애플리케이션 개발과 관련된 코드 작업을 할 경우 서로 충돌할 수 있는 문제를 해결할 수 있다.
- 소스/버전 관리 시스템에 대한 변경 사항을 정기적으로 커밋하여 모든 사람에게 동일 작업 기반을 제공하는 것으로 시작한다.
- 커밋할 때마다 빌드와 일련의 자동 테스트가 이루어져 동작을 확인하고, 변경으로 인해 문제가 생기는 부분이 없도록 보장한다.
CD
CD(Continuous Delivery)
: 배포 자동화 과정. 지속적인 서비스 제공 or 지속적인 배포를 의미한다.
한 마디로 지속적으로 배포 가능한 상태를 유지하는 것이다.
CD를 왜 사용하는가?
- 지속적인 서비스 제공, 지속적인 배포. 이 두 용어는 사옿 교환적으로 사용된다.
- 두 용어 모두 파이프라인의 추가 단계에 대한 자동화를 뜻하지만 때로는 얼마나 많은 자동화가 이루 어지고 있는지를 설명하기 위해 별도로 사용되기도 한다.
- 지속적 배포는 빌드, 테스트 및 배포 단계를 자동화하는 DevOps 방식을 논리적 극한까지 끌어올립니다.
- 코드 변경이 파이프라인의 이전 단계를 모두 성공적으로 통과하면 수동 개입 없이 해당 변경 사항이 프로덕션에 자동으로 배포된다. 품질 저하 없이 최대한 빨리 사용자에게 새로운 기능을 제공할 수 있게 된다.
- 입증된 지속적 통합 및 지속적인 전달 단계를 기반으로 한다.
- 간단한 코드 변경이 정기적으로 마스터에 커밋되고, 자동화된 빌드 및 테스트 프로세스를 거치며 다양한 사전 프로덕션 환경으로 승격되며, 문제가 발견되지 않으면 최종적으로 배포된다.
CI/CD 파이프 라인?
CI/CD를 정리하다 보니 계속 나오는데 무슨 말인지 몰라서 찾아봤다.
파이프 라인(Pipe Line)은 코드를 빌드, 테스트, 배포하는 과정을 거쳐 소프트웨어 개발을 추진하는 프로세스이다.
- 프로세스를 자동화함으로써 인적 오류를 최소화하고 소프트웨어 출시 방식에 일관된 프로세스를 유지하는 것을 목표로 한다.
- 파이프 라인에 포함된 툴에는 코드 컴파일, 유닛 테스트, 코드 분석, 보안, 바이너리 생성 등이 있다.
둘이 그냥 비슷한 의미였다.(아니면 알려주세요 저도 잘 모릅니다...)
CI/CD의 종류
- Jenkins
- CircleCI
- TravisCI
- Github Actions
이 외에도 다양한 CI/CD가 있다.
Jenkins
Java Runtime 위에서 동작하는 자동화 서버이다.
- 다양한 플러그인들을 활용해서 각종 자동화 작업을 처리할 수 있다.
- AWS 배포, 테스트, Docker 빌드 등 각각의 컴포넌트들이 하나의 플러그인으로 모듈화 되어 있어, 이를 사용하면 된다.
- 가장 핵심적인 파이프 라인, 시크릿 키마저도 플러그인으로 동작시킬 수 있다.
- 즉 일련의 자동화 작업의 순서들의 집합인 파이프 라인을 통해 CI/CD 파이프 라인을 구축한다.
- 플러그인들을 잘 조합해서 돌아가게 하는 게 파이프 라인이라고 할 수 있다.
Jenkins의 대표 플러그인
- Credentials Plugin
- Jenkins는 그냥 단지 서버이기 때문에 배포에 필요한 각종 리소스에 접근하기 위해서는 여러 가지 중요 정보들을 저장하고 있어야 한다.
- AWS token, Git access token, secret key, ssh(username, password) 등의 정보들을 저장할 때 사용한다.
- 위와 같은 중요한 정보들을 저장해주는 플러그인이다.
- Git Plugin
: Jenkins에서 git에 대한 소스 코드를 긁어와서 빌드할 수 있도록 도와주는 플러그인이다.
- Pipeline
: 핵심 기능인 파이프 라인마저 플러그인이다.
- Docker plugin and Docker Pipelin
: Docker agent를 사용하고 Jenkins에서 Docker를 사용하기 위한 플러그인
Jenkins의 Pipeline
Pipeline
- pipeline이란 CI/CD 파이프라인을 젠킨스에 구현하기 위한 일련의 플러그인들의 집합이자 구성
- 즉 여러 플러그인들을 이 파이프라인에서 용도에 맞게 사용하고 정의함으로써 파이프라인을 통한 서브시가 배포된다.
- pipeline DSL(Domain Specific Language)로 작성된다.
- Jenkins가 동작되기 위해서는 여러 플러그인들이 파이프라인을 통해 흘러가는 과정이라고 할 수 있다.
Pipeline의 Section
Agent Section
- Jenkins는 많은 일을 해야 하기 때문에 혼자 하기 버겁기에, 여러 slave node를 두고 일을 시킬 수 있다.
- 이처럼 어떤 Jenkins가 일을 하게 할 것인지를 지정한다.
- Jenkins node만 넣을 수 있는 것이 아니라 Jenkins 안에 있는 docker container에 들어가서 일을 시킬 수도 있다.
Post Section
- 스테이지가 끝난 이후의 결과에 따라서 후속 조치를 취할 수 있다.
- 작업 결과에 따른 행동을 취할 수 있다.
Stage Section
- 어떤 일들을 처리할 것인지 일련의 stage를 정의하는 것으로, 일종의 카테고리라고 보면 된다.
Steps Section
- 한 스테이지 안에서의 단계로 일련의 스텝을 보여준다.
- Steps 내부는 여러 가지 step들로 구성되며 여러 작업들을 실행 가능하다.
- 플러그인을 깔면 사용할 수 있는 step들이 생겨난다.
- 빌드를 할 때, 디렉토리를 옮겨서 빌드를 한다거나, 다른 플러그인을 깔아서 해당 플러그인의 메서드를 활용해서 일을 처리한다던지 하는 작업들을 할 수 있다.