Drone插件开发-go

前言

  • 之前项目组的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
相关推荐
江湖十年1 天前
Go 虚荣域名详解:我用 go get -x 抓了个包,终于看清了 Go 工具链“对暗号”的全过程
后端·面试·go
平头哥AI1 天前
Day 22 _ 包装错误别丢链_%w、errors.Is 与 errors.As
android·服务器·学习·golang·go
鹤落晴春2 天前
【K8s】从 ConfigMap 到 Argo CD:Kubernetes 配置管理链路
运维·云原生·容器·kubernetes
王码码20352 天前
Go语言CGO:Go与C交互
后端·golang·go·接口
妙码生花2 天前
两个月 59 篇 AI 开发日志 + Golang 商业级实战项目收工后,得来的 AI 使用心法-下
前端·后端·go
嘴贱欠吻!2 天前
如何成为 CJMP 贡献者:AtomGit贡献流程与要求
git·ci/cd
名字还没想好☜2 天前
Docker 镜像瘦身进阶:用 distroless/scratch 把 Go 服务打到 10MB,以及没 shell 怎么调试
运维·docker·容器·golang·kubernetes
陈聪.2 天前
Kubernetes 集群网络插件迁移:从 Flannel 到 Calico 实战总结
云原生·kubernetes
hasty2 天前
一个 Git 分支名,如何穿透到 CI Runner 的 Shell?
git·ci/cd
thesky1234562 天前
智能体面试准备(八十九):智能体生产环境持续交付与版本治理工程——Agent CI/CD、版本化与 Eval-Gated 发布
ci/cd·灰度发布·智能体·持续交付·版本治理·agent registry·版本化