Jenkins와 CI/CD 구축 실습
9️⃣ Jenkins와 CI/CD 구축 실습
1️⃣ CI/CD 개념 복습 및 실무 적용 사례
CI/CD(Continuous Integration / Continuous Deployment)는 개발과 배포의 자동화를 통해 소프트웨어 개발 프로세스를 개선하는 방법론입니다. CI/CD는 개발자들이 자주 코드를 통합하고, 자동화된 테스트와 배포를 통해 더 빠르고 안정적인 소프트웨어 배포를 가능하게 합니다.
1.1. Continuous Integration (CI)
CI는 소프트웨어 개발에서 개발자들이 작성한 코드가 버전 관리 시스템에 자주 통합되는 프로세스를 의미합니다. 코드 변경 사항이 버전 관리 시스템에 푸시될 때마다 자동으로 빌드와 테스트가 수행되어 코드의 품질을 지속적으로 확인합니다.
- 목표: 변경 사항을 작은 단위로 자주 통합하여 충돌을 최소화
- 주요 도구: Jenkins, Git, Maven, Gradle, TestNG, JUnit 등
1.2. Continuous Deployment (CD)
CD는 코드가 성공적으로 빌드되고 테스트된 후, 자동으로 배포까지 이루어지는 프로세스입니다. 개발자가 코드를 푸시하면 CI가 자동으로 빌드하고, 테스트 후 CD 파이프라인이 배포까지 처리합니다.
- 목표: 자동화된 배포를 통해 빠르고 안정적인 배포 환경을 유지
- 주요 도구: Jenkins, Docker, Kubernetes, Ansible, Helm 등
1.3. 실무 적용 사례
기업에서는 CI/CD를 통해 소프트웨어 품질을 높이고, 개발과 배포 속도를 향상시키는 방법을 사용합니다. 예를 들어, Amazon, Netflix, Facebook과 같은 대형 기업은 Jenkins와 같은 CI/CD 도구를 활용하여 수천 개의 코드 변경 사항을 실시간으로 배포하고 있습니다.
2️⃣ Jenkins를 이용한 CI/CD 기본 Pipeline 구축
Jenkins에서 CI/CD 파이프라인을 구축하려면 여러 단계를 자동화하고, 이를 Pipeline
으로 정의해야 합니다. Jenkins는 Declarative Pipeline
과 Scripted Pipeline
두 가지 방식으로 파이프라인을 작성할 수 있습니다.
2.1. Declarative Pipeline 예제
pipeline {
agent any
stages {
stage('Build') {
steps {
script {
echo 'Building the project...'
// 빌드 작업 (예: Maven, Gradle)
}
}
}
stage('Test') {
steps {
script {
echo 'Running tests...'
// 테스트 작업 (예: JUnit)
}
}
}
stage('Deploy') {
steps {
script {
echo 'Deploying the project...'
// 배포 작업 (예: Docker, Kubernetes)
}
}
}
}
}
2.2. Pipeline 단계 설명
- Build: 코드를 빌드하는 단계입니다. Maven, Gradle, Makefile 등 다양한 빌드 도구를 사용할 수 있습니다.
- Test: 빌드 후 테스트를 실행하는 단계입니다. JUnit, TestNG 등을 이용해 단위 테스트를 수행합니다.
- Deploy: 테스트가 성공하면 자동으로 배포하는 단계입니다. Docker, Kubernetes를 이용하여 애플리케이션을 배포합니다.
3️⃣ Code → Build → Test → Deploy 자동화
CI/CD 파이프라인에서 Code → Build → Test → Deploy 단계는 코드 변경부터 최종 배포까지의 자동화 흐름을 의미합니다. Jenkins는 이러한 파이프라인을 설정하고, 코드를 푸시할 때마다 자동으로 실행되도록 할 수 있습니다.
3.1. Code: Git 저장소에 코드 푸시
개발자는 GitHub, GitLab, Bitbucket 등의 Git 저장소에 코드를 푸시합니다. Jenkins는 이 저장소를 모니터링하고, 코드 푸시 시 자동으로 파이프라인을 실행합니다.
3.2. Build: 코드 빌드
코드가 푸시되면 Jenkins는 빌드 단계에서 Maven, Gradle 등 빌드 도구를 사용하여 프로젝트를 컴파일하고 패키징합니다. 이때 Build
라는 Jenkins Job이 실행됩니다.
3.3. Test: 자동화된 테스트
빌드가 완료되면 Jenkins는 자동으로 유닛 테스트, 통합 테스트 등을 실행합니다. JUnit, TestNG 등의 프레임워크를 사용하여 테스트를 자동화할 수 있습니다.
3.4. Deploy: 자동 배포
테스트가 성공하면 Jenkins는 자동으로 배포를 시작합니다. Docker, Kubernetes, Helm 등을 이용하여 자동으로 프로덕션 환경에 배포할 수 있습니다.
4️⃣ Java(Spring Boot), Python, Node.js CI/CD 구축 예제
Jenkins를 사용하여 다양한 언어 및 프레임워크에 대한 CI/CD를 설정할 수 있습니다. 아래는 각각의 예시입니다.
4.1. Java(Spring Boot) CI/CD 구축
pipeline {
agent any
stages {
stage('Build') {
steps {
script {
echo 'Building the Spring Boot project...'
sh './mvnw clean install'
}
}
}
stage('Test') {
steps {
script {
echo 'Running tests...'
sh './mvnw test'
}
}
}
stage('Deploy') {
steps {
script {
echo 'Deploying the Spring Boot application...'
// Docker 이미지 생성 후 배포
}
}
}
}
}
4.2. Python CI/CD 구축
pipeline {
agent any
stages {
stage('Build') {
steps {
script {
echo 'Building the Python project...'
sh 'pip install -r requirements.txt'
}
}
}
stage('Test') {
steps {
script {
echo 'Running tests...'
sh 'pytest'
}
}
}
stage('Deploy') {
steps {
script {
echo 'Deploying the Python application...'
// Docker, AWS Lambda 등으로 배포
}
}
}
}
}
4.3. Node.js CI/CD 구축
pipeline {
agent any
stages {
stage('Build') {
steps {
script {
echo 'Building the Node.js project...'
sh 'npm install'
}
}
}
stage('Test') {
steps {
script {
echo 'Running tests...'
sh 'npm test'
}
}
}
stage('Deploy') {
steps {
script {
echo 'Deploying the Node.js application...'
// Docker, Kubernetes 등으로 배포
}
}
}
}
}
5️⃣ Jenkins와 Ansible을 이용한 인프라 자동화
Ansible은 IT 자동화 도구로, Jenkins와 연동하여 인프라의 자동화 배포를 수행할 수 있습니다. 예를 들어, Jenkins에서 빌드가 완료된 후 Ansible을 이용하여 서버에 소프트웨어를 자동으로 배포할 수 있습니다.
pipeline {
agent any
stages {
stage('Build') {
steps {
script {
echo 'Building the project...'
// 빌드 작업
}
}
}
stage('Deploy') {
steps {
script {
echo 'Deploying with Ansible...'
sh 'ansible-playbook deploy.yml'
}
}
}
}
}
6️⃣ Blue-Green Deployment 및 Canary Deployment 적용
Jenkins를 사용하여 Blue-Green Deployment와 Canary Deployment를 설정할 수 있습니다. 이 두 가지 배포 방식은 애플리케이션의 다운타임을 최소화하고, 배포 리스크를 줄이는 데 사용됩니다.
6.1. Blue-Green Deployment
Blue-Green Deployment는 두 개의 독립된 환경(Blue와 Green)을 만들어서 하나는 현재 배포된 버전, 다른 하나는 새로운 버전으로 유지합니다. 새로운 버전을 배포할 때, 기존 버전을 차단하고 새로운 버전을 활성화합니다.
6.2. Canary Deployment
Canary Deployment는 일부 사용자에게만 새로운 버전을 배포하여, 점진적으로 새로운 버전을 배포하는 방법입니다. 이 방법은 배포 리스크를 최소화하는 데 유리합니다.
그림: Blue-Green 및 Canary Deployment 예시
Jenkins를 이용한 CI/CD 파이프라인 구축은 소프트웨어 개발의 속도와 품질을 높이는 데 중요한 역할을 합니다. Jenkins의 자동화 기능을 잘 활용하면 효율적인 배포 및 테스트 환경을 구축할 수 있습니다.