在我们成功搭建了Github的镜像仓库之后,终于轮到CICD的正片了,我们的CICD平台选择使用Drone,一个原生支持Docker,拥抱云原生的CICD平台。
Drone支持多种type的工作流管道,除了最常用的K8S和Docker以外,还支持直接在服务器环境运行的Exec类型,在远程服务器执行的SSH类型,除了这些还有AWS、DIGITAL OCEAN等,具体的可以参考Drone的官方文档。
部署
和前文一样,我们仍然使用Helm来进行部署,前文已经将Drone的官方charts仓库加入到了Helm中,接下来我们只需要配置values文件就可以了。
需要注意的是,Drone的部署分为两个必要步骤和一个可选,分别是Drone、DroneRunner和DroneSecrets,他们的区别如下:
- Drone:本体的Drone实际上是一个web管理页面,提供了可视化的功能,以及发布cicd任务、接收webhook的通知等,可以理解为DroneCI的指挥中心。
- Runner:真正负责干脏活的家伙,接收从Drone收到的任务,并且根据每个步骤来完成任务。
- Secrets:Drone有自带提供的仓库Secret,但是如果你有k8s,自然会想要让Drone能够使用k8sSecrets,这样就不用单独在Drone里每个仓库都配一份了,安装这个插件后,可以使你的DroneCI在yaml中直接引用K8S集群内的Secret。
获取Gitea的ClientID和Secret
进入Gitea,进入设置页面,点击应用选项卡,创建一个Client信息:

名称随便填,然后重定向URI需要填写【https://www.xxx.com/login】,此处http或https还有域名或ip根据你待会要给drone配置的host一致,这里是为了让gitea给drone提供身份认证,uri就是gitea通过验证后回调drone的地址,比如我这里填的就是https://drone.hafuhafu.cn/login,填写完成点击提交,可以获得一个clientID和clientSecret,保存好以备用。
部署Drone
使用Helm来安装Drone实际上没什么好说的,新建Values.yaml,然后helm install -f就ok了,和前文安装gitea的流程一样,在此不多赘述,这里只提供values文件,注意此处涉及到仓库名称的地方可以替换为其他仓库,具体请参照官方文档:
affinity: {}
automountServiceAccountToken: false
emptyDir:
sizeLimit: ""
env:
DRONE_GITEA_CLIENT_ID: 6d4e05f4-zzzz-43db-89a5-xxxxxxxx # 上一步获得的clientID
DRONE_GITEA_CLIENT_SECRET: xxxxxx # 上一步获得的clientSecret
DRONE_GITEA_SERVER: https://gitea.hafuhafu.cn # 你gitea的首页地址,注意http还是https要根据你自己的情况配置
DRONE_RPC_SECRET: somesecret # 和runner通讯时的密钥
DRONE_SERVER_HOST: drone.hafuhafu.cn # drone的访问地址
DRONE_SERVER_PROTO: https # drone访问地址的protocol
DRONE_USER_CREATE: username:StoneShiLei,admin:true # 配置默认admin权限,注意username应该和你gitea的用户名保持一致
extraSecretNamesForEnvFrom: []
extraVolumeMounts: []
extraVolumes: []
fullnameOverride: ""
image:
pullPolicy: IfNotPresent
repository: drone/drone
tag: 2.4.0 # 修改镜像版本为2.4.0 官方chart的镜像版本有点老
imagePullSecrets:
- name: aliregistry
ingress:
enabled: false # 这里设置为false是因为官方chart版本比较老旧,ingress的yaml使用的api和新版k8s不匹配,生成ingress时会报错,所以这里关闭掉,稍后自行配置一个ingress就可以了
hosts:
- host: drone.hafuhafu.cn
paths:
- /
tls: []
nameOverride: ""
nodeSelector: {}
persistentVolume:
accessModes:
- ReadWriteOnce
annotations: {}
enabled: true
existingClaim: ""
mountPath: /data
size: 8Gi
storageClass: nfs # 老样子,使用storageClass自动分配pv
subPath: ""
volumeMode: ""
podAnnotations: {}
podSecurityContext: {}
resources: {}
securityContext: {}
service:
port: 80
type: ClusterIP
tolerations: []
updateStrategy: {}
配置好后直接安装,之后我们再单独配置一个ingress,注意我这里使用的是traefik,如果你是Nginx的话需要自行改动:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: drone
namespace: drone
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: 'web,websecure'
spec:
rules:
- host: drone.hafuhafu.cn # 和上面的host保持一致
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: drone
port:
number: 80
至此Drone就部署完成了,现在可以打开drone的host地址进行访问:

点击continue按钮,会跳转到你的Gitea进行认证,完成后再填写一些基础信息就可以完成登陆:

该页面会显示你gitea的仓库列表,接下来我们该部署runner了。
部署Runner
Runner的部署过程更为简单,老样子,这里贴出values:
affinity: {}
env:
DRONE_AGENTS_ENABLED: true
DRONE_NAMESPACE_DEFAULT: drone # 你drone所在k8s的namespace,runner运行时会在该命名空间创建pod来跑任务
DRONE_RPC_HOST: drone # drone的host地址,这里使用了svc的名称
DRONE_RPC_PROTO: http # 集群内部通讯,默认http就好了
DRONE_RPC_SECRET: somesecret # 和你drone的同名变量保持一致,用于两者之间的通讯
DRONE_SECRET_PLUGIN_ENDPOINT: http://10.1.131.221:3000 # droneSecret的svc地址,等待会部署了Secret之后再来补上,如果你不使用这个插件可以不配置
DRONE_SECRET_PLUGIN_TOKEN: yyyy # droneSecret和runner通讯用的token 现在先随便写一个,之后把这个填到droneSecret里就可以了,如果你不使用这个插件可以不配置
extraSecretNamesForEnvFrom: []
extraVolumeMounts: []
extraVolumes: []
fullnameOverride: ""
image:
pullPolicy: IfNotPresent
repository: drone/drone-runner-kube
tag: 1.0.0-rc.1
imagePullSecrets:
- name: aliregistry
ingress:
annotations: {}
enabled: false # runner不需要外网访问,所以不开启ingress
hosts:
- host: chart-example.local
paths:
- /
tls: []
nameOverride: ""
nodeSelector: {}
podAnnotations: {}
podSecurityContext: {}
rbac:
buildNamespaces:
- drone
replicaCount: 1
resources: {}
securityContext: {}
service:
port: 3000
type: ClusterIP
terminationGracePeriodSeconds: 3600
tolerations: []
仍然helm install -f进行安装,没啥好说的。
部署DroneSecret(可选)
不废话,上values:
affinity: {}
env:
KUBERNETES_NAMESPACE: default
SECRET_KEY: yyyy # 和runner里填的token保持一致
extraSecretNamesForEnvFrom: []
fullnameOverride: ""
image:
pullPolicy: IfNotPresent
repository: drone/kubernetes-secrets
tag: latest
imagePullSecrets:
- name: aliregistry
nameOverride: ""
nodeSelector: {}
podAnnotations: {}
podSecurityContext: {}
rbac:
enabled: true
restrictToSecrets: []
secretNamespace: default
replicaCount: 1
resources: {}
securityContext: {}
service:
port: 3000
type: ClusterIP
tolerations: []
都部署完成后,查看下pod是否都running正常,如果有问题就查看pod的log就好,没有问题的话我们接下来在下一篇文章中开始研讨如何使用drone进行CI时对其进行验证。