gitlab-runner服务注册及任务捕获原理

环境搭建

能够参考https://docs.gitlab.com/runner/development/README.html 来进行搭建,这里须要注意的是,go version最好为go1.8.7,高版本的go version,可能会安装失败。html

参数注册

gitlab-runner在注册runner时,须要用到registryinstallstart这三个命令。而其实installstart只是服务注册的git

main.go文件的入口处,其调用了common.GetCommands()github

而这个函数是为了注册参数的,其核心代码为:golang

Imgur

Name为咱们要注册的参数,Action为调用参数后调用的方法。web

在注册方法时,只须要使用RegisterCommand2(参数名, 说明, 动做函数类)便可。docker

registry

commands/registry.go里有一个init函数,注册了registryshell

Imgur

newRegisterCommand函数确定返回了Execute函数,也就是触发registry的动做函数。数组

Imgur

这里返回了一个RegisterCommand类,而这个类下实现了Execute方法。websocket

Imgur

其中s.askRunner()就是咱们输入命令后,出现的各类询问,如:gitlab-ci URL、token、description、tags。ssh

askRunner函数里,当你输入完成后,有一步校验的操做,检验你输入的只是否真的能够链接到gitlab-ci上。

这些都没什么好说的。在askRunner函数后,还askExecutoraskExecutorOptions函数。这两个函数的做用是询问你要选择哪一种执行者,也就是咱们见到的Please enter the executor: docker+machine, docker, docker-ssh, shell, docker-ssh+machine, kubernetes, parallels, ssh, virtualbox:

当你所有输入完成后,会把你输入值,保存在~/.gitlab-runner/config.toml文件里。

其实到这步的时候,整个gitlab-ci就已经配置好了,installstart的做用下面再说

install/start

当你注册完成后,再使用install进行安装时,其实安装的是gitlab-ci服务。

咱们看下commands/service.go文件的内容:

Imgur

能够看到其余的参数基本都是在这里进行注册,其余的咱们暂时不看,专一看下installstart

其中这两个参数的行为都是RunServiceControl函数,这个函数的代码也十分简单

Imgur

其中install比较特别,单独调用了runServiceInstall函数,这个函数的做用就是为了检查config.toml以及当前用户的代码,没啥好说的,最后也调用了service.Control(s, c.Command.Name)方法。这个方法是github.com/ayufan/gola…库,这个库是一个注册服务的库,也就说当你使用gitlab-runner install的时候,实际上是在注册服务,服务的做用是保证gitlab-runner一直在后台运行以及开机运行。

当服务注册好后,再经过gitlab-runner start打开服务(这里其实能够集成到install里,可是不知道为何gitlab官网没有这么作)

当咱们调用service.Control(s, 'start')时,其实会执行s.Start()方法,而这个方法其实就是开启服务的,而打开服务时,也须要一个命令行,由于要告诉系统我执行的什么的命令是服务。其代码为:

Imgur

咱们看到Arguments是一个数组,且第一个元素是run,后面的代码也都是run的参数了。

如今能够肯定,当咱们使用gitlab-runner start时,其内部调用了run当作服务的命令。咱们来看下Run的代码

Imgur

其中mr.feedRunners(runners)函数只是作心跳检测的,没什么可说的。

mr.startWorkers(startWorker, stopWorker, runners)才是主要的,这个函数通过5~6次的调用,最终调用了一个RequestJob函数,这个才是重头戏

Imgur

能够看到这里是发请求询问gitlab-runner有没有新的任务,若是有则返回resqonse

而这个函数的调用链,有一个方法是一直在循环这个函数,从而实现了轮询(我以前一直觉得是经过websocket来作,没想到是轮询来实现的,多是为了兼容性?)

最终的结果,就是gitlab-runner启动后,一直在轮询给gitlab发请求,问它有没有新的任务。

捕获任务后

等我有空写下章再说吧。

其余

原文连接:github.com/alo7/blog-F…

我司(爱乐奇)招人,感兴趣的小伙伴能够来投简历呀。

弹性工做制、每日水果、同事都特别nice、96五、团建、五险一金...

地点上海浦软大厦

相关文章
相关标签/搜索