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五、團建、五險一金...

地點上海浦軟大廈

相關文章
相關標籤/搜索