728x90
정의
각각의 개발자들이 개발하는 환경을 사용자(내부 QA 엔지니어, 백엔드, 프론트엔드 개발자 등 포함)에게 지속적으로 배포가되고, 각 사용자들의 코드가 자동적으로 계속해서 합쳐지는 것이다. 이러한 과정에는 코드를 빌드하고, 테스트하고 배포하는 활동이 있다.
젠킨스
- 시종. 개발자는 코드만 짜고, 나머지 귀찮은 작업들을 젠킨스에게 맡긴다.
- Java Runtime 위에서 동작하는 자동화 서버이다.
- 빌드, 테스트, 배포 등 모든 것을 자동화해주는 서버이다.
- 젠킨스는 빈 껍데기 -> 다양한 플러그인들을 활용해서 각종 자동화 작업을 처리할 수 있다.
- 그 플러그인들을 조립해서 잘 돌아가게 하는 것 -> 일련의 자동화 작업의 순서들의 집합인 pipline을 통해 CI/CD 파이프라인을 구축한다.
젠킨스 플러그인
대표적인 플러그인들은 다음과 같다.
- Pipline : 젠킨스의 핵심 기능인 파이프라인을 관리할 수 있게해주는 플러그인이다.
- CI/CD 파이프라인을 젠킨스에 구현하기 위한 일련의 플러그인의 집합이자 구성이다. 즉, 여러 플러그인들을 이 파이프라인에서 용도에 맞게 사용하고 정의함으로써 파이프라인을 통해 서비스가 배포된다.
- Pipeline DSL(Domain Specific Language)로 작성한다. 두가지 형태의 Pipeline syntax가 존재하는데, 더 가독성 좋은 문법을 가진 Declarative Pipeline syntax를 사용한다.
- Git Plugin : Git Repository 안의 소스코드들을 긁어와서 빌드할 때
- Credential Plugin
- Jenkins는 단지 서버이기 때문에 배포에 필요한 각종 리소스(가령 클라우드 리소스 혹은 베어메탈에 ssh 접근 등)에 접근하기 위해서는 여러가지 중요한 정보들을 저장하고 있어야한다. 이런 중요한 정보(AWS token, Git access toke 등)을 저장해주는 플러그인이다.
- Docker Plugin and Docker Pipeline : 젠킨스 안에서 도커 빌드 + 이미지 다운
Pipeline Syntax
Sections 로 구성된다.
- Agent section
- 젠킨스는 많은 일들을 해야하기 때문에 혼자하기 버겁다.
- 그래서 여러 slave node를 두고 일을 시킬 수 있는데, 이처럼 어떤 젠킨스가 일을 하게할 것인지를 지정한다.
- 젠킨스 노드 관리에서 새로 노드를 띄우거나 혹은 docker 이미지 등을 통해서 처리할 수 있다.
- Post section
- 스테이지. 즉, 각 단계가 끝난 이후의 결과에 따라서 후속 조치를 취할 수 있다.
- success, failure, always, cleanup 등
- Stages section
- 어떤 일들을 처리할 것인지 일련의 stage를 정의한다.
- Declartives
- 각 stage 안에서 어떤 일을 할건지 정의하는 것
- Environment: 어떤 파이프라인이나 stage scope의 환경변수를 설정한다.
- Parameter: 파이프라인 실행시 파라미터를 받는다.
- Triggers: 어떤 형태로 트리거되는지. 즉, 실행 주기 설정. git 소스코드 3분마다 긁어오기.
- When: 언제 실행되는가
- Steps section
- 한 stage 안에서의 단계
개발 프로세스
- 개발자가 자신의 PC에서 개발
- git pre-commit hooks 내부 테스트 진행
- 진행한 내용을 다른 개발자들과 공유하기 위해 git과 같은 SCM에 올린다. (흔히 dev브랜치)
- dev 브랜치의 내용을 개발 환경에 배포하기 전에 테스트와 lint 등 코드 포맷팅을 한다.
- 배포하기위한 빌드과정을 거친다.
- 코드를 배포한다.
- 테스트를 진행한다.
- 위 모든 과정을 dev, qa, production 환경에서 모두 하고, 각각에 맞는 환경에 배포한다.
예시 배포 환경
- 웹 사이트 코드를 작성한다.
- 웹 사이트 코드를 린트, 웹팩 빌드해서 S3 bucket에 html 파일을 업로드한다. (프론트)
- S3 (Simple Storage Service)
- 정적 웹 사이트 코드 배포에 용이하다.
- 정적 웹 사이트 호스팅에 필요한 다양한 기능을 제공한다.
- AWS Cloudfront와 함께 사용해서 최적화가 가능하고, DNS 관리도 가능하다.
- Node.js 백엔드 코드를 typescript로 작성한다.
- javascript compile하고, 테스트 코드를 돌려서 도커 이미지를 만들어 ECR에 올린다.
- ECR (Elastic Container Registry)
- 도커 이미지를 저장하는 private repository
- 업로드한 ECR 이미지로 ECS 서비스를 재시작한다. (rolling deploy) => continuous deploy
- ECS (Elastic Container Service)
- 도커 컨테이너 기반으로 서비스 운용을 가능하게 해주는 서비스
- rolling update(무중단 배포), 부하분산 처리, 로드 밸런싱, 스케일업
- 백엔드 서비스를 스케일업 가능한 형태로 배포하는데 최적화되어 있다.
- 수많은 도커 컨테이너 서버를 띄우고, 로드밸런서가 이들 사이에 밸런싱을 해준다.
- fargate, ec2 모드가 있어서 docker container 리소스만 띄우거나 혹은 물리적인 EC2 instance 클러스터로 구성이 가능하다.
- ECS 혹은 쿠버네티스 등을 통해 rolling deploy가 처리되기 때문에 jenkins의 역할은 배포 명령만 내려주면 된다.
- aws esc update-service '서비스 이름'
728x90
'Tech > CI CD' 카테고리의 다른 글
Jenkins 파일 작성법 (0) | 2023.07.24 |
---|---|
EC2에 젠킨스 설치하기 (0) | 2023.07.23 |