持续化部署教程(九)docker+git+jenkins实现一键发布

1.概要

我们在之前的八个章节介绍了Ubuntu系统调试、Docker安装、Dokcer私服安装、DockerFile配置、Jenkins安装,本章是我们《持续化部署教程》的最后一个章节,我们会通过一个完整的例子,将之前学习的所有知识点进行串联,实现我们的最终目标,一键发布。
我们的教程是从一张流程图开始的,那我们今天的讲解还从这张图开始。

在这里插入图片描述

1.1前提条件

要实现一键发布,我们需要具备以下条件:
(1)git上或者svn上有套可以访问的代码。
我已经为大家准备好了一个样例项目,地址为:https://gitee.com/feiyangsoft_admin/Blog.git
(2)Jenkins服务
具体的搭建方法见《持续化部署教程(八)搭建Jenkins环境》
(3)本机安装Docker,并且已经部署Docker私服
具体搭建方法见
《持续化部署教程(三)初识docker-docker安装与调优》
《持续化部署教程(五)构建一个docker仓库服务》
《持续化部署教程(六)自定义脚本-DockerFile》

1.2实现步骤

如上图所示,我们分为三个步骤:
(1)Jenkins创建流水线项目,实现源代码拉起,并能够通过Mavne打包成功。
(2)Jenkins调用本地DockerFile脚本生成镜像,推动到Docker私服仓库。
(3)Jenkins调用客户端脚本下载镜像、加载Docker容器,实现访问应用。

2.Jenkins实现本地打包

2.1创建流水线项目

登录Jenkins,创建一个新任务。
在这里插入图片描述
任务类型选择【流水线】,项目名称为【docker-blog】。
在这里插入图片描述
调整构建任务参数,设置保存时间和保存数量,通过此设置可以大大节省Jenkins项目的存储空间。
在这里插入图片描述
在脚本中输入如下代码,点击保存,我们就完成了一个简单的流水线设置。

node {
	stage('Set') {
		echo "准备工作"
	}
	stage('Build') {
		echo "打包成功"
	}
	stage('Push') {
		echo "推送镜像成功"
	}
	stage('Run') {
		echo "发布应用成功"
	}
}

在这里插入图片描述
点击【立即构建】按钮,就可以实现分阶段的项目发布了。
在这里插入图片描述

2.2 流水线发布的意义

Jenkins新建项目有很多种模式,我推荐大家采用流水线模式。流水线模式人为的将发布工作范围了几个阶段,你可以根据自己情况来设置,其意义就是能够帮助你直观定位到发布过程中出现问题的阶段,快速定位、快速解决。
我将流水线一般范围4个节点。
(1)Set 准备阶段(本阶段主要是对变量进行复制,如不需要可以省略)。
(2)Build 本地打包阶段。
(3)Push 推送进项到私服阶段。
(4)Run 启动容器阶段。
你也可以根据自己的习惯进行设置,走出自己的节奏。

2.2 Maven打包

我们的演示代码是通过Git进行托管的,所以我们首先要能够拉取Git上的代码。
在流水线发布模式下,流水线为我们提供了一套流水线语法,你可以通过脚本模版,实现相应的脚本命令。
点击【配置】–>【流水线语法】
在这里插入图片描述
流水线语法,按照下图步骤,
(1)添加项目的git地址。
(2)添加你的git帐号。
(3)点击生成流水线脚本。
(4)获得流水线脚本。
在这里插入图片描述
在流水线脚本的【Build】 节点加入以下代码,并如下图效果。

stage('Build') { 
		echo "--------------update code begin -------------"     		
		git credentialsId: 'git', url: 'https://gitee.com/feiyangsoft_admin/Blog.git'
		echo "--------------update code end -------------"     		
		//获取当前项目路径
        def workspace = pwd()  
        //调用mavne打包
		mvnHome = "/tools/apache-maven-3.6.3/bin/mvn"    
		echo "$mvnHome"
		echo "--------------package begin--------------"     
		sh "cd $workspace"
		sh "$mvnHome clean install package"
		echo "--------------package end--------------"	
	}
	stage('Push') {
		echo "推送镜像成功"
	}
	stage('Run') {
		echo "发布应用成功"
	}

在这里插入图片描述
点击保存后,点击流水线的【立即构建】,验证效果。
在这里插入图片描述
也可以通过构建日志查看具体信息:
在这里插入图片描述
通过日志,我们可以看到项目编译的包路径为:

/tools/jenkins/workspace/docker-blog/target/dockerblog-0.0.1-SNAPSHOT.jar

到这里,我们就实现了Jenkins的本地打包功能。

3.Jenkins实现镜像推送

3.1 实现思路

Jenkins打包项目完成后,通过调用Jenkins所在机器的shell脚本,实现项目jar包更名、复制到指定目录、生成Docker镜像、推送到仓库的一系列动作。

3.2 Jenkins调用本地资源

3.2.1 配置Jenkins调用Shell脚本权限

首先,我们先要获取到本地质性shell脚本的权限。
打开页面【系统管理】–>【系统设置】–>【SSH Servers】节点,点击新增,添加当前服务器的信息。
在这里插入图片描述
点击【测试链接】验证无误,点击【保存】即可。
在这里插入图片描述

3.2.2 增加调用命令

创建两个文件夹,路径为【/tools/api/push/】和【/tools/api/build/】。
/tools/api/push/文件夹下创建一个空文件,名字为【push.sh】,用于调用DockerFile脚本和推送镜像。
/tools/api/build/文件夹下创建一个空文件,名字为【Dockerfile】,用于生成镜像。
稍后我们讲解两个文件的具体内容。
在流水线的【Build】节点中增加命令:

【configName】节点,传入的参数就是我们刚刚在3.2.1章节配置的服务器名称【test-app】。
【execCommand】节点,传入的参数为我们要执行的命令,参数为【“sh /tools/api/push/push.sh”】。

sshPublisher(publishers: [sshPublisherDesc(configName: 'test-app', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "sh /tools/api/push/push.sh", execTimeout: 1200000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'push')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])

在这里插入图片描述

3.2.3 dokcer私有仓库创建

如何搭建docker私有仓库的方法请参考《持续化部署教程(五)构建一个docker仓库服务》,我们是讲解我们今天要用到的内容。
我们搭建的私服地址为:192.168.1.100:9001
首先,为我们的项目创建一个独立的用户。
登录私有仓库,选择【系统管理】->【用户管理】,建立新的用户。用户名:blog_user,密码:blog_Pass123.
在这里插入图片描述
新建项目,起名为blog,选择成员,添加我们刚刚创建的用户。
在这里插入图片描述
修改本地的/etc/docker/daemon.json文件,将私服地址追加到这里。
在这里插入图片描述
我们的私有仓库准备工作就做好了。

3.2.4 dockerFile文件

打开我们在[3.2.2]章节创建的dockerFile脚本,粘贴如下内容:

#20200525 castle
#=======================begin===========================
#下载基础镜像(构建方法参考之前的教程)
FROM 192.168.1.100:9001/base_docker/base_mini:1.0
#作者信息
MAINTAINER caslte "***@qq.com"
#拷贝文件到指定目录
RUN echo "Asia/Shanghai" > /etc/timezone
ADD jar/dockerblog.jar /java/
ENV LANG C.UTF-8
ENV JAVA_HOME=./java/jdk1.8
ENV PATH=$JAVA_HOME/bin:$PATH
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
#执行程序 
#CMD ["java -Xms256m -Xmx512m -jar /java/dockerblog.jar","run"]
ENTRYPOINT ["java","-Xms256m","-Xmx512m","-jar","/java/dockerblog.jar"]
#开放端口
EXPOSE 80

大家可以根据注释来理解相关内容。

3.2.5 push.sh文件讲解

打开我们在[3.2.2]章节创建的push.sh脚本,粘贴如下内容:

#!/bin/bash
#castle  200525
#========================配置各种基础变量========================
#Mavne打包的jar包地址
TARGET_NAME="/tools/jenkins/workspace/docker-blog/target/dockerblog-0.0.1-SNAPSHOT.jar"
#jar包存放地址
DOCKERFILE_HOME="/tools/api/build/jar"
#jar包打包地址
DOCKERFILE_BUILD="/tools/api/build/"
#文件名称
pushJar="dockerblog.jar"
#========================拷贝文件========================
#清空文件夹
rm -rf $DOCKERFILE_HOME
mkdir  $DOCKERFILE_HOME
#拷贝数据
cp -a $TARGET_NAME  $DOCKERFILE_HOME/$pushJar
#========================打包推镜像========================
#私服的信息
HARBOR_IP="192.168.1.100:9001"
HARBOR_REPOSITORIES="blog/dockerblog"
HARBOR_USER="blog_user"
HARBOR_USER_PASS="blog_Pass123"

#私服的版本号
datetime_temp="$(date +%y%m%d)"
TAG=":"$datetime_temp

#删除本地已经存在的历史版本 这步操作可以大大节省磁盘空间
sudo docker rmi -f $(docker images | grep "${HARBOR_REPOSITORIES}" | awk "{print $1}")
#进入到DockerFile的目录
cd $DOCKERFILE_BUILD
#登录docker
docker login -u ${HARBOR_USER} -p ${HARBOR_USER_PASS} ${HARBOR_IP}
#生成镜像
sudo docker build -t $HARBOR_IP/$HARBOR_REPOSITORIES$TAG .
#推送到私有仓库
sudo docker push $HARBOR_IP/$HARBOR_REPOSITORIES$TAG

3.2.6 验证发布结果

点击【构建按钮】,提示完成,点击日志可以看到如下内容:
在这里插入图片描述
登录私有仓库,点击【blog】项目,发现镜像已经上传成功。
在这里插入图片描述

4 Jenkins实现启动容器

通过上面的操作,我们已经将打包好的项目推送到了私有仓库的镜像中,下面我们通过Jenkins调用shell脚本,将镜像拉取到本地,并形成容器,提供对外访问。

4.1 增加Run节点脚本

首先,在【/tools/api/run/】下,新建一个run.sh的文件,稍后我们给他增加内容。
在流水线脚本的【run】节点增加如下命令。

sshPublisher(publishers: [sshPublisherDesc(configName: 'test-app', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "sh /tools/api/run/run.sh", execTimeout: 1200000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'push')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])

在这里插入图片描述

4.2 讲解run.sh脚本

打开run.sh脚本,粘贴如下内容:

#!/bin/bash
#将镜像推送到私服-cas服务
#castle  0525
#========================配置各种基础变量========================
#私服的信息
HARBOR_IP="192.168.1.100:9001"
HARBOR_REPOSITORIES="blog/dockerblog"
HARBOR_USER="blog_user"
HARBOR_USER_PASS="blog_Pass123"
#版本号
datetime_temp="$(date +%y%m%d)"
TAG=":"$datetime_temp
DOCKERFILE="dockerblog"

echo  "====================== run ========================="
#登录docker
docker login -u ${HARBOR_USER} -p ${HARBOR_USER_PASS} ${HARBOR_IP}
#停止本机容器
docker stop  $DOCKERFILE
#删除本机容器
docker rm $DOCKERFILE
#删除本机镜像
docker rmi -f $DOCKERFILE  $HARBOR_IP/$HARBOR_REPOSITORIES$TAG 
docker rmi $(docker images -q)
#启动容器 开放外网的9999端口映射容器内部的8080端口
docker run -d  -m 600M --memory-swap=1024M  --privileged -p 9999:8080 --oom-kill-disable -v /etc/localtime:/etc/localtime --name $DOCKERFILE -i $HARBOR_IP/$HARBOR_REPOSITORIES$TAG 

4.3 验证运行结果

点击【构建按钮】,提示完成,点击日志可以看到如下内容:
在这里插入图片描述
执行docker ps -a 命令验证
在这里插入图片描述
通过访问项目验证,我在git上发布的项目只有一个简单的接口,默认访问8080端口,代码如下:
在这里插入图片描述
容器将容器内部的8080端口映射给了9999端口,我们访问浏览器地址:http://localhost:9999/hello/helloWorld 得到如下结果:
在这里插入图片描述
以上,我们就完成了docker+git+jenkins一键发布,你学会了吗?

5.总结

整套持续化部署方案,是我和我的团队在2019年-2020年接近2年时间通过实战,不断修正、不断改进的一次总结,这已经是第二版方案。
有学习docker这个念头,是在2019年的春节,断断续续到2019年的5月才进入实战阶段,其中遇到很多问题,自己百度找资料、网站买课程、找圈里的大神求助,为了一个问题熬到凌晨。说这些并不是想说自己有多努力,而是想说,遇到问题不可怕,可怕的是你告诉自己这个问题解决不掉,放弃吧。很多时候,方案就在灵光一现、方案就在你做梦都在想的时候的一点提醒。
方案中有很多不足之处,只能说起到一个抛砖引玉的作用,如果您在阅读中发现不足之处,请您在评论区给我留言,我将不胜感激。
如果这九章博客能给您些许帮助,我就很心满意足了,感谢您的阅读,祝你学习愉快。
2020年05月25日夜23时

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值