• Post author:
  • Post category:运维
  • Post comments:0评论
  • Reading time:5 mins read

在我们成功搭建了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时对其进行验证。

葫芦

葫芦,诞生于1992年8月11日,游戏宅,胶佬,爱好摸鱼,一个干过超市收银,工地里搬过砖,当过广告印刷狗,做过电焊铁艺的现役.Net程序员。

发表回复