Jenkins + Gitlab + Maven 实现SpringBoot项目部署到Docker

一、Jenkins 安装:Docker 下 Jenkins 安装

二、配置Jenkins

2.1、设置Jenkins时区为北京时间

System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Shanghai')

2.2、 安装构建和部署所需的插件

2.2.1、安装 Maven 插件

2.2.2、安装Gitlab插件

2.2.3、安装SSH插件和Publish Over SSH插件

Publish Over SSH:因为我的项目是使用 Docker 启动 Springboot 服务;所以在 Jenkins 需要操作目标服务器,进行Dockerfile 启动

2.2.4、安装Docker 插件

2.2.4、重启一下Jenkins(也可以命令重启)

2.3、添加凭据

2.4、配置SSH remote hosts

注:配置SSH连接Dockerfile所在服务器的相关信息,并添加凭证,最后测试连接并保存;

2.5、全局工具配置

2.5.1、JDK配置

2.5.2、Git 安装配置 

2.5.3、Maven 安装配置 

 2.5.4、Docker 安装配置

3、新建Jenkins任务

3.1、新建任务

3.2、配置git地址

3.3、配置前步骤

SERVER_NAME_1=test-demo
echo "=========================>>>>>>>工作空间WORKSPACE的地址:$WORKSPACE "
cd $WORKSPACE
echo "=========================>>>>>>>进入工作空间WORKSPACE,清除工作空间中原项目的工作空间$SERVER_NAME_1 "
rm -rf $SERVER_NAME_1
echo "=========================>>>>>>>清除工作空间中原项目的工作空间$SERVER_NAME_1 ......成功success"

 3.4、 配置maven

# -DskipTests 忽略测试
# -Pdev 配置文件环境
clean install -DskipTests -Pdev

3.5、执行任务

#=================================定义初始化变量======================================

# 操作项目路径(Dockerfile存放的路径)
BASE_PATH=/usr/local/java/space/test-demo

# jenkins构建好的源jar路径  
SOURCE_PATH=/usr/local/jenkins/workspace/test-demo/space-service

#【docker 镜像】【docker容器】【Dockerfile同目录下的jar名字[用它build生成image的jar]】SERVER_NAME=test-demo

#容器id  [grep -w 全量匹配容器名] [awk 获取信息行的第一列,即容器ID]  [无论容器启动与否,都获取到]
CID=$(docker ps -a | grep -w "$SERVER_NAME" | awk '{print $1}')

#镜像id  [grep -w 全量匹配镜像名] [awk 获取信息行的第三列,即镜像ID]
IID=$(docker images | grep -w "$SERVER_NAME" | awk '{print $3}')

#============================对原本已存在的jar进行备份================================

# 备份
function backup(){
    DATE=`date +%Y%m%d%H%M%S`

    if [ -f "$BASE_PATH/$SERVER_NAME.jar" ]; then
        echo "=========================>>>>>>>$SERVER_NAME.jar 备份..."
            mv $BASE_PATH/$SERVER_NAME.jar $BASE_PATH/backup/$SERVER_NAME-$DATE.jar
        echo "=========================>>>>>>>备份老的 $SERVER_NAME.jar 完成"
    else
        echo "=========================>>>>>>>老的$BASE_PATH/$SERVER_NAME.jar不存在,跳过备份"
    fi
}


#============================  创建BASE_PATH  ================================
function makedir(){
    if [ ! -d "$BASE_PATH" ]; then
         echo "=========================>>>>>>>>>>>$BASE_PATH 不存在,创建⋯⋯"
             mkdir -p $BASE_PATH
         echo "=========================>>>>>>>>>>>$BASE_PATH 创建成功"
    else
         echo "=========================>>>>>>>>>>>$BASE_PATH 已存在,跳过创建"
    fi
}


#============================  创建Dockerfile文件 ================================
function createfile(){
      if [ ! -f "$BASE_PATH/Dockerfile" ]; then
             echo "======================>>>>>>>>>>>>>>>>>$BASE_PATH/Dockerfile 不存在,创建⋯⋯"
                   cd $BASE_PATH
                   echo "FROM java:8" > Dockerfile
                   echo "MAINTAINER jw_tech" >> Dockerfile
                   echo "VOLUME /workspace" >> Dockerfile
                   echo "ADD $SERVER_NAME.jar /$SERVER_NAME.jar" >> Dockerfile
                   echo "ENTRYPOINT [\"java\",\"-Djava.security.egd=file:/dev/./urandom\",\"-jar\",\"/$SERVER_NAME.jar\"]" >>Dockerfile
             echo "========================>>>>>>>>>>>>>>>>$BASE_PATH/Dockerfile 创建成功"
       else
             echo "=======================>>>>>>>>>>>>>>$BASE_PATH/Dockerfile 已存在,跳过创建"
       fi
}


#=========================移动最新源jar包到Dockerfile所在目录=========================
 
# 查找源jar文件名,进行重命名,最后将源文件移动到项目环境
function transfer(){

    echo "=========================>>>>>>>最新构建代码 $SOURCE_PATH/$SERVER_NAME/target/$SERVER_NAME.jar 迁移至 $BASE_PATH"
        cp $SOURCE_PATH/$SERVER_NAME/target/$SERVER_NAME.jar $BASE_PATH 
    echo "=========================>>>>>>>迁移完成Success"

}
 


#==================================构建最新镜像===========================
# 构建docker镜像
function build(){
    
    #无论镜像存在与否,都停止原容器服务,并移除原容器服务
    echo "=========================>>>>>>>停止$SERVER_NAME容器,CID=$CID"
    docker stop $CID

    echo "=========================>>>>>>>移除$SERVER_NAME容器,CID=$CID"
    docker rm $CID

    #无论如何,都去构建新的镜像
    if [ -n "$IID" ]; then
        echo "=========================>>>>>>>存在$SERVER_NAME镜像,IID=$IID"


        echo "=========================>>>>>>>移除老的$SERVER_NAME镜像,IID=$IID"
        docker rmi $IID

        echo "=========================>>>>>>>构建新的$SERVER_NAME镜像,开始---->"
        cd $BASE_PATH
        docker build -t $SERVER_NAME .
        echo "=========================>>>>>>>构建新的$SERVER_NAME镜像,完成---->"

    else
        echo "=========================>>>>>>>不存在$SERVER_NAME镜像,构建新的镜像,开始--->"


        cd $BASE_PATH
        docker build -t $SERVER_NAME .
        echo "=========================>>>>>>>构建新的$SERVER_NAME镜像,结束--->"
    fi
}
 

#==============================运行docker容器,启动服务===============================
# 运行docker容器
function run(){
    backup
    makedir
    createfile
    transfer
    build

    docker run --name $SERVER_NAME -itd -p 8888:8888  $SERVER_NAME 

}
 
#入口
run

3.6、启动服务

3.7、查看容器内是否创建,接口是否可以访问

注:以上内容仅提供参考和交流,请勿用于商业用途,如有侵权联系本人删除! 


版权声明:本文为wang_jing_jing原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。