持续化部署教程(九)docker+git+jenkins实现一键发布
1.概要
我们在之前的八个章节介绍了Ubuntu系统调试、Docker安装、Dokcer私服安装、DockerFile配置、Jenkins安装,本章是我们《持续化部署教程》的最后一个章节,我们会通过一个完整的例子,将之前学习的所有知识点进行串联,实现我们的最终目标,一键发布。 我们的教程是从一张流程图开始的,那我们今天的讲解还从这张图开始。
1.1前提条件
要实现一键发布,我们需要具备以下条件: (1)git上或者svn上有套可以访问的代码。 我已经为大家准备好了一个样例项目,地址为:https://gitee.com/feiyangsoft_admin/Blog.git (2)Jenkins服务 具体的搭建方法见 (3)本机安装Docker,并且已经部署Docker私服 具体搭建方法见
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私有仓库的方法请参考,我们是讲解我们今天要用到的内容。 我们搭建的私服地址为:192.168.1.100:9001 首先,为我们的项目创建一个独立的用户。 登录私有仓库,选择【系统管理】->【用户管理】,建立新的用户。用户名:blog_user,密码:blog_Pass123. 新建项目,起名为blog,选择成员,添加我们刚刚创建的用户。 修改本地的/etc/docker/daemon.json文件,将私服地址追加到这里。 我们的私有仓库准备工作就做好了。
3.2.4 dockerFile文件
打开我们在[3.2.2]章节创建的dockerFile脚本,粘贴如下内容:
大家可以根据注释来理解相关内容。
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时