Docker
Drone使用技巧-编译Go二进制
Drone使用技巧-编译Go二进制
今天接到一个需求,需要清理服务器过期的目录,决定用Go开发脚本进行定期清理,但是每次升级代码都要重新打包成二进制文件放到服务器运行,刚好这段时间一直在研究Drone,所以想利用Drone来完成编译二进制文件,不用在本地编译,下面跟大家分享这个过程。
一、项目代码
下面我贴出Go项目代码,文件名为main.go
package main //清理15天前目录 /** 引入扩展 */ import ( "time" "os" "io/ioutil" ) /** 全局变量 */ type Config struct { FileUrl string //清理目录地址 } //空配置文件 var configData Config //配置 /** 初始化函数 */ func init() { configData.FileUrl = "/home/Records/" } /** 脚本主函数 */ func main() { //获取当前年份 toDayYear := time.Now().Format("2006") //获取去年年份 lastYear := time.Now().AddDate(-1, 0, 0).Format("2006") //获取最近15天日期 startTime := time.Now().AddDate(0, 0, -15).Format("2006-01-02") endTime := time.Now().Format("2006-01-02") //获取最近15天所有日期【不删除数据】 dateTimeList := getBetweenDates(startTime, endTime) //清理去年目录 deleteFile(lastYear, dateTimeList) //清理今年的目录 deleteFile(toDayYear, dateTimeList) //获取当前时间 dateTime := time.Now().Format("2006-01-02 15:04:05") //输出 println(dateTime + ":完成一次目录清理") } /** 删除目录 */ func deleteFile(yearValue string, dateTimeList []string) int { //获取当前月份 toDayMonth := time.Now().Format("01") //获取当前年份 toDayYear := time.Now().Format("2006") //打开年份目录 fileUrl := configData.FileUrl + "/" + yearValue fileExitStatus := fileExitStatus(fileUrl) //判断是否存在目录,不存在不操作 if fileExitStatus == 0 { return 0 } //循环年份目录下所有目录 files, _ := ioutil.ReadDir(fileUrl) //循环目录 for _, f := range files { //文件路径【主目录/年份/月份】 filePath := fileUrl + "/" + f.Name() //再循环一层【获取月份目录下日目录】 filesMonth, _ := ioutil.ReadDir(filePath) for _, monthKey := range filesMonth { //组合文件key【年-月-日】 fileKey := yearValue + "-" + f.Name() + "-" + monthKey.Name() //文件路径【主目录/年份/月份/日】 filePathUrl := filePath + "/" + monthKey.Name() //判断该文件是否是否安全【不在最近15天日期】 fileWhiteStatus := fileKeyStatus(fileKey, dateTimeList) //判断是否需要删除 if fileWhiteStatus == 0 { os.RemoveAll(filePathUrl) } } //判断月份目录是否为空目录且月份不能大于当月【直接删除空目录】 monthDir, _ := ioutil.ReadDir(filePath) if len(monthDir) == 0 && toDayMonth > f.Name() { os.RemoveAll(filePath) } } //判断年份目录是否为空目录 yearDir, _ := ioutil.ReadDir(fileUrl) if len(yearDir) == 0 && toDayYear > yearValue { os.RemoveAll(fileUrl) } //返回 return 1 } /** 获取最近15天日期 */ func getBetweenDates(startDate, endDate string) []string { d := []string{} timeFormatTpl := "2006-01-02 15:04:05" if len(timeFormatTpl) != len(startDate) { timeFormatTpl = timeFormatTpl[0:len(startDate)] } date, err := time.Parse(timeFormatTpl, startDate) if err != nil { // 时间解析,异常 return d } date2, err := time.Parse(timeFormatTpl, endDate) if err != nil { // 时间解析,异常 return d } if date2.Before(date) { // 如果结束时间小于开始时间,异常 return d } // 输出日期格式固定 timeFormatTpl = "2006-01-02" date2Str := date2.Format(timeFormatTpl) d = append(d, date.Format(timeFormatTpl)) for { date = date.AddDate(0, 0, 1) dateStr := date.Format(timeFormatTpl) d = append(d, dateStr) if dateStr == date2Str { break } } return d } /** 判断目录是否存在 */ func fileExitStatus(file string) int { _, err := os.Stat(file) if err == nil { return 1 } if os.IsNotExist(err) { return 0 } return 1 } /** 判断文件路径是否安全 */ func fileKeyStatus(file string, fileList []string) int { //初始化状态 status := 0 //循环获取 for _, value := range fileList { if value == file { status = 1 } } //获取当前日期 date := time.Now().Format("2006-01-02") //设置时区 Loc, _ := time.LoadLocation("Asia/Shanghai") //日期转时间戳 fileTime, _ := time.ParseInLocation("2006-01-02", file, Loc) limitTime, _ := time.ParseInLocation("2006-01-02", date, Loc) //判断文件日期是否大于最大截至日期【防止删错今天之后的目录】 if fileTime.Unix() >= limitTime.Unix() { status = 1 } //返回 return status }
二、获取Gitea密钥
我们到Gitea管理后台获取API密钥,用于下一步将编译后的二进制文件上传到gitea仓库,操作如下
Drone提交那个是我刚刚生成的,大家记得保存好。
三、构建配置文件
我们在项目目录下创建Drone构建文件.drone.yml,配置如下
kind: pipeline type: docker name: clear-call-log #设置挂载 volumes: #Docker环境 - name: docker host: path: /var/run/docker.sock #Docker配置 - name: docker-daemon host: path: /etc/docker/daemon.json #构建步骤 steps: #设置缓存 - name: clean image: docker:19.03.1 pull: if-not-exists network_mode: host # 将宿主机的 docker和配置挂载到运行的 docker 容器中,那么在容器中运行 docker 命令时,等同于在宿主机中运行该docker 命令 volumes: - name: docker path: /var/run/docker.sock - name: images path: /images - name: docker-daemon path: /etc/docker/daemon.json #编译二进制文件 - name: build image: golang:latest pull: if-not-exists environment: GOPROXY: "https://goproxy.cn,direct" # 懂的都懂 commands: - CGO_ENABLED=0 go build -o clear-call-log #推送代码到仓库 - name: push image: plugins/gitea-release settings: api_key: 【gitea密钥】 base_url: 【gitea地址】 files: clear-call-log when: event: tag #通知发到telegram - name: telegram image: hongzhuangxian/telegram-drone-plugin pull: if-not-exists settings: token: from_secret: telegram_token chat_id: from_secret: telegram_chat_id when: event: tag #规定master分支 branches: master
大家根据自己的情况,将gitea密钥替换成自己的、gitea地址替换成自己的gitea地址(地址不是仓库地址),通知那一步,大家根据自己的情况修改,我是通知到电报。
四、提交打包编译
我们先提交一遍代码到仓库
git add . git commit -m '提交' git push origin master
确保代码最新后,执行编译
git tag v1.0.0 git push origin v1.0.0
这样就会交给Drone去帮我们编译成二进制文件。
五、编译过程
这是Drone打包二进制过程
这是通知效果图
我们到Gitea仓库看看我们版本
然后我们直接下载二进制文件丢到服务器运行就可以了,不用自己本地打包编译。
0条评论