DevOps之Docker自动化部署



前言linux


软件开发生命周期从瀑布式到敏捷再到如今的DevOps。记得刚入行的时候仍是敏捷的天下,在不一样公司敏捷的实践中或多或少感觉到了团队间合做衔接的效率问题;即便敏捷宣言所倡导是高效,可是实施过程当中仍是有资源的浪费和瓶颈。DevOps它的精益原则,关注点就是在流程中移除浪费:好比人工部署,系统的频繁中断,PO/SM的一些失败的约定等。今天的主题就是用自动部署代替人工部署以减小资源的浪费。docker



搭建平台前的准备


虚拟机AWindows server):JDK, Maven, Tomcat, Jenkins, Bitvise SSH servershell


虚拟机BLinux):JDK, Tomcat, Dockerwindows


虚拟机CLinux):用Harbor做镜像仓库tomcat


 

注:关键的配置要点会在步骤说明中体现;JDK,tomcat等基础配置再也不叙述ssh


技术实现思路

  1. 利用Jenkins把编译好的代码从SVN拉到虚拟机A工具

  2. 经过Maven+Tomcat生成Warui

  3. 使用Bitvise SSH serverWar包从虚拟机A拷贝到虚拟机Bspa

  4. 在虚拟机B上将War包经过Dockerfile的方式生成Image3d

  5. 将镜像存入Harbor

  


搭建部署说明


  1. Jenkins新建一个自由风格的项目

     

  2. 进入项目配置,配置源码管理;填写SVN的地址及访问认证

     


     

  3. 构建触发器

           Poll SCM:定时感知代码分支是否有变化,若是有变化的话,执行一次构建

           H/5 * * * * (每5分钟构建一次)





 

构建



  1. 构建步骤一:添加构建’Invoketop-level Maven targets’

    选择配置

    Maven,并填写Maven中要执行的命令 clean package.此步的目的是生成War

    Jenkins项目默认路径在:C:\Documents and Settings\<your username>\.jenkins\workspace

     


     

  2. 构建步骤二:添加构建’ExecuteWindows batch command’

     

    这一步的目的是把生成的War包拷贝到指定目录


     

    为什么要放在指定目录呢?由于要把War包从虚拟机Awindows)拷贝到虚拟机Blinux),而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传输就走通了

  3. 构建步骤三:添加构建’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日志