본문 바로가기
DevOps/CI-CD

[CI-CD] Jenkinsfile 작성법

by 클레어몬트 2025. 5. 2.

https://claremont.tistory.com/entry/CI-CD-%EC%A0%A0%ED%82%A8%EC%8A%A4Jenkins-%EA%B0%9C%EB%85%90-%EC%9E%A1%EA%B8%B0

 

[CI-CD] 젠킨스(Jenkins) 개념 잡기

CI/CD를 처음 접할 때, 보통 Github Actions 와 Jenkins 라는 이름을 자연스럽게 접하게 된다!깃허브 액션이 좀 더 쉽고 간편하고, 젠킨스가 좀 더 복잡하기는 하다하지만 그만큼 더 강력하다 이 글에서

claremont.tistory.com

 

 

 

저번 글에서 Jenkins의 개념과 설치 방법, 그리고 기본적인 동작 방식에 대해 다뤄봤다.

특히 Jenkins가 왜 필요한지, 어떻게 소스 변경을 감지하고 빌드-테스트-배포까지 자동화하는지 전체적인 플로우를 소개했다.

 

이번 글에서는 그 흐름의 핵심이라 할 수 있는 Jenkinsfile 작성 방법에 대해 정리해보려 한다!

 

 

Jenkinsfile이란?

Jenkins에서 수행할 빌드, 테스트, 배포 과정을 코드로 정의한 파일

쉽게 말하면, Jenkins가 따라야 할 레시피(Recipe)를 .groovy 문법 형식으로 적어둔 스크립트라고 보면 된다.

 

Jenkinsfile을 통해

  • 빌드 과정을 버전 관리할 수 있고
  • 누구나 동일한 자동화 프로세스를 재현 가능하게 만들 수 있다

 

[기본 구조]

pipeline {
    agent any

    stages {
        stage('단계 이름') {
            steps {
                // 실행할 명령어
                sh 'echo Hello Jenkins!'
            }
        }
    }
}
  • pipeline: 선언형 파이프라인의 시작
  • agent any: Jenkins가 작업을 어디서 실행할지 지정 (여기선 아무 노드나 사용)
  • stages: 여러 단계(stage)를 정의 - 이것들이 모여져 파이프라인이 완성된다
  • steps: 실제로 실행되는 셸 명령어 or 스크립트

 

 

(Jenkinsfile 적용 프로젝트 예시) stock-market

아래의 코드를 통해 이같은 파이프라인이 형성된다(총 5단계)

pipeline {
    agent any

    environment {
        GIT_URL = 'https://github.com/imclaremont/stock-market.git'
        GIT_BRANCH = 'main' // 또는 master
        GIT_ID = 'skala-github-id' // GitHub PAT credential ID
        IMAGE_REGISTRY = 'amdp-registry.skala-ai.com/skala25a'
        IMAGE_NAME = 'sk029-stock-market'
        IMAGE_TAG = '1.0'
        DOCKER_CREDENTIAL_ID = 'skala-image-registry-id'  // Harbor 인증 정보 ID
    }

    stages {
        stage('Clone Repository') {
            steps {
                git branch: "${GIT_BRANCH}",
                    url: "${GIT_URL}",
                    credentialsId: "${GIT_ID}"   // GitHub PAT credential ID
            }
        }

        stage('Build with Maven') {
            steps {
                sh 'mvn clean package -DskipTests'
            }
        }

        stage('Docker Build & Push') {
            steps {
                script {
                    docker.withRegistry("https://${IMAGE_REGISTRY}", "${DOCKER_CREDENTIAL_ID}") {
                        def appImage = docker.build("${IMAGE_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}", "--platform=linux/amd64 .")
                        appImage.push()
                    }
                }
            }
        }

        stage('Deploy to Kubernetes') {
            steps {
                sh '''
                    # 1. Ingress 먼저 삭제 (존재하지 않아도 무시)
                    kubectl delete -f k8s/ingress.yaml --ignore-not-found
                    
                    # 2. 기본 리소스 배포
                    kubectl apply -f k8s/deployment.yaml
                    kubectl apply -f k8s/service.yaml
                    kubectl apply -f k8s/configmap.yaml
                    kubectl apply -f k8s/hpa.yaml
                    
                    # 3. Ingress 마지막에 배포
                    kubectl apply -f k8s/ingress.yaml
                    
                    # 4. 배포 상태 확인
                    kubectl rollout status deployment/sk029-stock-market-deployment
                '''
            }
        }
    }
}

https://github.com/imclaremont/stock-market

 

GitHub - imclaremont/stock-market: SpringBoot + Docker + K8s + Jenkins

SpringBoot + Docker + K8s + Jenkins. Contribute to imclaremont/stock-market development by creating an account on GitHub.

github.com

루트 디렉터리 구조
k8s 디렉터리 구조

 

- deployment.yaml : 애플리케이션(Pod)의 배포 전략과 스펙을 정의하는 파일(어떤 Docker 이미지를 사용할지, 몇 개의 Pod를 띄울지 - replicas, 어떤 포트를 열지 등)

 

- ingress.yaml : IP/도메인 기반 라우팅 설정 (ex: example.com → 특정 Service, 쉽게 말해서 외부용이다)

 

- service.yaml : Pod들을 외부나 클러스터 내부에서 접근할 수 있게 하는 접근 포인트(LoadBalancer 역할, 쉽게 말해서 내부용이다)

 

- configmap.yaml : 환경 변수, 설정 파일 등 애플리케이션의 설정을 관리

 

- hpa.yaml : 애플리케이션 부하에 따라 Pod 수를 자동 조절(Health Check: CPU 사용률 / 메모리 등 기준으로 자동 스케일링)

 

 

 

 

 

+ 이 젠킨스파일 설정을 적용하는 2가지 방식

저기 Definition 탭에서 선택할 수 있다!

'DevOps > CI-CD' 카테고리의 다른 글

[CI-CD] ArgoCD를 쓰는 이유  (0) 2025.05.02
[CI-CD] 젠킨스(Jenkins) 개념 잡기  (0) 2025.04.29