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就走完了,不早了,明天还要上班,就这样吧。