前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >DevOps利器gitness之源码剖析(1)

DevOps利器gitness之源码剖析(1)

原创
作者头像
金鹏
修改2023-11-12 01:07:40
6150
修改2023-11-12 01:07:40
举报
文章被收录于专栏:SDLC技术探究SDLC技术探究

0x01. 引言

最近在微信听书追《大明王朝1566》,在执行嘉靖老板“改稻为桑”的国策时,胡宗宪业务总监表现出两难态度,他既不想得罪老板,也不想得罪严嵩总管,还不想得罪,吕芳/皇储那几帮人;更不想成为千古罪人,背负千古骂名,他的策略总结起来就一个字“缓”,先安抚地方,向上争取支持等手段实在是过人。闲话少叙,想想古人当官也是难,但是再难也得继续撸起袖子继续干,不然脑袋随时搬家。我们也得学习前人,前史为鉴,不能随便的放弃,沉下心来做事,要不然没饭吃啊。这不,我也想继续把gitness研究下去,所以才打算写这一系列的文章,把它吃透。

上一篇文章我简要介绍了如何搭建DevOps利器gitness,以及相关UI上的功能介绍,本篇开始一起探究他的实现,一方面可以学习他的代码风格,另一方面了解其逻辑实现,等线上即便出了问题,我们也能找到病根及时下药。

0x02. 万事main开头

harness的main函数在https://github.com/harness/gitness/blob/main/cmd/gitness/main.go,最上面是熟悉的copyright,用的是 Apache License, Version 2.0,所以在引用代码时请注意下版权。接下来定义了main package以及导入了相关的package。还有一个const包含了gitness名称和描述。接下来主要的逻辑入口如下:

代码语言:go
复制
func main() {
	args := cli.GetArguments()

	app := kingpin.New(application, description)

	migrate.Register(app)
	server.Register(app, initSystem)

	user.Register(app)
	users.Register(app)

	account.RegisterLogin(app)
	account.RegisterRegister(app)
	account.RegisterLogout(app)

	hooks.Register(app)

	cli.RegisterSwagger(app)

	kingpin.Version(version.Version.String())
	kingpin.MustParse(app.Parse(args))
}

我们看到第一个语句是args := cli.GetArguments(),从cli包调用GetArguments方法获取参数,我们待会看下实现。

第二句是使用kingpin包调用New方法初始化一个harness名称的应用,接下来分别在migrate/server/user/users/account/hooks/cli等包初始化注册了这个app,以及相关的特性,后续文章再深入研究。

最后调用了kingpin的Version方法,和参数解析方法MustParse。

那么本文的目的有了,先简单了解下上述引用的包是干啥的,我们先搞清楚。

0x021 cli包

这个cli包包含了operations等相关sub包。而GetArguments方法是在cli.go中定义的。

其中调用了githook.SanitizeArgsForGit,看描述主要是判断command是否来自git hooks,如果是的话那就append下,返回参数列表。

而operations的sub包:

  • account: 顾名思义是跟账户初始化相关的操作
  • hooks: 大概是跟git hooks相关的操作
  • migrate:跟数据库初始化相关的操作
  • user/users:跟用户相关的操作 其他的:
  • provide: 提供session,cli的初始化
  • server:httpserver 和配置相关的初始化操作
  • session:初始化session相关的操作
  • textui: 命令行终端相关的操作
  • swagger.go提供了swagger 文件生成相关的操作。

0x022 version包

里面调用了go-semver,做一些版本号的校验和解析。

go-semver是一个go的版本号控制包. 可以用来比较版本号的字段。官方给的例子看下也很好理解:

代码语言:javascript
复制
//>> example.go 
vA := semver.New("1.2.3")
vB := semver.New("3.2.1")

fmt.Printf("%s < %s == %t\n", vA, vB, vA.LessThan(*vB))
//end

$ go run example.go 1.2.3 3.2.1
1.2.3 < 3.2.1 == true

$ go run example.go 5.2.3 3.2.1
5.2.3 < 3.2.1 == false

0x023 好玩的kingpin包

这是一个命令行解析器的go库,可以使用它来快速构建自己的命令行程序。

官方给的例子:

代码语言:javascript
复制
$ ping --help
usage: ping [<flags>] <ip> [<count>]

Flags:
  --debug            Enable debug mode.
  --help             Show help.
  -t, --timeout=5s   Timeout waiting for ping.

Args:
  <ip>        IP address to ping.
  [<count>]   Number of packets to send
$ ping 1.2.3.4 5
Would ping: 1.2.3.4 with timeout 5s and count 5
代码语言:javascript
复制
package main

import (
  "fmt"

  "gopkg.in/alecthomas/kingpin.v2"
)

var (
  debug   = kingpin.Flag("debug", "Enable debug mode.").Bool()
  timeout = kingpin.Flag("timeout", "Timeout waiting for ping.").Default("5s").OverrideDefaultFromEnvar("PING_TIMEOUT").Short('t').Duration()
  ip      = kingpin.Arg("ip", "IP address to ping.").Required().IP()
  count   = kingpin.Arg("count", "Number of packets to send").Int()
)

func main() {
  kingpin.Version("0.0.1")
  kingpin.Parse()
  fmt.Printf("Would ping: %s with timeout %s and count %d\n", *ip, *timeout, *count)
}

看起来使用挺简单。它是一种fluent-style的写法,可读性强,也容易理解。

但是看官方的说明就比较搞笑了。

What does this mean? I do not have time to fix issues myself. The only way fixes or new features will be added is by people submitting PRs. If you are interested in taking over maintenance and have a history of contributions to Kingpin, please let me know. Current status. Kingpin is largely feature stable. There hasn't been a need to add new features in a while, but there are some bugs that should be fixed.Why? I no longer use Kingpin personally (I now use kong). Rather than leave the project in a limbo of people filing issues and wondering why they're not being worked on, I believe this notice will more clearly set expectations.

owner说他没时间维护了,现在版本也稳定了没啥新的需求,但是可以通过PR来bugfixes或者new features,好吧!

0x03. 总结回顾

好了,今天先到这里。总结下,本文主要从main函数开始分析,总的来说非常简单,没啥可说的,但是本文扩展了一下它里面用到的一些三方包,如果我们自己写代码也可以根据需要参考使用。总的来说,万事开头难,今天开始第一天深入探究gitness,希望以后能脚踏实地地坚持下来,了解其实现过程,提升自己代码水准,增加一些见识。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x01. 引言
  • 0x02. 万事main开头
    • 0x021 cli包
      • 0x022 version包
        • 0x023 好玩的kingpin包
        • 0x03. 总结回顾
        相关产品与服务
        CODING DevOps
        CODING DevOps 一站式研发管理平台,包括代码托管、项目管理、测试管理、持续集成、制品库等多款产品和服务,涵盖软件开发从构想到交付的一切所需,使研发团队在云端高效协同,实践敏捷开发与 DevOps,提升软件交付质量与速度。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档