Devops之CI/CD

 
 
今天主要简单介绍下CI/CD持续集成 & 交付 & 部署,以及延伸出来的Devops。Devops我也不知道是啥,百度百科给出的定义是(过程、方法与系统的统称),不知道看官明白没,反正我是没看明白,我给的定义就是“只能意会,不能言传”。通俗点说就是开发+测试+运维,一条龙服务。在早期团队里面,开发人员写完代码,自测以后,通知测试团队,并且手动发布部署到测试服务器,包括后期的bug处理完,也是一样,重新手动发布部署。那么周而复始的这样发布部署就成了一项繁琐的工作。当然这里面还有很多的问题,比如增加时间成本,代码量积压,项目推进进度慢等等问题。CI CD就是为了解决这些问题诞生的。我们先看一张图。
针对上面这张图,我简单介绍一下整个实现流程(我下面的部署环境完全是按照这幅图实施的)。
开发者---》提交代码到Git(github/lab/svn)都可以--->git通过webhook推送通知到jenkins---》jenkins接收到通知执行命令脚本(freestyle/pipeline,还有多种方式,我这里用的是pipeline)---》在pipeline脚本里面,先从gitlab拉去源代码---》通过dockerfire构建镜像---》通过docker push到docker仓库---》通知远程测试服务器---》测试服务器通过docker拉取镜像---》run容器---》完成---》最后测试人员几分钟以后就能测试开发人员刚刚处理的bug。
整套流程下来都是全自动的,不需要任何人参与,敏捷再敏捷,当然你也可以集成其它工具进来,比如代码规范控制等等。理论就到这吧,下面简单看看实操吧。
 
实践环境我这边准备了4台centos,当然都是虚拟机。看图。
 
这里简单注意下,gitlab服务器内存最少要4个g,本来打算还搭一个nuget包管理器,无奈内存不够了,我们先简单看下效果。

 

 

本来想截图,发现要截图的太多,索性录制了一张gif图片。这张gif图片录制的就是整个效果,开发人员改完代码,推送git,等1分钟不到,测试人员就可以在远程做集成测试。速度的快慢主要还是取决于项目的大小,也就是编译,镜像推送的是本地仓库。下面简单介绍下环境搭建,主要搭建流程网上很多,我这边搭建就简单一点。
 
公共环境
首先搭建一个公共环境,也就是我上面的template,公共环境主要是一些基础配置和docker环境安装,准备好公共环境之后,后面的环境直接clone就行,减少操作嘛。注意,我这边的所有环境搭建都是基于docker,没有直接在虚拟机里面搭建。
 
harbor仓库
docker images仓库我这边使用的是harbor,harbor也是vmware公司开发,可以在本地搭建镜像仓库,harbor的搭建比较简单,稍微需要注意的就是自签证书的问题。下面我们简单操作部署harbor仓库。
安装harbor需要预先安装python2.7+、docker-compose、docker。
1.github上面去下载tgz包,git地址自己搜吧,因为harbor包比较大,最好用迅雷下载,我这边下载的包是harbor-offline-installer-v2.0.2.tgz,然后通过sftp传输到虚拟机,tar zxvf解压。解压后的文件夹。
1 [root@reg harbor]# ls
2 common  common.sh  harbor.v2.0.2.tar.gz  harbor.yml  harbor.yml.tmpl  install.sh  LICENSE  prepare
3  
4  

 

2.修改harbor.yml.tmpl,需要修改的地方有三处hostname自签证书路径,最后cp到harbor.yml,这个文件默认是没有的。
 1 http:
 2   # port for http, default is 80. If https enabled, this port will redirect to https port
 3   port: 80
 4  
 5  
 6 # https related config
 7 https:
 8   # https port for harbor, default is 443
 9   port: 443
10   # The path of cert and key files for nginx
11   certificate: /hostfs/data/cert/harbor.com.crt
12   private_key: /hostfs/data/cert/harbor.com.key
13  
14  
15  

 

3.执行shell脚本install.sh
1 ./install.sh 
2  

 

4.查看docker容器
 1 [root@reg harbor]# docker ps -a
 2 CONTAINER ID        IMAGE                                COMMAND                  CREATED             STATUS                   PORTS                                         NAMES
 3 71853559898c        goharbor/nginx-photon:v2.0.2         "nginx -g 'daemon of…"   8 minutes ago       Up 8 minutes (healthy)   0.0.0.0:80->8080/tcp, 0.0.0.0:443->8443/tcp   nginx
 4 ee26f5e4280b        goharbor/harbor-jobservice:v2.0.2    "/harbor/entrypoint.…"   8 minutes ago       Up 8 minutes (healthy)                                                 harbor-jobservice
 5 ea2ba64e7b01        goharbor/harbor-core:v2.0.2          "/harbor/entrypoint.…"   8 minutes ago       Up 8 minutes (healthy)                                                 harbor-core
 6 8464e2f008be        goharbor/redis-photon:v2.0.2         "redis-server /etc/r…"   8 minutes ago       Up 8 minutes (healthy)   6379/tcp                                      redis
 7 e5c299d64169        goharbor/harbor-portal:v2.0.2        "nginx -g 'daemon of…"   8 minutes ago       Up 8 minutes (healthy)   8080/tcp                                      harbor-portal
 8 34b6414cd943        goharbor/harbor-db:v2.0.2            "/docker-entrypoint.…"   8 minutes ago       Up 8 minutes (healthy)   5432/tcp                                      harbor-db
 9 56ac7263eb17        goharbor/registry-photon:v2.0.2      "/home/harbor/entryp…"   8 minutes ago       Up 8 minutes (healthy)   5000/tcp                                      registry
10 a277518da566        goharbor/harbor-registryctl:v2.0.2   "/home/harbor/start.…"   8 minutes ago       Up 8 minutes (healthy)                                                 registryctl
11 34986a658b2a        goharbor/harbor-log:v2.0.2           "/bin/sh -c /usr/loc…"   8 minutes ago       Up 8 minutes (healthy)   127.0.0.1:1514->10514/tcp                     harbor-log
12  
13  
14  

 

5.签发证书
1 openssl req  -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 365 -out ca.crt  #创建CA证书
2 openssl req  -newkey rsa:4096 -nodes -sha256 -keyout myharbor.com.key -out myharbor.com.csr  # 生成签名请求,这里需要注意,commonname需要填写域名或者ip
3 echo subjectAltName = IP:192.168.159.111 > extfile.cnf
4 openssl x509 -req -days 365 -in myharbor.com.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extfile extfile.cnf -out myharbor.com.crt
5  

 

6.配置daemon.json,需要写入harbor域名或者ip地址。
 
7.如果是域名地址,需要修改hosts文件配置转发,好了以上就是harbor仓库环境部署的流程以及需要注意的地方。下面部署gitlab。
 
gitlab
gitlab源代码管理服务器,它跟github有个区别就是lab可以本地部署,hub不能,并且hub好像创建私有仓库需要收费,免费的还限制人数。lab目前有两个版本吧,社区和企业版,我这里使用的是社区版ce,社区版是免费的。lab很吃内存,企业级应用需要稍微注意,需要优化。下面简单介绍下环境搭建。
1.拉取lab镜像,我这里直接是从本地harbor上拉取的。
1 [root@localhost ~]# docker images
2 REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
3 gitlab_test                     v1.0                fad0a00dde08        12 days ago         1.91GB
4 myharbor.com/images/gitlab-ce   v1.0                fad0a00dde08        12 days ago         1.91GB
5  
6  

 

2.创建容器,需要注意挂载数据卷的目录。
1 docker run \
2     -p 443:443 -p 80:80 \
3     --name gitlab \
4     --volume /home/gitlab/config:/etc/gitlab \
5     --volume /home/gitlab/logs:/var/log/gitlab \
6     --volume /home/gitlab/data:/var/opt/gitlab \
7     myharbor.com/images/gitlab-ce
 
3.通过浏览访问lab,配置项目、用户、权限等等问题,这部分就不说了,很简单。
 
Jenkins
jenkins基于java开发的一款插件系统,算是ci&cd这块的佼佼者吧,它大部分功能都是基于插件实现,下面直接部署吧。
1.拉取镜像,我这边也是本地harbor拉取的,如果外网拉取,最好找lts长期维护版本。
1 docker pull jenkins
 
2.创建容器
1 docker run \
2   -d \
3   -p 80:8080 \
4   -p 50000:50000 \
5   -v /data/jenkins:/var/jenkins_home \   # 挂载jenkins数据卷
6   -v /var/run/docker.sock:/var/run/docker.sock \ # 挂载docker 
7   jenkins

 

3.如果没有错误,可以通过浏览器访问jenkins后台,首次访问需要解锁jenkins admin账户,密码在容器里面,地址不贴了,首次访问就会告诉你。
 
4.插件,有些镜像默认安装大部分插件,如果有些插件没有安装需要额外安装,gitlab插件一般都要安装。安装插件我有个小建议,自己宿主机里面下载比较快,地址我是从插件安装失败的错误信息里面找的,当然你也可以直接找到所有插件,选择对应的版本即可。jenkins的基本配置到此就差不多了,下面介绍重头戏,jenkins vs gitlab hook通信。
 
Jenkins vs Gitlab
1.打开jenkins系统配置界面,不截图了,看单词就懂了。这里主要配置gitlab插件。
 
这里需要注意的就是凭据配置,我这里使用的api-token的方式,这个token是从gitlab生成出来,我们过会再去看gitlab那边的token是怎么创建的。这边配置完以后,点击test connection按钮,只要不报错,就ok了。
 
2.Gitlab-token获取
账户下面有个settins---》左边导航的access-token,scope选择api即可,取个名称,点击生成,生成出来的token-copy到jenkins的token文本框即可。
到此jenkins vs gitlab的访问就ok了,接下来,我们在jenkins上面创建任务。
 
3.jenkins创建pipeline任务,当然这里你也可以创建freestyle任务,个人觉得pipeline具有更灵活的操作,创建好任务之后,开始配置触发器以及流水线。
 
选择我圈起来的部分,然后打开Advanced Project Options选项卡,下拉选择Pipeline script from SCM项。SCM选择Git,再配置Repositories,最后配置Script Path为Jenkinsfire,保存ok。
 
到此jenkins vs gitlab的大部分关节都打通了,还差一步,配置webhook。站在我们代码的角度你可以理解为callback。我们再次打开gitlab后台,找到admin area,然后找到左边导航的settins,点击Integrations,随后就可以配置web hook了。
 
 
 
 
这里有两个需要填写的信息,url-secret均来源与jenkins-buildtriggers里面的项。看图
 
secrettoken需要点击红圈里面的按钮。到此关节部分全部打通,最后所有的任务落在了shell脚本上了,因为我这里创建的是pipeline任务,所以最后一步我们需要编写pipeline脚本。还记得前面有个script path的输入框吗?没错我们的流水线脚本就是写在jenkinsfire文件里面。
 1 pipeline {
 2     agent any
 3     stages {
 4         stage("pull code") {
 5             steps{
 6                  # 这里面就是拉取代码   
 7                 }
 8             }
 9         }
10         stage("build") {
11             steps {
12                     # 通过dockerfire构建镜像
13                     # 登陆到harbor,push镜像到harbor
14                   }
15         }
16         stage("dep") {
17             steps{
18                 # 通知远程测试服务器,执行脚本,剩下的就是测试服务器通过docker从harbor拉取镜像,判断容器是否运行,如果运行rm&rmi -f掉容器和镜像,pull新的镜像,run。 这里需要注意:需要配置jenkins容器和测试服务器 ssh免密登陆
19             }
20         }
21     }
22 }

 

里面的代码我就不写了,pipeline里面的流水线随意定制的,你也可以写更多的stage阶段和step步骤,这都没关系。好了,到此整套CI VS CD就走完了,不早了,明天还要上班,就这样吧。 
 
 
posted @ 2020-08-12 00:14  小菜 。  阅读(690)  评论(1编辑  收藏  举报