Open BlackHole1 opened 5 years ago
可以参考https://docs.gitlab.com/runner/development/README.html 来进行搭建,这里需要注意的是,go version最好为go1.8.7,高版本的go version,可能会安装失败。
go1.8.7
gitlab-runner在注册runner时,需要用到registry、install、start这三个命令。而其实install和start只是服务注册的
gitlab-runner
registry
install
start
在main.go文件的入口处,其调用了common.GetCommands()
而这个函数是为了注册参数的,其核心代码为:
Name为我们要注册的参数,Action为调用参数后调用的方法。
Name
Action
在注册方法时,只需要使用RegisterCommand2(参数名, 说明, 动作函数类)即可。
RegisterCommand2(参数名, 说明, 动作函数类)
在commands/registry.go里有一个init函数,注册了registry
commands/registry.go
newRegisterCommand函数肯定返回了Execute函数,也就是触发registry的动作函数。
newRegisterCommand
Execute
这里返回了一个RegisterCommand类,而这个类下实现了Execute方法。
RegisterCommand
其中s.askRunner()就是我们输入命令后,出现的各种询问,如:gitlab-ci URL、token、description、tags。
s.askRunner()
在askRunner函数里,当你输入完成后,有一步校验的操作,检验你输入的只是否真的可以连接到gitlab-ci上。
askRunner
这些都没什么好说的。在askRunner函数后,还askExecutor、askExecutorOptions函数。这两个函数的作用是询问你要选择哪种执行者,也就是我们见到的Please enter the executor: docker+machine, docker, docker-ssh, shell, docker-ssh+machine, kubernetes, parallels, ssh, virtualbox:
askExecutor
askExecutorOptions
Please enter the executor: docker+machine, docker, docker-ssh, shell, docker-ssh+machine, kubernetes, parallels, ssh, virtualbox:
当你全部输入完成后,会把你输入值,保存在~/.gitlab-runner/config.toml文件里。
~/.gitlab-runner/config.toml
其实到这步的时候,整个gitlab-ci就已经配置好了,install、start的作用下面再说
当你注册完成后,再使用install进行安装时,其实安装的是gitlab-ci服务。
gitlab-ci
我们看下commands/service.go文件的内容:
commands/service.go
可以看到其他的参数基本都是在这里进行注册,其他的我们暂时不看,专注看下install、start
其中这两个参数的行为都是RunServiceControl函数,这个函数的代码也十分简单
RunServiceControl
其中install比较特别,单独调用了runServiceInstall函数,这个函数的作用就是为了检查config.toml以及当前用户的代码,没啥好说的,最后也调用了service.Control(s, c.Command.Name)方法。这个方法是github.com/ayufan/golang-kardianos-service库,这个库是一个注册服务的库,也就说当你使用gitlab-runner install的时候,其实是在注册服务,服务的作用是保证gitlab-runner一直在后台运行以及开机运行。
runServiceInstall
config.toml
service.Control(s, c.Command.Name)
gitlab-runner install
当服务注册好后,再通过gitlab-runner start打开服务(这里其实可以集成到install里,但是不知道为什么gitlab官网没有这么做)
gitlab-runner start
当我们调用service.Control(s, 'start')时,其实会执行s.Start()方法,而这个方法其实就是开启服务的,而打开服务时,也需要一个命令行,因为要告诉系统我执行的什么的命令是服务。其代码为:
service.Control(s, 'start')
s.Start()
我们看到Arguments是一个数组,且第一个元素是run,后面的代码也都是run的参数了。
Arguments
run
现在可以确定,当我们使用gitlab-runner start时,其内部调用了run当做服务的命令。我们来看下Run的代码
Run
其中mr.feedRunners(runners)函数只是做心跳检测的,没什么可说的。
mr.feedRunners(runners)
而mr.startWorkers(startWorker, stopWorker, runners)才是主要的,这个函数经过5~6次的调用,最终调用了一个RequestJob函数,这个才是重头戏
mr.startWorkers(startWorker, stopWorker, runners)
RequestJob
可以看到这里是发请求询问gitlab-runner有没有新的任务,如果有则返回resqonse
resqonse
而这个函数的调用链,有一个方法是一直在循环这个函数,从而实现了轮询(我之前一直以为是通过websocket来做,没想到是轮询来实现的,可能是为了兼容性?)
轮询
最终的结果,就是gitlab-runner启动后,一直在轮询给gitlab发请求,问它有没有新的任务。
gitlab
等我有空写下章再说吧。
@BlackHole1 大佬我来迟了,给你点个👍
@Tomyail 巨佬说笑了
大佬,没有后续了吗
@fafucoder 恩..最近比较忙,可以关注下: bugs.cc,如果有更新,我会在博客里第一时间更新
大佬续更呀,最近正在看这块,刚学 Go,有点吃力
环境搭建
可以参考https://docs.gitlab.com/runner/development/README.html 来进行搭建,这里需要注意的是,go version最好为
go1.8.7
,高版本的go version,可能会安装失败。参数注册
gitlab-runner
在注册runner时,需要用到registry
、install
、start
这三个命令。而其实install
和start
只是服务注册的在main.go文件的入口处,其调用了common.GetCommands()
而这个函数是为了注册参数的,其核心代码为:
Name
为我们要注册的参数,Action
为调用参数后调用的方法。在注册方法时,只需要使用
RegisterCommand2(参数名, 说明, 动作函数类)
即可。registry
在
commands/registry.go
里有一个init函数,注册了registry
newRegisterCommand
函数肯定返回了Execute
函数,也就是触发registry
的动作函数。这里返回了一个
RegisterCommand
类,而这个类下实现了Execute
方法。其中
s.askRunner()
就是我们输入命令后,出现的各种询问,如:gitlab-ci URL、token、description、tags。在
askRunner
函数里,当你输入完成后,有一步校验的操作,检验你输入的只是否真的可以连接到gitlab-ci上。这些都没什么好说的。在
askRunner
函数后,还askExecutor
、askExecutorOptions
函数。这两个函数的作用是询问你要选择哪种执行者,也就是我们见到的Please enter the executor: docker+machine, docker, docker-ssh, shell, docker-ssh+machine, kubernetes, parallels, ssh, virtualbox:
当你全部输入完成后,会把你输入值,保存在
~/.gitlab-runner/config.toml
文件里。其实到这步的时候,整个gitlab-ci就已经配置好了,
install
、start
的作用下面再说install/start
当你注册完成后,再使用
install
进行安装时,其实安装的是gitlab-ci
服务。我们看下
commands/service.go
文件的内容:可以看到其他的参数基本都是在这里进行注册,其他的我们暂时不看,专注看下
install
、start
其中这两个参数的行为都是
RunServiceControl
函数,这个函数的代码也十分简单其中
install
比较特别,单独调用了runServiceInstall
函数,这个函数的作用就是为了检查config.toml
以及当前用户的代码,没啥好说的,最后也调用了service.Control(s, c.Command.Name)
方法。这个方法是github.com/ayufan/golang-kardianos-service库,这个库是一个注册服务的库,也就说当你使用gitlab-runner install
的时候,其实是在注册服务,服务的作用是保证gitlab-runner
一直在后台运行以及开机运行。当服务注册好后,再通过
gitlab-runner start
打开服务(这里其实可以集成到install里,但是不知道为什么gitlab官网没有这么做)当我们调用
service.Control(s, 'start')
时,其实会执行s.Start()
方法,而这个方法其实就是开启服务的,而打开服务时,也需要一个命令行,因为要告诉系统我执行的什么的命令是服务。其代码为:我们看到
Arguments
是一个数组,且第一个元素是run
,后面的代码也都是run
的参数了。现在可以确定,当我们使用
gitlab-runner start
时,其内部调用了run
当做服务的命令。我们来看下Run
的代码其中
mr.feedRunners(runners)
函数只是做心跳检测的,没什么可说的。而
mr.startWorkers(startWorker, stopWorker, runners)
才是主要的,这个函数经过5~6次的调用,最终调用了一个RequestJob
函数,这个才是重头戏可以看到这里是发请求询问
gitlab-runner
有没有新的任务,如果有则返回resqonse
而这个函数的调用链,有一个方法是一直在循环这个函数,从而实现了
轮询
(我之前一直以为是通过websocket来做,没想到是轮询来实现的,可能是为了兼容性?)最终的结果,就是
gitlab-runner
启动后,一直在轮询给gitlab
发请求,问它有没有新的任务。捕获任务后
等我有空写下章再说吧。