웹 파이프라인/Jenkins

젠킨스 프로젝트와 젠킨스 파이프라인 설정

thinktank911 2025. 12. 16. 14:05

젠킨스 프로젝트 설정

  • 프로젝트 소스가 담긴 Github 레포지토리 준비
  • 젠킨스 빌드 환경 설정
    • Build Steps > Execute shell
    • docker build -t [도커허브username]/이미지명 .
    • docker push [도커허브username]/이미지명
  • Docker 이용해 이미지 빌드하고 DockerHub 레지스트리에 푸시
  • kubctl을 이용 레지스트리로부터 이미지 가져다 같은 클러스터에 배포 및 노출

컨테이너 스펙을 작성해서 포드 템플릿 설정

  • 신규추가 포드 템플릿에 두 개 컨테이너 스펙 포함 예정
  • 빌드 작업 실해할 컨테이너(이름:jnlp)
    • JNLP을 따라 Jenkins 마스터와 작업 조율하면서 빌드 작업 실행
    • docker CLI와 kubectl CLI (잠시 후에 이용하려고 하니)를 갖추고 있음
    • 미리 만들어진 이미지 이용
  • 도커 데몬을 실행하는 컨테이너(이름:dind)
    • 어느 클러스터에 있더라도 통일된 docker build 환경 제공 위해 독립된 컨테이너로 제공
      • 이미지 : docker:latest 이용

[이슈]
문제발생 : 에러 계속남. pending 문제.

2025.12.16 - [웹 파이프라인/Jenkins] - [트러블슈팅]Jenkins + Kubernetes Agent Pending / Docker Build 실패

 

[트러블슈팅]Jenkins + Kubernetes Agent Pending / Docker Build 실패

1> 문제 발생 (Symptoms) 현상 1 — Jenkins 빌드가 계속 PendingFreestyle Project 실행 시 Waiting for next available executor Jenkins UI에서 에이전트가 잡히지 않음kubectl get pod -n jenkins 시 에이전트 Pod 생성되지 않거

thinktank911.tistory.com

 

 

Kubernetes 클러스터 접근 권한 설정 (준비)

Docker desktop 이용한 클러스터를 운용하고 있는 호스트(내컴퓨터)에서
~/.kube/config 파일 꺼내보면

  • 쿠버네티스 컨트롤 플레인에 접속 위한 서버 url
  • 여기 접속할 계정의 이름
  • 이 계정을 인증하기 위하여 제출할 데이터

=> 노출 x
=> 이 내용을 내 클러스터 내의 Jenkins에게는 알려줄 수 있음

 


간단한 젠킨스 파이프라인

  • 간단한 파이프라인을 구성하고 이에 의해서 다음 과정이 수행되도록 실험
    • docker build & push
    • kubectl에 의하여 deployment 및 service 생성
  • 위 파이프라인 정의를 Jenkinsfile로 만들고 이것을 리포지토리에 등록하여 빌드 과정 자동화

[파이프라인 스크립트 구조]

pipeline {
    environment {

    }
    agent any
    stages {
        stage() {

        }
        stage
        stage
    }
    post {
        always {

        }
    }
}

 

파이프라인 스크립트

  • 도커 pipeline 플러그인 있어야함
  • agent any => kubernetes로 변경 
pipeline {
    environment {
        dockerImageName = "geniusyoung/simple-echo"
    }
    agent {
        kubernetes {
            yaml '''
            apiVersion: v1
            kind: Pod
            spec:
                containers:
                - name: jnlp
                  image: sheayun/jnlp-agent-sample
                  env:
                  - name: DOCKER_HOST
                    value: "tcp://localhost:2375"
                  - name: dind
                    image: docker:24-dind
                    command:
                    - /usr/local/bin/dockerd-entrypoint.sh
                    env:
                    - name: DOCKER_TLS_CERTDIR
                      value: ""
                    securityContext:
                      privileged: true
            '''
        }
    }
    stages {
        stage('git scm update') {
            steps {
                sh "git clone https://github.com/7saval/jenkins_exam.git ."
            }
        }
        stage('docker build && push') {
            steps {
                script {
                    dockerImage = docker.build.dockerImageName
                    docker.withRegistry('https://registry.hub.docker.com',
                        'dockerhub-credentials') {
                            dockerImage.push("latest")
                        }
                }
            }
        }
        stage('deploy application on kubernetes cluster'){
            steps {
                withKubeConfig([credentialsId: 'KUBECONFIG',
                    serverUrl: 'https://kubernetes.default',
                    namespace: 'jenkins'
                ]) {
                    sh '''
                    kubectl apply -f deployment.yaml
                    kubectl apply -f service.yaml
                    '''
                }
            }
        }
    }
    post {
        always {
            sh 'docker logout'
        }
    }
}

 

Jenkinsfile로 자동화

  • git scm update의 step 내용 변경
 stage('git scm update') {
            steps {
                // sh "git clone https://github.com/7saval/jenkins_exam.git ."
                checkout scm
            }
        }
  • definition 변경
    • Pipeline script from SCM
    • git 설정

요약