728x90
반응형
개요
자동화를 위해 gradle 파일에 도커 이미지 빌드, 생성, 푸시를 를 작성해 준다.
라이브러리
// Docker
// https://mvnrepository.com/artifact/com.bmuschko.docker-remote-api/com.bmuschko.docker-remote-api.gradle.plugin
implementation 'com.bmuschko.docker-remote-api:com.bmuschko.docker-remote-api.gradle.plugin:9.4.0'
// https://mvnrepository.com/artifact/com.bmuschko.docker-java-application/com.bmuschko.docker-java-application.gradle.plugin
implementation 'com.bmuschko.docker-java-application:com.bmuschko.docker-java-application.gradle.plugin:9.4.0'
gradle 코드
- 도커는 동일한 패스에 있는 파일만 COPY 가 가능 하기때문에
- 생성된 jar 파일을 도커 파일이 있는 곳으로 옮겨 줘야 한다.
import com.bmuschko.gradle.docker.tasks.image.DockerBuildImage
import com.bmuschko.gradle.docker.tasks.image.DockerPushImage
import com.bmuschko.gradle.docker.tasks.image.Dockerfile
plugins {
id 'java'
id 'org.springframework.boot' version '3.4.2'
id 'io.spring.dependency-management' version '1.1.7'
id 'com.bmuschko.docker-remote-api' version '9.4.0'
id 'com.bmuschko.docker-java-application' version '9.4.0'
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
repositories {
mavenCentral()
}
ext {
set('springCloudVersion', "2024.0.0")
DEFAULT_PROFILE = "local"
SERVICE_VERSION = new Date().format("yyyyMMddHHmmss", TimeZone.getTimeZone("Asia/Seoul"))
SERVICE_NAME = 'config-server'
DEFAULT_DOCKER_HUB_REPOSITORY = 'rnrl1215/p8labs-config'
def isDepoly = project.hasProperty('isDepoly')
profile = isDepoly ? project.property("profile") : "${DEFAULT_PROFILE}"
serviceVersion = isDepoly ? project.property("serviceVersion") : "${SERVICE_VERSION}"
serviceName = isDepoly ? project.property('serviceName') : "${SERVICE_NAME}"
dockerRepository = isDepoly ? project.property('dockerRepository') : "${DEFAULT_DOCKER_HUB_REPOSITORY}"
dockerUser = isDepoly ? project.property('dockerUser') : ""
dockerPasswd = isDepoly ? project.property('dockerPasswd') : ""
SERVICE_NAME = serviceName
SERIVCE_VERSION = serviceVersion
PROFILE = profile
DOCKER_REPOSITORY = dockerRepository
DOCKER_USER = dockerUser
DOCKER_PASSWORD = dockerPasswd
println "[ BUILD INFO ] PROFILE : ${PROFILE}"
println "[ BUILD INFO ] Service VERSION : ${SERIVCE_VERSION}"
println "[ BUILD INFO ] Service NAME : ${SERVICE_NAME}"
println "[ BUILD INFO ] DOCKER USER : ${DOCKER_USER}"
println "[ BUILD INFO ] DOCKER PASSWD : ${DOCKER_PASSWORD}"
println "[ BUILD INFO ] DOCKER PASSWD : ${DOCKER_REPOSITORY}"
}
group = 'com.p8labs'
version = "${SERIVCE_VERSION}"
// 실행 가능한 JAR 생성 설정
bootJar {
enabled = true
archiveBaseName = "${SERVICE_NAME}-${PROFILE}"
doLast {
copy {
def jarFile = tasks.bootJar.archiveFile.get().asFile
def jarFilePath = jarFile.path
archiveBaseName = "${SERVICE_NAME}" + "${PROFILE}"
from jarFilePath
into getRootDir().path + "/build/docker/"
}
}
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.cloud:spring-cloud-config-server'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
tasks.named('test') {
useJUnitPlatform()
}
apply from: 'docker.gradle'
tasks.create('createDockerfile', Dockerfile) {
def jarFile = tasks.bootJar.archiveFile.get().asFile
def path = jarFile.getParent();
def jarFileFulPath = "/"+ "${SERVICE_NAME}"+"-"+"${PROFILE}"+"-"+"${SERIVCE_VERSION}"+'.jar';
println "[ CRATE DOCKER FILE INFO ] PATH : ${path}"
println "[ CRATE DOCKER FILE INFO ] PROFILE : ${PROFILE}"
println "[ CRATE DOCKER FILE INFO ] SERVICE NAME : ${SERVICE_NAME}"
println "[ CRATE DOCKER FILE INFO ] SERVICE_VERSION : ${SERIVCE_VERSION}"
println "[ CRATE DOCKER FILE INFO ] JAR PATH : ${jarFileFulPath}"
from('openjdk:17-jdk-slim')
arg("JAR_FILE")
copyFile(jarFileFulPath, '/'+"${SERVICE_NAME}"+'.jar')
runCommand("mkdir -p target/dependency && (cd target/dependency; jar -xf /"+"${SERVICE_NAME}"+".jar"+")")
entryPoint("java", "-jar", "/"+"${SERVICE_NAME}"+".jar")
exposePort(8071)
}
task buildImage(type: DockerBuildImage) {
dependsOn createDockerfile
images.add("${DOCKER_REPOSITORY}"+"-"+"${PROFILE}"+":"+"${SERIVCE_VERSION}")
}
task pushDocker(type: DockerPushImage) {
dependsOn buildImage // Docker 이미지 빌드 후 푸시
images.add("${DOCKER_REPOSITORY}"+"-"+"${PROFILE}"+":"+"${SERIVCE_VERSION}")
registryCredentials {
username = "${DOCKER_USER}"
password = "${DOCKER_PASSWORD}"
}
}
코드 분석
변수 처리 하는 부분
ext {
set('springCloudVersion', "2024.0.0")
DEFAULT_PROFILE = "local"
SERVICE_VERSION = new Date().format("yyyyMMddHHmmss", TimeZone.getTimeZone("Asia/Seoul"))
SERVICE_NAME = 'config-server'
DEFAULT_DOCKER_HUB_REPOSITORY = 'rnrl1215/p8labs-config'
def isDepoly = project.hasProperty('isDepoly')
profile = isDepoly ? project.property("profile") : "${DEFAULT_PROFILE}"
serviceVersion = isDepoly ? project.property("buildNumber") : "${SERVICE_VERSION}"
serviceName = isDepoly ? project.property('serviceName') : "${SERVICE_NAME}"
dockerRepository = isDepoly ? project.property('dockerRepository') : "${DEFAULT_DOCKER_HUB_REPOSITORY}"
dockerUser = isDepoly ? project.property('dockerUser') : ""
dockerPasswd = isDepoly ? project.property('dockerPasswd') : ""
SERVICE_NAME = serviceName
SERIVCE_VERSION = serviceVersion
PROFILE = profile
DOCKER_REPOSITORY = dockerRepository
DOCKER_USER = dockerUser
DOCKER_PASSWORD = dockerPasswd
println "[ BUILD INFO ] PROFILE : ${PROFILE}"
println "[ BUILD INFO ] Service VERSION : ${SERIVCE_VERSION}"
println "[ BUILD INFO ] Service NAME : ${SERVICE_NAME}"
println "[ BUILD INFO ] DOCKER USER : ${DOCKER_USER}"
println "[ BUILD INFO ] DOCKER PASSWD : ${DOCKER_PASSWORD}"
println "[ BUILD INFO ] DOCKER PASSWD : ${DOCKER_REPOSITORY}"
}
도커 파일 생성
이미지 빌드에 필요한 도커파일을 생성해준다.
apply from: 'docker.gradle'
tasks.create('createDockerfile', Dockerfile) {
def jarFile = tasks.bootJar.archiveFile.get().asFile
def path = jarFile.getParent();
def jarFileFulPath = "/"+ "${SERVICE_NAME}"+"-"+"${PROFILE}"+"-"+"${SERIVCE_VERSION}"+'.jar';
println "[ CRATE DOCKER FILE INFO ] PATH : ${path}"
println "[ CRATE DOCKER FILE INFO ] PROFILE : ${PROFILE}"
println "[ CRATE DOCKER FILE INFO ] SERVICE NAME : ${SERVICE_NAME}"
println "[ CRATE DOCKER FILE INFO ] SERVICE_VERSION : ${SERIVCE_VERSION}"
println "[ CRATE DOCKER FILE INFO ] JAR PATH : ${jarFileFulPath}"
from('openjdk:17-jdk-slim')
arg("JAR_FILE")
copyFile(jarFileFulPath, '/'+"${SERVICE_NAME}"+'.jar')
runCommand("mkdir -p target/dependency && (cd target/dependency; jar -xf /"+"${SERVICE_NAME}"+".jar"+")")
entryPoint("java", "-jar", "/"+"${SERVICE_NAME}"+".jar")
exposePort(8071)
}
Image buid, push
위에 생성된 도커파일 기반으로 이미지를 생성하고 push 한다.
task buildImage(type: DockerBuildImage) {
dependsOn createDockerfile
images.add("${DOCKER_REPOSITORY}"+"/"+"${SERVICE_NAME}"+":"+"${SERIVCE_VERSION}")
}
task pushDocker(type: DockerPushImage) {
dependsOn buildImage // Docker 이미지 빌드 후 푸시
images.add("${DOCKER_REPOSITORY}"+"/"+"${SERVICE_NAME}"+":"+"${SERIVCE_VERSION}")
registryCredentials {
username = "${DOCKER_USER}"
password = "${DOCKER_PASSWORD}"
}
}
명령어 수행
./gradlew clean -x test build
-PisDepoly=true
-Pprofile=dev
-PserviceVersion=0.0.1
-PserviceName=config-server
-PdockerRepository=rnrl1215/p8labs-config
-PdockerUser={도커허브 아이디}
-PdockerPasswd={도커허브 비번}
dockerPush
도커 허브에 올라간 화면
다음으로
이제 명령어를 알았으니 젠킨스를 통해서 자동 배포를 작업하면 된다.
728x90
반응형
'Development > Docker' 카테고리의 다른 글
[Docker] ClickHouse DB 연동 (0) | 2022.04.03 |
---|---|
[Docker] Docker 설치하기 (0) | 2021.07.22 |
[Docker] Docker 의 개념 (0) | 2021.07.21 |
댓글