theme: scrolls-light
Drone统一管理.drone.yaml文件
在赞叹drone的简洁与效率的同时,我们会发出疑问.drone.yaml文件难道必须要和工程放在一起才能触发吗,这样管理很不方便,而且与开发无关,ci的流程应该对开发透明才对,于是我去查了一些文档最终找到了这样一个参数
yaml DRONE_YAML_ENDPOINT
官方文档对于该参数的描述: https://docs.drone.io/extensions/configuration/#configuration
如何做到统一管理
根据官网的描述,在drone-server配置了该环境变量后,在触发ci的时候会根据该环境变量配置的远程地址获取yaml文件,知道了这些怎么统一去管理玩法就很多了。
我是如何管理的
我这里是基于k8s环境,如果是其他环境也类似
首先在drone-server配置DRONEYAMLENDPOINT环境变量,value的地址需要自行编写一个web程序,提供一个post api接口地址(我这里用go实现)
``` kind: Deployment metadata: labels: app: drone name: drone spec: replicas: 1 selector: matchLabels: app: drone strategy: {} template: metadata: labels: app: drone spec: containers: - image: drone/drone name: drone ports: - containerPort: 80 name: http env: - name: DRONEYAMLENDPOINT value: http://dronerepo-svc:8080 - name: DRONEGITEASERVER valueFrom: configMapKeyRef: name: drone-cm key: DRONEGITEASERVER - name: DRONEGITEACLIENTID valueFrom: configMapKeyRef: name: drone-cm key: DRONEGITEACLIENTID - name: DRONEGITEACLIENTSECRET valueFrom: configMapKeyRef: name: drone-cm key: DRONEGITEACLIENTSECRET - name: DRONERPCSECRET valueFrom: configMapKeyRef: name: drone-cm key: DRONERPCSECRET - name: DRONEUSERCREATE valueFrom: configMapKeyRef: name: drone-cm key: DRONEUSERCREATE - name: DRONESERVERHOST valueFrom: configMapKeyRef: name: drone-cm key: DRONESERVERHOST - name: DRONESERVERPROTO valueFrom: configMapKeyRef: name: drone-cm key: DRONESERVERPROTO volumeMounts: - mountPath: /var/run/docker.sock name: sock resources: {} volumes: - name: sock hostPath: path: /var/run/docker.sock status: {}
```
编写一个web程序,根据官网的参数和响应值进行配置,我这里只用到了namespace(仓库用户名)、name(仓库名称)、defaultbranch(触发分支) ``golang // 结构体 type Drone struct { Build struct{}
json:"build" Repo struct{ NameSpace string
json:"namespace" RepoName string
json:"name" Branch string
json:"defaultbranch" }
json:"repo"`
}
处理了请求接下来就需要获取yaml,我这里yaml存储在了gitea里,根据上面请求的参数动态替换一下即可
var droneRepoUrl = "http://url/%s/dronerepo/raw/branch/%s/%s/%s/drone.yaml"
url := fmt.Sprintf(droneRepoUrl,drone.Repo.NameSpace,drone.Repo.Branch,drone.Repo.RepoName,drone.Repo.Branch)
```
这样我们根据ci触发时不同的用户,仓库,以及分支就可以统一进行管理了,下面是yaml仓库的结构 yaml . └── test (仓库) └── master (分支) └── drone.yaml (具体的yaml文件)
最后将程序打包部署到自己对应的环境中即可
这个时候就算项目根目录无.drone.yaml文件也可以正常去触发ci,如果没有成功触发需要查看drone-server的日志,是否请求地址错误或返回值有误
golang //返回的yamk需要在data中 type Data struct { Data string }