快捷搜索:

持续化部署教程(九)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时

经验分享 程序员 职场和发展