1. CI란
- Continuous Integration, 지속적인 통합을 말합니다. 소프트웨어 개발 과정에서 코드 변경 사항을 지속적으로 통합하는 것을 의미합니다.
- 개발자들이 코드를 변경할 때마다, 해당 변경 사항은 repository에 자동으로 merge되고 build된 후 test를 진행합니다.
- 이로써 개발자들은 자주 코드를 통합하고, 팀 전체에서 발생할 수 있는 통합 문제를 미리 감지할 수 있었습니다.
CI의 필요성
- 지속적 통합의 필요성은 오류감소, 효율성 향상, 팀 협업 강화 3가지로 말할 수 있습니다. 첫째, 개발자들이 작업한 코드를 자주 통합함으로써 오류를 초기에 발견하고 수정할 수 있습니다. 이는 프로젝트 후반부에 발생할 수 있는 복잡한 문제들을 방지할 수 있습니다. 둘째, 자동화된 테스트를 통해 코드의 품질을 지속적으로 검증함으로써, 수동 테스트에 소요되는 시간과 노력을 줄일 수 있습니다. 셋째, 모든 개발자가 동일한 코드 베이스에 자주 디여함으로써 팀 내 의사소통과 협업이 강화 됩니다.
2. CD란
- Continuous Delivery 지속적으로 배달한다. 코드베이스가 항상 배포 가능한 상태를 유지하는 것
- Continuous Deployment 지속적인 배포를 의미합니다.
- 통합된 코드가 자동으로 build 및 test되고 안정적인 상태로 판명되면, 해당 코드는 자동으로 프로덕션 환경에 배포됩니다.
- 이를 통해 개발자와 운영팀은 신속하게 안정적인 소프트웨어를 배포할 수 있습니다.
CD/CD를 통합하면 개발 및 배포 프로세스가 자동화되므로, 소프트웨어를 빠르게 개발하고 출시할 수 있습니다. 이는 높은 품질의 소프트웨어를 빠르게 사용자에게 제공하며, 개발자 및 운영 팀간의 협업을 강화하고 개발 주기를 단축하는 데 도움이 됩니다.
CD의 필요성
- 지속적 배달, 배포의 필요성은 시장 출시 시간 단축, 안전성 향상, 고객 피드백의 빠른 반영, 비용절감 4가지로 말할 수 있습니다. 첫째, 배포과정을 자동화함으로써, 새로운 기능이나 수정 사항을 고객에게 빠르게 전달 할 수 있습니다. 둘째, 지속적 배포를 통해 자주 소규모 업데이트를 진행함으로써, 대규모 업데이트 시 발생할 수 있는 위험을 줄일 수 있습니다. 셋째, 신속한 배포 덕분에 고객의 피드백을 빠르게 수집하고 이를 제품 개선에 반영할 수 있습니다. 넷째, 자동화된 배포 프로세스는 휴먼 에러를 줄이고, 고객 만족도를 높이는 데 중요한 역할을 합니다.
3. Jenkins란 무엇인가?
- Jenkins는 소프트웨어 프로젝트를 구축, 테스트 및 배포하는 데 일반적으로 사용되는 오픈 소스 자동화 서버입니다. 소프트웨어 개발 수명주기의 다양한 단계를 자동화하여 CI/CD를 가능하게 합니다. Jenkins는 다양한 플러그인의 통합을 지원하므로 확장성이 뛰어나고 다양한 환경에 적응할 수 있습니다.
4. Pipeline
- Jenkins Pipeline은 지속적인 통합(CI) 및 지속적인 전달, 배포(CD) 파이프라인을 구축하기 위해 사용되는 자동화 도구입니다. Jenkins Pipeline을 사용하면 코드 저장소의 변경을 감지하여 빌드, 테스트 및 배포 등의 과정을 자동으로 실행할 수 있습니다. Pipeline은 Jenkinsfile이라는 텍스트 파일로 코드 형태로 정의됩니다. 이 파일은 프로젝트의 소스 코드 저장소에 저장되어 버전 관리됩니다. pipeline의 section의 구성은 Agent, Post, Stages, Steps로 나눌 수 있습니다.
5. Pipeline Section
Pipeline Block
- 이는 전체 Jenkins Pipeline의 기본을 형성합니다. pipeline 블록은 모든 Jenkins Pipeline 코드의 최상위 레벨에 위치하며, 이 내부에 다른 모든 섹션들이 정의됩니다. pipeline 블록을 통해 개발자는 빌드, 테스트 및 배포 과정을 포함하는 전체 자동화 워크플로우를 선언적 방식으로 구성할 수 있습니다. 이 섹션은 Jenkinsfile의 구조와 실행 흐름을 결정짓는 핵심적인 부분입니다.
Agent Section
agent
지시어는 Pipeline이나 Pipeline 내 특정 스테이지가 실행될 환경을 지정합니다. 이는 Jenkins가 작업을 실행할 물리적 또는 가상의 실행 환경을 결정하는 데 사용됩니다. 예를 들어, Docker 컨테이너, 특정 레이블이 지정된 Jenkins 에이전트, 혹은 전체 Pipeline에 대해 단일 에이전트를 지정할 수 있습니다. agent
섹션은 작업의 실행 환경을 제어함으로써, 필요한 도구와 설정이 준비된 적절한 환경에서 작업이 수행되도록 보장합니다.
Stages Section
stages
블록은 여러 stage
를 포함하며, 각 stage
는 Pipeline의 한 단계를 나타냅니다. 이 섹션은 전체 프로세스를 논리적으로 구분하여 구성하며, 예를 들어, "Build", "Test", "Deploy"와 같은 다양한 단계를 포함할 수 있습니다. 각 stage
는 작업의 특정 부분을 나타내며, 이를 통해 개발 프로세스를 세분화하고, 더욱 체계적으로 관리할 수 있습니다.
Steps Section
- 각
stage
내부의 steps
블록은 실제로 수행할 작업들을 정의합니다. 이는 스크립트 실행, 셸 명령 실행, 빌드 도구 사용 등의 작업을 포함할 수 있습니다. steps
섹션은 각 단계의 구체적인 실행 명령을 포함하며, Pipeline의 실행을 실제로 진행하는 데 필요한 명령이나 스크립트를 정의합니다.
Environment Section
environment
블록은 Pipeline 또는 특정 stage
의 실행에 사용될 환경 변수를 설정합니다. 이 섹션을 통해 빌드 번호, 브랜치 이름, 접속 정보와 같은 중요한 정보를 안전하게 관리하고, 이를 작업 실행에 활용할 수 있습니다. 환경 변수를 사용함으로써, 코드를 통해 설정값을 쉽게 변경하고 관리할 수 있으며, 민감한 정보를 안전하게 처리할 수 있습니다.
Paramters Section
parameters
블록은 빌드 프로세스를 시작할 때, 사용자로부터 입력받을 수 있는 파라미터들을 정의합니다. 이는 선택적인 문자열, 불리언 값, 파일 파라미터 등을 포함할 수 있으며, 사용자가 빌드를 시작할 때 이러한 파라미터에 대한 값을 제공할 수 있습니다. 이를 통해 빌드 프로세스의 유연성을 증가시키고, 다양한 시나리오에 대응할 수 있습니다.
Triggers Section
triggers
블록은 자동으로 Pipeline을 실행시킬 조건을 정의합니다.이는 SCM 변경 사항 감지, 정해진 스케줄에 따른 실행, 웹훅을 통한 외부 이벤트에 반응 등 다양한 방식으로 Pipeline을 자동 실행시키는 트리거를 설정할 수 있습니다. triggers
섹션을 통해 자동화된 빌드 및 배포 프로세스를 구현할 수 있으며, 개발 팀은 코드 변경 사항에 빠르게 반응하여 효율적인 작업 흐름을 유지할 수 있습니다.
Post Section
post
블록은 Pipeline의 실행이 완료된 후 수행할 작업을 정의합니다. 이는 성공, 실패, 항상 실행 등의 다양한 조건에 따른 작업을 포함할 수 있으며, 빌드 결과에 대한 알림 전송, 아티팩트 정리, 로그 수집 등의 후속 조치를 구성할 수 있습니다. post
섹션은 Pipeline 실행의 결과를 처리하고, 필요한 정리 작업을 수행하여 프로젝트의 유지관리를 용이하게 합니다.
참고
https://www.youtube.com/watch?v=JPDKLgX5bRg&t=4s