前言
- 之前项目组的CICD使用的是jenkins,配置项目都是用后台UI配置的,虽然他有pipeline但是配置比较复杂一直没有写过,并且插件只能用java开发。后来了解到了drone
- drone是一款go开发的开源的CI/CD系统,其核心设计理念是简洁、易用与高效。提供了从代码提交到应用部署的完整的自动化流程。界面很简单,插件开发不局限于语言,因为他是基于docker image 形式调用的。
- 插件开发比较简单,官方还提供了丰富的数据给我们使用,具体看下面的插件介绍
- 自己开发的一个简单的更新发布k8s的drone插件github地址
drone插件介绍
- drone的插件调用是基于镜像的所以,不限制任何语言开发drone的插件
- drone是将数据以环境变量的方式传给你,比如git的commit信息,镜像的tag等信息,具体可以参阅drone环境变量说明
- 你可以在drone中定义参数,drone也会以环境变量方式传给你
- 官网也有插件市场drone官方插件
插件开发实践
- 我使用的是go开发的drone插件,实现了项目打包后更新部署到k8s上,k8s面板使用的是kuboard是CICDapi,我只要在项目中把accessKey和accessSecret传过去就行
- 主要就是绑定获取drone给的变量
- 环境变量全是大写的
- drone中自定的参数转换成环境变量后会自动加上
PLUGIN_
viper绑定环境变量到结构体
- 定义结构体
go
type PConfig struct {
Debug bool `envName:"PLUGIN_DEBUG"`
AccessToken string `envName:"PLUGIN_ACCESS_TOKEN,PLUGIN_TOKEN"`
AccessSecret string `envName:"PLUGIN_ACCESS_SECRET,PLUGIN_SECRET"`
Lang string `envName:"PLUGIN_LANG"`
}
- 使用viper进行数据绑定
go
package plugin
import (
"drone-k8s/models"
"fmt"
"github.com/spf13/viper"
"reflect"
)
func Bind() (PConfig models.PConfig) {
viper.AutomaticEnv() // 允许读取环境变量
vPConfig := reflect.ValueOf(&PConfig).Elem()
tPConfig := vPConfig.Type()
for i := 0; i < tPConfig.NumField(); i++ {
field := tPConfig.Field(i)
envName := field.Tag.Get("envName")
fieldValue := vPConfig.Field(i)
switch field.Type.Name() {
case "bool":
v := viper.GetBool(envName)
if fieldValue.CanSet() {
vPConfig.Field(i).SetBool(v)
} else {
fmt.Printf("Cannot set value for field %s\n", field.Name)
}
case "string":
v := viper.GetString(envName)
if fieldValue.CanSet() {
vPConfig.Field(i).SetString(v)
} else {
fmt.Printf("Cannot set value for field %s\n", field.Name)
}
case "int", "uint8", "uint16", "uint32", "uint64", "int8", "int16", "int32", "int64":
v := viper.GetInt(envName)
if fieldValue.CanSet() {
vPConfig.Field(i).SetInt(int64(v))
} else {
fmt.Printf("Cannot set value for field %s\n", field.Name)
}
case "float", "float32", "float64":
v := viper.GetFloat64(envName)
if fieldValue.CanSet() {
vPConfig.Field(i).SetFloat(v)
} else {
fmt.Printf("Cannot set value for field %s\n", field.Name)
}
}
}
return
}
- 绑定之后就可以使用获取大的数据进行下一步操作了
调用示例
- 如果想调试插件就在drone.yml中打开debug配置,这样有问题便于我们排查
- 最后附上demo地址drone插件github
yaml
- name: Deploy app
image: testhub.xxxxx.cn:9043/xxxxx/drone-k8s:latest
settings:
debug: true # 调试模式
build_number: ${DRONE_BUILD_NUMBER}
kuboard_accessKey: xxxxxxx
namespace: "chain-server"
deployment_name: "xxxxx-server"
dashboard: kuboard
build_repo:
from_secret: build_repo