Drone统一管理.drone.yaml文件
开发/后端 · 阅读 1870 · 点赞 0
在赞叹drone的简洁与效率的同时,我们会发出疑问.drone.yaml文件难道必须要和工程放在一起才能触发吗,这样管理很不方便,而且与开发无关,ci的流程应该对开发透明才对,于是我去查了一些文档最终找到了这样一个参数:DRONE_YAML_ENDPOINT
官方文档对于该参数的描述: docs.drone.io/extensions/…
如何做到统一管理
根据官网的描述,在drone-server配置了该环境变量后,在触发ci的时候会根据该环境变量配置的远程地址获取yaml文件,知道了这些怎么统一去管理玩法就很多了。
我是如何管理的
我这里是基于k8s环境,如果是其他环境也类似
首先在drone-server配置DRONE_YAML_ENDPOINT环境变量,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: DRONE_YAML_ENDPOINT
value: http://dronerepo-svc:8080
- name: DRONE_GITEA_SERVER
valueFrom:
configMapKeyRef:
name: drone-cm
key: DRONE_GITEA_SERVER
- name: DRONE_GITEA_CLIENT_ID
valueFrom:
configMapKeyRef:
name: drone-cm
key: DRONE_GITEA_CLIENT_ID
- name: DRONE_GITEA_CLIENT_SECRET
valueFrom:
configMapKeyRef:
name: drone-cm
key: DRONE_GITEA_CLIENT_SECRET
- name: DRONE_RPC_SECRET
valueFrom:
configMapKeyRef:
name: drone-cm
key: DRONE_RPC_SECRET
- name: DRONE_USER_CREATE
valueFrom:
configMapKeyRef:
name: drone-cm
key: DRONE_USER_CREATE
- name: DRONE_SERVER_HOST
valueFrom:
configMapKeyRef:
name: drone-cm
key: DRONE_SERVER_HOST
- name: DRONE_SERVER_PROTO
valueFrom:
configMapKeyRef:
name: drone-cm
key: DRONE_SERVER_PROTO
volumeMounts:
- mountPath: /var/run/docker.sock
name: sock
resources: {}
volumes:
- name: sock
hostPath:
path: /var/run/docker.sock
status: {}
编写一个web程序,根据官网的参数和响应值进行配置,我这里只用到了namespace
(仓库用户名)、name
(仓库名称)、default_branch
(触发分支)
// 结构体
type Drone struct {
Build struct{} `json:"build"`
Repo struct{
NameSpace string `json:"namespace"`
RepoName string `json:"name"`
Branch string `json:"default_branch"`
} `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仓库的结构
.
└── test (仓库)
└── master (分支)
└── drone.yaml (具体的yaml文件)
最后将程序打包部署到自己对应的环境中即可
这个时候就算项目根目录无.drone.yaml文件也可以正常去触发ci,如果没有成功触发需要查看drone-server的日志,是否请求地址错误或返回值有误
//返回的yamk需要在data中
type Data struct {
Data string
}