상세 컨텐츠

본문 제목

maven 프로젝트를 젠킨슨에서 도커 이미지 빌드 (CI) -kaniko

web-application 시스템 구축

by drogva 2024. 3. 10. 18:05

본문

-젠킨슨 파이프라인으로 빌드 

 maven project 로 빌드 안한 이유: git hub 에서 프로젝트를 불러와 젠킨슨 내부에 jar 파일을 생성할 수 있고 설정에서 docker 이미지로 빌드해 hub 에 저장할 수 있다고 하나 어차피 eks 워커노드에 docker 가 설치되어 있지 않다.

젠킨슨 컨테이너 형식으로 생성되어 있으나 도커이미지를 생성하라면 젠킨슨 내부에 docker 가 설치 되야 하고 젠킨슨 입장에서 호스트인 워커노드에도 도커가 설치되어 있어 소켓을 공유해야 한다. 하지만 이 과정이 복잡해 도커데몬없이 도커이미지를 생성할 수 있는 kaniko 와 jib 를 쓰기로 한다. 

 

-파이프라인

 

pipeline {
    options {
        timeout(time: 1, unit: 'HOURS')
    }

    environment {
        DOCKER_REPOSITORY = '553186839963.dkr.ecr.ap-northeast-2.amazonaws.com/drogva'
        TAG = 'kpop'
        KUBE_CREDENTIAL_ID = 'ce897ee7-5ab4-4712-8281-f273591637ed'
        AWS_CLI_PATH = '/var/jenkins_home/aws-cli/v2/current/bin'
        AWS_REGION = 'ap-northeast-2'
        ECR_URL = '553186839963.dkr.ecr.ap-northeast-2.amazonaws.com'
    }

    agent {
        kubernetes {
            yaml '''
                apiVersion: v1
                kind: Pod
                spec:
                  containers:
                  - name: maven
                    image: maven:3-openjdk-17
                    command: ['sleep']
                    args: ['infinity']
                  - name: kaniko
                    image: gcr.io/kaniko-project/executor:debug
                    command: ['sleep']
                    args: ['infinity']
                    volumeMounts:
                    - name: registry-credentials
                      mountPath: /kaniko/.docker
                  volumes:
                  - name: registry-credentials
                    secret:
                      secretName: ecr-registry-secret
                      items: 
                      - key: .dockerconfigjson
                        path: config.json
            '''
        }
    }

    stages {
        stage('Checkout') {
            steps {
                git credentialsId: 'drogva', url: 'https://github.com/drogva/mvn.git', branch: 'main'
            }
        }

        stage('Build with Maven') {
            steps {
                container('maven') {
                    sh 'mvn clean install'
                }
            }
        }

        stage('Build and Push image') {
            steps {
                container('kaniko') {
                    script {
                        // Use Kubernetes Service Account Secret
                        withCredentials([string(credentialsId: KUBE_CREDENTIAL_ID, variable: 'KUBE_CONFIG')]) {
                            sh '''#!/busybox/sh
                                /kaniko/executor --context dir://$(pwd) --dockerfile=$(pwd)/Dockerfile --destination=${DOCKER_REPOSITORY}:${TAG}
                            '''
                        }
                    }
                }
            }
        }
    }
}

 

-순차적으로 maven 컨테이너, kaniko 컨테이너, 마스터 노드와 통신을 담당하는 jnlp 컨테이너가 생성되고 도커이미지가 빌드되면 사라진다. 

결국 eks 내부에서 일을 하고 agent kubernates 이므로 stages들이 종속성을 가지게 되는 것으로 볼 수 있다.

maven 컨테이너가  일을 해서 jar 파일 생성 -> kaniko 컨테이너가 DOCKERFILE 을 참조해서 JAR파일을 도커이미지로 빌드 후 ECR 에 푸쉬. 

 

- 네임스페이스 jenkins 에서 kaniko 컨테이너가 실행되는데 volume 에 마운트 되기 위한  ecr-registry-secret 은 직접 생성해야 한다. ecr 에 푸쉬하기 위한 자격증명. 

 

-aws ecr get-authorization-token --region ap-northeast-2 --output text --query 'authorizationData[].authorizationToken'

 

- kubectl create secret docker-registry ecr-registry-secret --docker-server={my_ecr_url} --docker-username=AWS --docker-password={ecr_token} -n jenkins

 

- secret/ecr-registry-secret created

 


Dockerfile

# 기본 베이스 이미지로 OpenJDK 17을 사용합니다.
FROM openjdk:17-alpine

# 애플리케이션 JAR 파일을 /app 디렉토리로 복사합니다.
COPY target/mvn-0.0.1-SNAPSHOT.jar /app/boot.jar

# 작업 디렉토리를 /app으로 설정합니다.
WORKDIR /app

# 애플리케이션을 실행합니다.
CMD ["java", "-jar", "boot.jar"]

 

 

 

빌드 성공


 

관련글 더보기