前言linux
软件开发生命周期从瀑布式到敏捷再到如今的DevOps。记得刚入行的时候仍是敏捷的天下,在不一样公司敏捷的实践中或多或少感觉到了团队间合做衔接的效率问题;即便敏捷宣言所倡导是高效,可是实施过程当中仍是有资源的浪费和瓶颈。DevOps它的精益原则,关注点就是在流程中移除浪费:好比人工部署,系统的频繁中断,PO/SM的一些失败的约定等。今天的主题就是用自动部署代替人工部署以减小资源的浪费。docker
虚拟机A(Windows server):JDK, Maven, Tomcat, Jenkins, Bitvise SSH servershell
虚拟机B(Linux):JDK, Tomcat, Dockerwindows
虚拟机C(Linux):用Harbor做镜像仓库tomcat
注:关键的配置要点会在步骤说明中体现;JDK,tomcat等基础配置再也不叙述ssh
利用Jenkins把编译好的代码从SVN拉到虚拟机A上工具
经过Maven+Tomcat生成War包ui
使用Bitvise SSH server把War包从虚拟机A拷贝到虚拟机B上spa
在虚拟机B上将War包经过Dockerfile的方式生成Image3d
将镜像存入Harbor
在Jenkins新建一个自由风格的项目
进入项目配置,配置源码管理;填写SVN的地址及访问认证
构建触发器
Poll SCM:定时感知代码分支是否有变化,若是有变化的话,执行一次构建
H/5 * * * * (每5分钟构建一次)
构建步骤一:添加构建’Invoketop-level Maven targets’
选择配置的
Maven,并填写Maven中要执行的命令 clean package.此步的目的是生成War包
Jenkins项目默认路径在:C:\Documents and Settings\<your username>\.jenkins\workspace
构建步骤二:添加构建’ExecuteWindows batch command’
这一步的目的是把生成的War包拷贝到指定目录
为什么要放在指定目录呢?由于要把War包从虚拟机A(windows)拷贝到虚拟机B(linux),而scp只能用于linux间的传输,因此要经过工具。
首先使用pscp工具是能够的,可是它没法作到免密登入(尝试写了个bat脚本,手动执行是经过的,可是在Jenkins里调用就出现了问题,不知缘由),附bat脚本
因此这里就用到了另外一个工具:Bitvise SSH server
要免密登入虚拟机B,我是经过取得公钥的方式进行的:
在虚拟机B中,生成密钥:
ssh-keygen -t rsa
默认按回车直至完成
在/root/.ssh/ 路径中找到公钥id_rsa.pub
这时候在虚拟机A上,经过pscp把公钥拷贝至指定目录 C:\ToSaveWar
(由于有多个不一样的项目须要自动化部署,因此将War包和公钥放置在同一目录方便管理)
公钥已拷贝至指定目录
接下来就要对Bitvise SSH server进行虚拟帐户的配置:
打开Easy Setting便可,在step 3中,添加虚拟帐号及公钥
至此虚拟机A与虚拟机B间的scp传输就走通了
构建步骤三:添加构建’Executeshell script on remote host using ssh’
SSH site在是虚拟机B的地址,访问认证在Jenkins的系统设置中配置
Scp Jenkins_SSHAccount@10.10.5.XXX:/C:/ToSaveWar/HxdiSpectrum.war/home/dockerfile/hxdispectrum
将虚拟机A指定目录中拷贝到虚拟机B的指定目录
cd /home/dockerfile/hxdispectrum
切换至虚拟机B的指定目录
此目录中包含War包,tomcat, jdk,Dockerfile
Dockerfile配置以下:
mv HxdiSpectrum.war ROOT.war
将War包更名为ROOT.war
docker build -t$projectName:$imageTagNo .
生成镜像
注:镜像名:镜像号已在Jesnkins中参数化掉了)
docker tag$projectName:$imageTagNo 10.10.5.33/XXXXXX/$projectName:$imageTagNo
重命名镜像
docker login 10.10.5.XX -uwucenlong -p XXXXXXX
登入虚拟机C镜像仓库Harbor -u username -p pwd
docker push 10.10.5.XX/XXXXXXXXXXX/$projectName:$imageTagNo
将镜像Push到镜像仓库
好了至此全部构建步骤已完成!
当SVN代码发生变化后,部署开始执行;如下是部署部分log日志