-젠킨슨 파이프라인으로 빌드
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"]
빌드 성공
web-was 구축해보기 (nginx-proxy) -(2) (0) | 2024.04.07 |
---|---|
web-was 구축해보기 (nginx-proxy) -(1) (0) | 2024.04.06 |
maven 프로젝트 빌드 - springboot(rds연동) (0) | 2024.03.10 |
eks 웹어플리케이션 배포 영상 (CI/CD) (0) | 2024.03.08 |
CI/CD 라인 구성 - EKS 웹어플리케이션기반 인프라 구축 - (3) (0) | 2024.03.08 |