Drone统一管理.drone.yaml文件

开发/后端 · 阅读 1514 · 点赞 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
}