在 Jenkinsfile 中,两种构建jar包方式
在 Jenkinsfile 中,您可以选择在构建过程中生成 JAR 包,然后将该 JAR 包复制到 Docker 镜像中,也可以在 Dockerfile 中使用多阶段构建来完成相同的工作。具体选择取决于您的构建流程和需求。
方案一:在 Jenkins 中生成 JAR 包,然后进行 Docker 构建
这种方法将 JAR 包的构建过程放在 Jenkins 流水线中完成,然后在 Dockerfile 中使用生成的 JAR 包。
Dockerfile
# 基础镜像仅用于运行阶段
FROM openjdk:11-jre-slim
# 设置工作目录
WORKDIR /app
# 将构建好的 JAR 文件复制到镜像中
COPY target/app.jar /app/app.jar
# 设置容器启动时运行的命令
CMD ["java", "-jar", "app.jar"]
Jenkinsfile
pipeline {
agent any
environment {
DOCKER_CREDENTIALS_ID = 'dockerhub-credentials-id' // Docker Hub 凭据 ID
DOCKER_IMAGE = 'myapp:latest'
}
stages {
stage('Checkout') {
steps {
// 检出代码
checkout scm
}
}
stage('Build JAR') {
steps {
// 在 Jenkins 工作区中构建 JAR 包
sh 'mvn clean package'
}
}
stage('Build Docker Image') {
steps {
script {
// 构建 Docker 镜像,将生成的 JAR 包包含进去
docker.build(env.DOCKER_IMAGE)
}
}
}
stage('Push Docker Image') {
steps {
script {
docker.withRegistry('https://index.docker.io/v1/', env.DOCKER_CREDENTIALS_ID) {
docker.image(env.DOCKER_IMAGE).push()
}
}
}
}
}
}
方案二:在 Dockerfile 中使用多阶段构建
这种方法将 JAR 包的构建过程包含在 Dockerfile 中,通过多阶段构建来生成最终的运行镜像。
Dockerfile
# 第一阶段:构建阶段
FROM maven:3.6.3-jdk-11 AS builder
# 设置工作目录
WORKDIR /app
# 复制 Maven 的配置文件
COPY pom.xml .
# 下载依赖,这样可以利用 Docker 缓存
RUN mvn dependency:go-offline
# 复制源代码到工作目录
COPY src /app/src
# 编译和打包应用程序
RUN mvn package
# 第二阶段:运行阶段
FROM openjdk:11-jre-slim
# 设置工作目录
WORKDIR /app
# 从构建阶段复制 JAR 文件到运行阶段
COPY --from=builder /app/target/app.jar /app/app.jar
# 设置容器启动时运行的命令
CMD ["java", "-jar", "app.jar"]
Jenkinsfile
pipeline {
agent any
environment {
DOCKER_CREDENTIALS_ID = 'dockerhub-credentials-id' // Docker Hub 凭据 ID
DOCKER_IMAGE = 'myapp:latest'
}
stages {
stage('Checkout') {
steps {
// 检出代码
checkout scm
}
}
stage('Build Docker Image') {
steps {
script {
// 使用 Dockerfile 构建 Docker 镜像
docker.build(env.DOCKER_IMAGE)
}
}
}
stage('Push Docker Image') {
steps {
script {
docker.withRegistry('https://index.docker.io/v1/', env.DOCKER_CREDENTIALS_ID) {
docker.image(env.DOCKER_IMAGE).push()
}
}
}
}
}
}
总结
- 方案一:在 Jenkinsfile 中先构建 JAR 包,然后在 Docker 构建阶段将该 JAR 包复制到 Docker 镜像中。这种方法更直观,适合构建步骤较为简单的项目。
- 方案二:在 Dockerfile 中使用多阶段构建,将构建和运行环境分离。这种方法优化了 Docker 镜像的大小和安全性,但需要更多的 Dockerfile 知识。
两种方案都可以实现同样的结果,选择哪种方案取决于您的具体需求和偏好。对于复杂的构建流程,多阶段构建可能更具优势,而对于简单的构建流程,直接在 Jenkinsfile 中构建 JAR 包然后进行 Docker 构建可能更为方便。