아무리 봐도 느끼하게 생겼다..
여러 개발자들의 코드를 계속해서 통합하는 것이다.
코드 베이스를 사용자가 사용가능한 환경에 배포하는 것을 자동화한다.
개발한 프로덕트를 내부 사용자, QA 엔지니어, 프론트, 백 엔지니어에 전달하는 것도
CI/CD의 목적이다.
Pipe line은 단순히 배관이란 뜻이다.
빌드/테스트/배포 과정에 쓰이는 주요 툴.
빌드: Webpack, tsc, javac
테스트: jest, Junit
배포: ecs update
프로덕션 배포시마다 초긴장 상태를 유지하고, 배포 스크립트를 작성하고, AWS 콘솔로 작업하고.. 아니면 베어메탈??
할게 준내 많다...
개발자는 코드만 짜야 한다.
나머지 귀찮은 작업들을 Jenkins가 대신한다.
그래서 Jenkins가 이렇게 역겹게 생긴...
Jenkins는 Java Runtime 위에서 동작한다. 빌드, 테스트, 배포 등 모든 것을 자동화 해주는 자동화 서버이다. 다양한 플러그인을 활용하여 각종 자동화 작업을 처리할 수 있고, 자동화 작업의 순차적 집합인 Pipeline(이 자체도 플러그인)을 통해 CI/CD 파이프라인을 구축한다.
파이프라인은 CI/CD 파이프라인을 Jenkins에 구현하기 위한 일련의 플러그인의 집합이자 구성이다. 여러 플러그인들을 이곳에서 용도에 맞게 사용하고 정의하여 서비스가 배포된다.
Pipeline은 Pipeline DSL(Domain Specific Language)로 작성한다.
Declarative, Scripted Pipeline 두 가지 형태의 Pipeline syntax가 존재한다. 이 중 Declarative Pipelie syntax가 더 최신이자 가독성 좋은 문법을 가지고 있다.
Sections
Jenkins는 많은 일을 하기에 혼자 하기 버겁다.
여러 slave node를 두고 일을 시킬 수 있는데, 이처럼 어떤 Jenkins가 일을 하게 할 것인지를 지정한다. Jenkins 노드 관리에서 새로 노드를 띄우거나 docker 이미지 등을 통해 처리할 수 있다.
스테이지가 끝난 이후의 결과에 따라 후속 조치를 취할 수 있다.
ex) 성공시 성공 이메일, 실패하면 중단 혹은 건너뛰기 등 실행
어떤 일들을 처리할 건지 일련의 stage를 정의한다.
한 스테이지 내의 단계로 일련의 스텝을 보인다.
각 스테이지 안에서 어떤 일을 할 건지 정의하는 것
Environment, Stage, Options, Parameters, Triggers, When 등의 Declarative가 있다.
개발자가 개발을 하는 Local 환경(자신의 workspace에서 작업함)
개발자들끼리 개발 내용에 대한 통합 테스트를 하는 Development 환경
개발이 끝나고 QA 엔지니어 및 내부 사용자들이 사용해 보기 위한 QA 환경
실제 유저가 사용하는 Production 환경
이를 DEV, QA, PROD로 부를 수 있다.
배포 환경 관리의 핵심은 인프라를 모듈화하여 어떤 것이 변수인지 잘 설정하고 이를 잘 설계하는 것이다.
APP_ENV처럼 현재 배포하고자 하는 것이 무슨 환경인지 설정하고, 앱 내에서 사용하는 다양한 변수들을 APP_ENV에 맞게 잘 가져다 쓰는 것이 핵심이다.
서비스 내부 변수 뿐 아니라 클라우드 리소스를 많이 활용해서 개발하는 최근엔 리소스 내에서 인프라별 키 관리가 매우 중요해서 aws system manager의 parameter store와 같은 키 관리 서비스를 쓰면 간편하다.
ECS 혹은 k8s 등을 통해 rolling deploy가 처리되기에 jenkins는 배포 명령만 내리면 된다.
ex) aws ecs update-service '서비스명'