Jenkins+Git+Docker+SpringBoot持续集成自动化部署

上次弄了个idea一键部署的,今天换上Jenkins,跟idea相比有哪些优点呢,团队协作中,第一避免了冗余的pom插件配置和idea配置或Dockerfile,第二主要解决后端或者前端在开发过程中的持续集成、部署问题,第三为整个团队提供一个统一的部署环境,避免因为各开发人员因为本地环境不同而导致的问题。为开发者节约大量的时间,专注于业务逻辑,功能完成后只管push你的git代码,编译打包发布都可自动化,避免冗余重复的工作。

大概工作流程如下,Jenkins点击构建(或webhook自动触发),首先它会先去git上拉取你指定分支的最新代码,拉取完之后,执行maven命令,clean package,把代码打成jar包,然后执行shell命令,备份->生成Dockerfile->打镜像->启动容器。

准备工作

  1. 云服务器,我这里是购买的阿里云的,最便宜的,1核2G的,Linux CentOS 7.5
  2. 连接linux工具,我这里用的是SecureCRT
  3. git这块由于网络原因,这里使用了Gitee,如果商用的话一般自己搭建GitLab

安装Docker

详细步骤请戳这里

安装Jenkins

详细步骤请戳这里

新建任务

  1. 任务名称规则(参考):前端/后端_测试/生产环境_项目名
    我这里的任务名为:back_test_docker-day2

Jenkins+Git+Docker+SpringBoot持续集成自动化部署_第1张图片

  1. 添加任务描述

Jenkins+Git+Docker+SpringBoot持续集成自动化部署_第2张图片

  1. 添加git源码管理
    这里其实推荐配置使用SSH免密,我这边多次配置之后各种连不上,放弃治疗了,就直接用账密登录了,点击添加,Domain选择全局凭据,类型选择Username with password。
    连接成功后,选择你的分支,比如测试环境,你就填测试分支,生产就填生产的分支

Jenkins+Git+Docker+SpringBoot持续集成自动化部署_第3张图片
Jenkins+Git+Docker+SpringBoot持续集成自动化部署_第4张图片

  1. 构建触发器
    这里一般测试环境我们希望,只要push代码到仓库,gitee就会触发webhook执行此任务(会给你配置的 url 发送一个post请求),这种比轮询要高效一点,但是生产环境的话建议还是使用手动点击构建。
  2. 构建环境

Jenkins+Git+Docker+SpringBoot持续集成自动化部署_第5张图片

构建

这一步我们将通过shell脚本完成备份-编译-打包-发布等一系列操作。

  1. 第一步,执行maven打包命令,这一步会在你的jenkins容器内完成,然后把你的源码打成jar包,路径如下:
    /var/jenkins_home/workspace/back_test_docker-day2/target/xxx.jar
    其中back_test_docker-day2为你的任务名,如果你改了的话,这个目录也会改

Jenkins+Git+Docker+SpringBoot持续集成自动化部署_第6张图片

  1. 第二步,执行shell脚本,这里暂只做备份jar,生成Dockerfile,这里有个坑,就是容器内的时区可能不对,导致java获取的时间有问题,这里解决方案是在生成Dockerfile的时候加上Asia/Shanghai

Jenkins+Git+Docker+SpringBoot持续集成自动化部署_第7张图片
对应脚本内容如下:

#!/bin/bash
# 上面这个东西不加,会报空间不足异常
# 注意:所有镜像,容器和应用的命名,最好不要有大写字母

# docker镜像/容器名字
SERVER_NAME=docker-day2
# 操作/项目路径(Dockerfile和Jar存放的路径)
BASE_PATH=/var/jenkins_home/docker/project/$SERVER_NAME
# 备份目录
BACKUP_PATH=/var/jenkins_home/docker/project/backup


# jar名字
JAR_NAME=$SERVER_NAME-0.0.1-SNAPSHOT.jar
# 源jar路径(注:更新任务名需要同步更新这个路径,例:back_test_docker-day2)
SOURCE_PATH=/var/jenkins_home/workspace/back_test_docker-day2/target/$JAR_NAME
# 当前日期时间
DATE=`date +%Y%m%d-%H%M%S`

# 备份
function backup(){
	if [ ! -d $BACKUP_PATH  ]; then
  		mkdir $BACKUP_PATH
	else
  		echo "备份文件夹已存在"
	fi

	if [ -f "$BASE_PATH/$JAR_NAME" ]; then
    	echo "$JAR_NAME 备份..."
        	cp $BASE_PATH/$JAR_NAME $BACKUP_PATH/$SERVER_NAME-$DATE.jar
        echo "备份 $JAR_NAME 完成"
    else
    	echo "$BASE_PATH/$JAR_NAME不存在,跳过备份"
    fi
}

# 迁移,构建好的Jar包,复制到DockerFile一起
function transfer(){

    echo "迁移代码开始"
    
    rm -rf $BASE_PATH
    
    mkdir -p $BASE_PATH
    
    echo "最新构建代码 $SOURCE_PATH 迁移至 $BASE_PATH ...."
        cp $SOURCE_PATH $BASE_PATH 
        
    echo "迁移完成"
    
}

# 生成Dockerfile文件
function dockerfile(){
	echo "开始生成Dockerfile文件"
    
echo """

FROM java:8

ADD $JAR_NAME $JAR_NAME

#更改容器时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 容器启动后执行的操作
CMD java -jar $JAR_NAME

""" > $BASE_PATH/Dockerfile
	echo "生成Dockerfile文件成功"

}


#入口
backup		# 1:备份
transfer	# 2:迁移
dockerfile	# 3:生成dockerfile
  1. 第三步,ssh内执行shell脚本,这里为啥要放ssh呢,因为容器内是没办法使用宿主机的命令的,所以得通过ssh,这里配置参考这里,配置好之后再jenkins的系统设置中添加SSH Server ,执行脚本,功能:停止->删除旧容器,删除旧镜像,重建镜像,run容器

Jenkins+Git+Docker+SpringBoot持续集成自动化部署_第8张图片
对应脚本内容如下:

#!/bin/bash
# 上面这个东西不加,会报空间不足异常
# 注意:所有镜像,容器和应用的命名,最好不要有大写字母

# docker镜像/容器名字
SERVER_NAME=docker-day2
# 操作/项目路径(Dockerfile和Jar存放的路径)
BASE_PATH=/data/jenkins_home/docker/project/$SERVER_NAME

# 端口号
APP_PORT=8092 #应用的端口
E_PORT=8092 #服务暴露给外部调用的端口
# 容器id
CID=$(docker ps -a | grep "$SERVER_NAME" | awk '{print $1}')
# 镜像id
IID=$(docker images | grep "$SERVER_NAME" | awk '{print $3}')

function dockerBuild(){
	if [ -n "$CID" ]; then
		echo "存在$SERVER_NAME容器,CID=$CID,删除容器 ..."
			docker rm -f $CID 
		echo "$SERVER_NAME容器删除完成..."
	else
		echo "不存在$SERVER_NAME容器..."
	fi


	if [ -n "$IID" ]; then
		echo "存在$SERVER_NAME镜像,IID=$IID"
        docker rmi -f $IID
        echo "镜像删除完成"
		cd $BASE_PATH
		docker build -t $SERVER_NAME .
        echo "镜像构建完成"
	else
		echo "不存在$SERVER_NAME镜像,开始构建镜像"
		cd $BASE_PATH
        docker build -t $SERVER_NAME .
        echo "镜像构建完成"
	fi
    
    echo "启动容器..."
    docker run --name $SERVER_NAME -d -p $E_PORT:$APP_PORT $SERVER_NAME
    echo "容器启动完成"
}

dockerBuild	# 4:停止->删除旧容器,删除旧镜像,重建镜像,run容器

  1. 构建后操作
    暂时没想到啥操作,空着,然后点击保存

Jenkins+Git+Docker+SpringBoot持续集成自动化部署_第9张图片

验证

  1. 点击立即构建,点击进度条,进入日志页面,如果有错误,会在此页面提示,成功会显示SUCCESS

Jenkins+Git+Docker+SpringBoot持续集成自动化部署_第10张图片
Jenkins+Git+Docker+SpringBoot持续集成自动化部署_第11张图片

  1. 我们再去服务器看一下容器的状态
docker ps | grep docker-day2

在这里插入图片描述

  1. 访问一下我们之前写的测试接口,正常响应,没有问题

Jenkins+Git+Docker+SpringBoot持续集成自动化部署_第12张图片

  1. 进容器看看log打印
docker exec -u 0 -it 1f3fb6e642c2 /bin/bash
tail -500 /data/app/logs/docker-day2/docker-day2-8092.log

Jenkins+Git+Docker+SpringBoot持续集成自动化部署_第13张图片

源码

下载

你可能感兴趣的:(Docker,jenkins,git,docker,spring,boot)