Jenkins 与 Docker 实现Java项目CI/CD:持续集成与持续交付的优化实践

567 阅读1分钟

本文档介绍了使用Docker部署Jenkins服务、项目构建流程步骤、项目的Dockerfile以及服务器构建脚本。下面是各部分的简要概述:

一. 安装部署Jenkins

通过Docker部署Jenkins服务的命令如下:

docker run \   
-u root \   
-d \   
-p 8080:8080 \   
-p 50000:50000 \   
-v jenkins-data:/var/jenkins_home \   
-v /var/run/docker.sock:/var/run/docker.sock \  
jenkinsci/blueocean

二. 项目构建流程步骤

创建一个项目构建部署任务,例如使用“构建一个Maven项目”,然后按顺序编排代码拉取、源码编译、制作镜像、容器替换等操作。 image.png

三. 项目的Dockerfile

在项目根目录添加Dockerfile文件,用于构建镜像。Dockerfile的内容包括依赖基础Java环境镜像、设置变量、指定容器时区、复制本地JAR文件到镜像中、设置启动命令等。

# 依赖基础java环境镜像 
FROM openjdk:8-jre 

# 维护者
MAINTAINER zhucan 

# 设置变量 (其他配置都是通用的, 每个项目仅需改动此地) 
ENV ProjectName operational-analysis 
# 镜像中的服务源码地址 
ENV WorkDir /opt/run/web 
ENV JarFile $ProjectName-0.0.1-SNAPSHOT.jar 

# 指定容器时区 
ENV TZ=Asia/Shanghai 
# 设置时区 
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone 

# 数据卷 VOLUME /tmp 

# 复制本地jar文件到镜像中 
RUN mkdir -p $WorkDir COPY /target/$JarFile $WorkDir 

# ENTRYPOINT ["java", "-jar", "$WorkDir/$JarFile"] 
# 服务启动环境配置(使用jenkins注入环境变量) 
# ENV Profile prod 
# 启动命令 #ENTRYPOINT java -Dspring.profiles.active=$Profile -jar $WorkDir/$JarFile 
ENTRYPOINT java -jar $WorkDir/$JarFile 

# 暴露服务端口 
EXPOSE 8080

四. 服务器构建脚本

通过Jenkins的SSH插件远程到要部署的目标服务器执行部署脚本。部署脚本包括清除历史容器、清除本地镜像、重新拉取镜像并运行等操作。

#!/bin/bash 
# 容器名称 
CONTAINER_NAME=operational_analysis_prod_zhucan 
# 镜像 
IMAGE_NAME=hub.mingyuanyun.com/ykj-bjky/operational_analysis DOCKER_IMAGE=${IMAGE_NAME}:prod.${BUILD_NUMBER}
echo "$DOCKER_IMAGE" 

# 清除历史容器 
historicalContainerId=`docker ps -a | grep -w ${CONTAINER_NAME} | awk '{print $1}'` 
if [[ "$historicalContainerId" != "" ]] ; then 

    # 关停容器
    docker stop $historicalContainerId 
    # 删除容器 
    docker rm $historicalContainerId

    echo "删除历史容器: $historicalContainerId"
fi

# 清除本地镜像 
localImageId=`docker images | grep -w ${IMAGE_NAME} | awk '{print $3}'`
if [[ "$localImageId" != "" ]] ;then 
    # 删除镜像 
    docker rmi -f $localImageId 
    echo "删除镜像: $localImageId" 
fi

# 重新拉取镜像并运行 
docker run -d -p8089:8080 -p8999:8996 -e "SPRING_PROFILES_ACTIVE=prod" --name=${CONTAINER_NAME} ${DOCKER_IMAGE}

echo "容器启动完成-.-"