DevOps之Docker自动化部署

原文地址:http://www.javashuo.com/article/p-rwkjxexv-ha.html

前言


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



搭建平台前的准备


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


虚拟机BLinux):JDK, Tomcat, Docker


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


 

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


技术实现思路

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

  2. 通过Maven+Tomcat生成War

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

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

  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-****** -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 [email protected]:/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日志