设计生成自动化流水线

  现在已经有很多成熟的生成流水线了,如Azure DevOps,直接在界面中配置好即可,相当便捷,生成流水线的工作方式、工作过程也可以简单了解,我在空闲时间搭建了一个简单生成流水线旨在巩固个人对生成流水线的理解。

  

一、生成流水线设计图

  

  平时,在腾讯云、阿里云搞活动时薅了点羊毛 ,搞了几天便宜的服务器,不能让这些服务器闲置了,也借此来试试搭建一条流水线,目的是在于,一个新项目要开始弄,在我选择一个Asp.Net Core并推送到码云中,然后在Jenkins中做一些相关的配置即可,后期代码上的变更不会影响部署环境的变更。主要原因在于,看到过几次先开发后部署,然后遇到的一些部署方面的问题出现耽搁,因此,先把环境部署完毕,后期要做的只是将业务代码的不断加入进来,并且对上可以看到工作成果,如同高楼建筑,可以看到一层一层的往上叠加。

  代码方面:Asp.Net Core、Git、Gitee

  服务器方面:Jenkins、Docker Machine、Docker Compose、Docker Swarm

  镜像仓库:腾讯云镜像仓库

 

二、设计过程中见到的多条道路

  在设计过程中发现有些地方可以有多种方式实现,谈谈我所见到的几种方式:

  1、单台服务器

    代码存储在码云或是GitHub中,

    可安装Jenkins可以安装到容器中或主机上,

    可安装Docker Compose到容器中或主机上,更方便的启动/停止批量容器,

    在Jenkins中使用脚本时:

      可以选择用简单脚本启动/终止容器(docker run/stop)。

      可以选择用Docker Compose启动/停止批量容器(需要代码中提供docker.compose.yaml文件)。

      可以使用代码或是主机内的脚本文件启动/终止容器(使用.sh脚本文件)。

    代码变更,利用jenkins定时拉取变动,然后重新部署容器,很简单和方便的实现持续交付与部署。

  

  2、多台服务器

    代码存储在码云或是GitHub中,

    可安装Docker Machine到一台服务器上,然后快速的通过这一台服务器把其他服务器的docker环境搭建好。

    可安装Docker Swarm,我暂时还只是用Docker Swarm,对于k8s没有涉及,所以暂不应用,对于Swarm的使用,我之前是有4台主机,因此在安装了Docker Machine的那一台就直接发起了一个集群,并把其他服务器也加入了进来,形成了如下局面:

    

    虽然,看起来没得什么问题,同样也可以使用,但是对于Host1来讲,负担太大,既作为奶妈(镜像生产者)又要作为奶爸(集群管理者)。因此为将压力分离一部分,也就有了下面的局面:

      

    可安装Jenkins可以安装到容器中或主机上,

    可安装Docker Compose到容器中或主机上,更方便的启动/停止批量容器,

    在Jenkins中使用脚本用于构建镜像时:

      可以选择用简单脚本删除原有镜像、构建镜像、启动、终止容器等(docker rmi/build/run/stop)。

      可以选择用Docker Compose删除镜像、重新构建镜像、启动/停止批量容器等(需要代码中提供docker.compose.yaml文件,在该文件中指明build参数,Dockerfile位置)。(注意docker compose文件区别,一种是用来构建镜像的docker compose.yaml文件,这种指明了build和context,一种是镜像名称是指定了的,这种用于docker stack deploy,必须要在镜像存在的情况下才能用的。)

      可以使用代码或是主机内的脚本文件删除镜像、重新构建镜像、启动/终止容器等(使用.sh脚本文件)。

    我使用的是腾讯云的镜像仓库,用于存储构建后的镜像,并在swarm集群中拉取镜像部署服务。

    代码变更,利用jenkins定时拉取变动,然后重新构建镜像,并将镜像推送到镜像仓库中,同时将更新swarm中的service,使用最新的镜像,滚动更新集群中的容器。在这里更新swarm中的service有多种方式,如果Jenkins是安装在主机上,那么可以直接在脚本中通过docker-machine ssh host2 相关更新命令,完成通知即可,如果Jenkins是安装在Docker中,那么Jenkins中需要安装SSH Plugin插件用来连接远程主机,然后执行更新。还有的方式就是,我不通知swarm集群,Jenkins服务器可以充当测试服务器,当测试人员测试完毕后,在swarm集群内通过命令手动更新service或是借助UI工具如portainer来手动更新service,更有甚者,在swarm manager节点上在安装一个Jenkins,用来拉取最新镜像(镜像更新触发拉取动作),然后更新service,这种方式我暂时没有尝试过,应该也是行的通的。

 

三、现有集群环境如下

  目前,搭建好了如下环境,对于镜像构建方如何通知swarm集群更新,还没有做到自动更新,暂时使用手动在swarm集群中更新,而对于镜像构建方的自动构建和镜像推送到镜像仓库现已完成。

  

  在Swarm集群中,安装Portainer集群版本,可以监控整个集群的信息,对于手动更新来讲是很方便的,在Portainer中,在左侧有一个registry的菜单,点击进入后选择自己的仓库地址,用来配置我在腾讯云的仓库信息。

  

   在Portainer菜单Service中可以创建或更新service,获取最新的镜像完成更新操作,相比用命令行去操作轻松许多。

   

  后期将会完善自动通知swarm集群更新service功能(至于要不要这个功能,需要斟酌一番)。

 

 本文地址:https://www.cnblogs.com/CKExp/p/9940461.html 

 欢迎关注微信订阅号,有新的文章将同步到订阅号中

 

2018-11-24,望技术有成后能回来看见自己的脚步
posted @ 2018-11-24 12:24  微笑刺客D  阅读(1842)  评论(2编辑  收藏  举报
返回顶部