什么是CI/CD

持续集成(Continous Intergration,CI)是一种软件开发实践,即团队开发成员经常集成它们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都需要通过自动化的编译、发布、自动化回归测试来验证,从而尽快地发现集成错误。而这些自动化的操作则由CI软件进行执行。

持续部署(Continous Delivery,CD)在持续集成的基础上,将集成后的代码部署到真实运行环境中(本文指部署到kubernetes集群)。交付团队 ->版本控制 ->构建和单元测试 ->自动验收测试 -> 发布

什么是Drone

Drone 是一个基于Docker容器技术的可扩展的持续集成引擎,用于自动化测试、构建、发布。每个构建都在一个临时的Docker容器中执行,使开发人员能够完全控制其构建环境并保证隔离。开发者只需在项目中包含 .drone.yml文件,将代码推送到 git 仓库,Drone就能够自动化的进行编译、测试、发布。

使用drone实现CD/CD

首先来看下丑陋的图

简单梳理流程:

1、开发人员向git(gitlab/github/gogs)提交代码,代码中必须包含Dockerfile和.drone.yml文件。
2、将代码commit到远程仓库;发布应用时需要填写服务类型、服务名称、资源数量、实例个数等信息
3、gogs触发drone自动构建
4、Drone的CI流水线中包括了自定义脚本,根据准备好的kubernetes的YAML模板,将其中的变量替换成用户输入的选项
生成应用的kubernetes YAML配置文件
5、Drone的CI流水线自动编译代码并打包成docker镜像推送到Harbor镜像仓库
6、更新DNS,插入一条DNS记录,IP地址是ingress节点的IP地址。
7、Drone的CI流水线中自定义脚本调用kubernetes的API,部署应用;更新Ingress的配置,根据新部署的应用的名称,在ingress的配置文件中增加一条路由信息
接下来,开始实战

部署代码仓库gogs

本文使用gogs,当然你可以选择gitlab,github等代码仓库
1、创建gogs.yaml

---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: gogslabels:app: gogs
spec:serviceName: gogsreplicas: 1selector:matchLabels:app: gogstemplate:metadata:labels:app: gogsspec:terminationGracePeriodSeconds: 180containers:- name: gogsimage: gogs/gogsimagePullPolicy: Alwaysports:- containerPort: 3000name: port- containerPort: 22name: ssh-portvolumeMounts:- name: volumemountPath: /datavolumes:- name: volumeemptyDir: {}
---
apiVersion: v1
kind: Service
metadata:name: gogslabels:app: gogs
spec:type: NodePortports:- port: 3000targetPort: 3000selector:app: gogs

2、执行部署并查看结果

[root@k8s-node001 gogs]# kubectl  apply -f gogs.yaml
statefulset.apps/gogs created
service/gogs created[root@k8s-node001 gogs]# kubectl  get po,svc -o wide
NAME         READY   STATUS    RESTARTS   AGE    IP               NODE          NOMINATED NODE   READINESS GATES
pod/gogs-0   1/1     Running   0          2m2s   100.68.150.197   k8s-node001   <none>           <none>NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE     SELECTOR
service/gogs         NodePort    10.106.102.74   <none>        3000:30526/TCP   2m3s    app=gogs

3、浏览器打开,并配置gogs,然后就可以登录gogs了

4、登录gogs

至此,gogs配置完毕。
Tips:本文的gogs,是测试环境,使用卷类型为:emptyDir,生产环境最好单独部署或者使用StorageClass保证数据持久可用性
接下来部署drone

部署CI工具Drone

1、编写drone.yaml文件

---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: dronelabels:app: drone
spec:serviceName: dronereplicas: 1selector:matchLabels:app: dronetemplate:metadata:labels:app: dronespec:terminationGracePeriodSeconds: 180containers:- name: droneimage: drone/drone:1imagePullPolicy: Alwaysenv:- name: DRONE_AGENTS_ENABLEDvalue: "true"- name: DRONE_GOGS_SERVERvalue: http://192.168.100.181:30526/  # 注意这里填的是gogs的地址- name: DRONE_RPC_SECRETvalue: qawsedrftg- name: DRONE_SERVER_HOSTvalue: drone.company.com- name: DRONE_SERVER_PROTOvalue: httpports:- containerPort: 80name: port- containerPort: 443name: ssl-portvolumeMounts:- name: volumemountPath: /datavolumes:- name: volumeemptyDir: {}
---
apiVersion: v1
kind: Service
metadata:name: dronelabels:app: drone
spec:type: NodePortports:- port: 80targetPort: 80selector:app: drone

2、执行部署并查看结果

[root@k8s-node001 drone]# kubectl  apply -f drone.yaml[root@k8s-node001 drone]# kubectl get po,svc  -o wide
NAME          READY   STATUS    RESTARTS   AGE     IP   NODE          NOMINATED NODE   READINESS GATES
pod/drone-0   1/1     Running   0          4m40s   100.68.150.198   k8s-node001   <none>           <none>NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE     SELECTOR
service/drone        NodePort    10.100.77.138   <none>        80:31681/TCP     4m40s   app=drone

3、现在就可以用浏览器访问http://192.168.100.181:31681 ,使用gogs的账号就可以登录drone了

4、登录后可以看到,现在并没有任何项目,后续再gogs新建项目,就能看到了

部署Drone Runner

Runner的作用是询问Drone Server,然后执行pipeline,更多信息请查看官网
1、编写drone-runner.yaml

---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:namespace: defaultname: drone
rules:
- apiGroups:- ""resources:- secretsverbs:- create- delete
- apiGroups:- ""resources:- pods- pods/logverbs:- get- create- delete- list- watch- update
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: dronenamespace: default
subjects:
- kind: ServiceAccountname: defaultnamespace: default
roleRef:kind: Rolename: droneapiGroup: rbac.authorization.k8s.io
---
apiVersion: apps/v1
kind: Deployment
metadata:name: drone-runnerlabels:app.kubernetes.io/name: drone-runner
spec:replicas: 1selector:matchLabels:app.kubernetes.io/name: drone-runnertemplate:metadata:labels:app.kubernetes.io/name: drone-runnerspec:containers:- name: drone-runnerimage: drone/drone-runner-kube:latestports:- containerPort: 3000env:- name: DRONE_RPC_HOSTvalue: 192.168.100.181:31681  # Drone Server地址- name: DRONE_RPC_PROTOvalue: http- name: DRONE_RPC_SECRETvalue: qawsedrftg         # Drone Server部署时候填写的secret

2、执行部署并查看结果

[root@k8s-node001 drone]# kubectl  apply -f drone-runner.yaml[root@k8s-node001 drone]# kubectl  get po
NAME                            READY   STATUS    RESTARTS   AGE
drone-runner-7c64bffb45-dh2dn   1/1     Running   0          11m

至此,实现CI/CD的环境都准备好了,现在来跑一个demo

CI/CD示例

1、gogs新建项目demo

2、drone上点sync,就可以看到demo项目

3、激活demo项目,保存

4、在gogs的demo项目中,添加.drone.yml文件,添加一个pipeline

5、提交代码,但是不触发CI,Commit的时候填写[CI SKIP]就可以跳过触发CI

如果这里直接Commit提交代码,就直接触发CI功能,Drone就开始执行这个pipeline了
[CI SKIP]的作用就是如果需要修改多个文件,这时候会很有用;
当然在实际开发过程中,都是把项目clone到本地,编辑好所有文件,再push到代码仓库,这样就不需要[CI SKIP]了
6、我们这里随便修改 README,然后知己commit,不是用[CI SKIP]看下效果

7、执行结果,这里失败了,后面再解决
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IOhE6I92-1600908930452)(http://showdoc.ieasou.cn/server/index.php?s=/api/attachment/visitFile/sign/dd830f81825cd933fcb7f5cb3a80be90&showdoc=.jpg)]
8、如果您commit以后并没有触发Drone,需要在gogs查看webhooks时候正常,如下图

9、这里我们来解决pipeline执行失败的问题
我们通过drone界面可以看到项目pipeline报错如下,显示runner clone代码失败了

Initialized empty Git repository in /drone/src/.git/
+ git fetch origin +refs/heads/master:
fatal: unable to access 'http://192.168.100.181:3000/scofield/demo.git/': Failed to connect to 192.168.100.181 port 3000: Connection refused

首先看下这个pipeline,很简单,使用镜像alpine执行两条输出语句

kind: pipeline
type: kubernetes
name: defaultsteps:
- name: greetingimage: alpinecommands:- echo hello- echo world

但是默认情况下,Drone执行pipeline之前会克隆项目,url就是gogs的http地址,这里是http://192.168.100.181:3000/scofield/demo.git 因为我这里测试环境使用NodePort暴露的服务,Drone需要使用http://192.168.100.181:30526/scofield/demo.git 这个地址才能克隆到项目,如果使用ingress暴露gogs服务,这个url就是域名而不是IP,就不会出现这个问题。
那现在需要解决这个问题,我们就自定义clone,修改默认的克隆地址,修改如下,修改完直接commit代码,触发CI

通过drone页面查看结果,可以看到clone成功

而且执行的echo命令也成功执行

至此本文实战结束

总结

本文是“基于Docker及Kubernetes构建的容器云平台”系列第十篇,也是最后一篇,如果您看完了整个系列文章,在此感谢。
通过这十篇文章,您应该可以构建出一个测试环境的容器平台。关于容器云平台更多内容,后续会继续分享,尽请持续关注。

注:文中部分图片来源于网络,如有侵权,请联系我及时删除。
PS:后续文章会同步到dev.kubeops.net

容器云平台No.10~通过gogs+drone+kubernetes实现CI/CD相关推荐

  1. gogs创建项目_容器云平台No.10~通过gogs+drone+kubernetes实现CI/CD

    什么是CI/CD 持续集成(Continous Intergration,CI)是一种软件开发实践,即团队开发成员经常集成它们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每 ...

  2. 五阿哥钢铁电商平台Docker容器云平台建设实践——你想知道的都在这里!

    前言 五阿哥钢铁电商平台(www.wuage.com)是由钢铁行业第一的中国五矿与互联网第一的阿里巴巴联手打造,并充分运用双方股东优势资源,即:阿里巴巴在大数据.电商运营.互联网产品技术上的巨大优势, ...

  3. java 服务 容量评估,容器云平台容量规划及管理优化

    随着容器云平台实践的深入,容器基础设施资源的分配和使用也暴露出了前期产品设计的一些意料之外的问题.特别在证券行业,资源的使用时段往往比较集中在上午9点到10点时段前后,过了这个时段,资源的使用量就迅速 ...

  4. 从底层操作系统到容器云平台:OpenCloudOS与秒云构筑完美兼容链

    近日,成都元来云志科技有限公司(简称「秒云」)的秒云容器云平台和秒云日志分析系统与 OpenCloudOS 完成相互兼容认证,测试期间,整体运行稳定,在功能.性能及兼容性方面表现良好. 一.产品简介 ...

  5. 江南农村商业银行容器云平台建设经验分享

    [导读]本文主要结合江南农村商业银行(以下简称:江南农商行)容器云平台一期.二期的建设经验进行简要分析和分享,旨在探索一条适合农商行的容器云平台建设路径.通过容器云平台建设赋能业务,为业务应用提供更加 ...

  6. 魅族容器云平台基于Kubernetes自动化运维实践

    作者简介: 曾彬 阿里巴巴 高级技术专家 互联网老兵,十多年的基础架构经验,曾在支付宝.爱立信.魅族等担任系统架构师,从事过 Linux 内核开发,Java 中间件.SOA 应用框架的设计实现.云平台 ...

  7. 钢铁电商平台的Docker容器云平台建设实践

    2019独角兽企业重金招聘Python工程师标准>>> 作者简介:刘晓明,五阿哥(www.wuage.com)公司运维技术负责人,拥有10年的互联网开发和运维经验.一直致力于运维工具 ...

  8. 容器云平台使用体验:时速云

    容器技术风起云涌,在国内也涌现出了很多容器技术创业公司,本文介绍容器厂商DaoCloud提供的容器云平台,通过使用容器云平台,可以让大家更加了解容器,并可以学习不同容器云平台的优势. 1.       ...

  9. 容器云平台使用体验:DaoCloud

    容器技术风起云涌,在国内也涌现出了很多容器技术创业公司,本文介绍容器厂商DaoCloud提供的容器云平台,通过使用容器云平台,可以让大家更加了解容器,并可以学习不同容器云平台的优势. 1.       ...

最新文章

  1. 使用nc传输文件和目录【转】
  2. php iis6 安装ssl证书,在IIS下部署SSL证书实现HTTPS
  3. shell 去除 字符串中的双引号
  4. matlab对图像信号进行频谱分析及滤波,数字信号处理课程设计---应用 Matlab对信号进行频谱分析及滤波...
  5. Android Custom View ----invalidate() 、postInvalidate() and requestLayout()
  6. 存储技术与iSCSI
  7. 暑期训练日志----2018.8.17
  8. python网络编程100例_python网络编程
  9. android 后台耗时,android教程之使用asynctask在后台运行耗时任务
  10. Java基础学习总结(144)——String类为什么要被定义为不可变类
  11. Vulnhub-THE PLANETS: EARTH
  12. python构造函数
  13. 阿里面试算法题(一)
  14. BIGEMAP教您如何选择分度带(中央子午线)
  15. julia集 matlab代码,Julia集分形
  16. 用简单英语谈生意-介绍篇
  17. Contextual Parameter Generation for Knowledge Graph Link Prediction
  18. simulink常用模块
  19. python列表遍历元组_Python 元组遍历排序操作方法
  20. 微信小程序《难忘便签》开发记录

热门文章

  1. BIGD牛魔王UI图标设计iocn主题设计全套高清视频教程
  2. [Excel知识技能] 将数值格式数字转换为文本格式
  3. 扫码签到突破100000用户
  4. canvas教程12-阴影
  5. T00LS MSF笔记
  6. 支付清算体系介绍(下)
  7. linux内核模块Makefile的解析
  8. wlop一张多少钱_为什么很多人都对wlop有成见?
  9. btc、usdt 根据交易hash计算手续费
  10. Jquery.ajax报parseerror Invalid JSON错误的原因和解决方法:不能解析