GitLab Runner 入門及常見問題

安裝GitLab Runner

本教程的安裝環(huán)境為Ubuntu18.04。

  1. 運(yùn)行以下命令增加GitLab官方倉庫:
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
  1. 安裝最新版本的GitLab Runner,或者選擇特定的版本:

    • 安裝最新版本
    sudo apt-get install gitlab-runner
    
    • 選擇特定的版本
    sudo apt-get install gitlab-runner=10.0.0
    

注冊GitLab Runner

此處是將你的GitLab Runner注冊到GitLab page上,讓GitLab page可以和你的Runner通信苛预。

先決條件

在注冊Runner之前,你首先需要:

  • 安裝好Runner的Linux主機(jī)
  • 從GitLab page上獲得token

注冊

  1. 運(yùn)行如下命令:
sudo gitlab-runner register
  1. 輸入GitLab URL:
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
https://code.siemens.com/

注意:你可以通過GitLab page -> Settings -> CI/CD -> Runners來獲得URL,當(dāng)然前提條件是你有權(quán)限進(jìn)入這些頁面篡腌。

RegisterRunner.PNG

  1. 輸入你的注冊token:
Please enter the gitlab-ci token for this runner  
xxx

在步驟2中你也可以同時(shí)看到 token信息

  1. 輸入對這個(gè)Runner的表述(同時(shí)也是這個(gè)Runner的名字),當(dāng)然勾效,你也可以稍后在GitLab page上修改它:
Please enter the gitlab-ci description for this runner  
[hostame] my-runner
  1. 輸入Runner的tag嘹悼,稍后你同樣可以在GitLab page上修改它:
Please enter the gitlab-ci tags for this runner (comma separated):
my-tag,another-tag

注意 tag可以有多個(gè),各 tag之間用逗號隔開层宫。如果你使用了多個(gè) tag杨伙,那么當(dāng)你想用這個(gè) Runner時(shí),在.gitlab-ci.yml的 tag字段里也必須明確指明這些 tags萌腿。

  1. 輸入Runner的executor
Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:
docker

如果你選擇Docker作為Runner的executor限匣,你還要選擇默認(rèn)的docker image來運(yùn)行job(當(dāng)然,你也可以在.gitlab-ci.yml里指明你需要用的image):

Please enter the Docker image (eg. ruby:2.1):
alpine:latest

注冊完成后你可以在/etc/gitlab-runner里發(fā)現(xiàn) config.toml文件哮奇,該文件是Runner的配置文件


使用GitLab Runner

  • 直接運(yùn)行Runner

    sudo gitlab-runner run
    
  • 將Runner作為一個(gè)服務(wù)

    1. 將GitLab Runner安裝為系統(tǒng)服務(wù)
    sudo gitlab-runner install -n "<service-name>" -u <user-name>
    
    1. 啟動(dòng)服務(wù):
    sudo gitlab-runner start -n "<service-name>"
    

    注意:這些服務(wù)相關(guān)的命令是不推薦的并且將會(huì)在接下來的版本中刪除膛腐。

想要了解更多GitLab Runner相關(guān)的命令,請?jiān)L問GitLab Runner Commands.


重要的話題 —— Executor

Shell Executor

以宿主機(jī)(此處為Ubuntu18.04系統(tǒng))作為Runner的所有jobs的執(zhí)行器鼎俘。

Runner將會(huì)從遠(yuǎn)程倉庫pull你的工程哲身,工程的目錄為:<working-directory>/builds/<short-token>/<concurrent-id>/<namespace>/<project-name>

如果你使用了cache贸伐,那么cache將會(huì)存在<working-directory>/cache/<namespace>/<project-name>勘天。

想了解更多關(guān)于Shell executor的內(nèi)容,請?jiān)L問Shell Executor

Docker Executor

所有jobs的執(zhí)行環(huán)境為指定的docker image所生成的container脯丝,每個(gè)job都會(huì)生成一個(gè)container并且在job結(jié)束后立即銷毀商膊。

  • build和cache的存儲(chǔ)

    Docker executor默認(rèn)將所有的builds存儲(chǔ)在/builds/<namespace>/<project-name>(這里的路徑是container里的路徑,Runner配置文件config.toml里的build_dir字段可以重新指明build的目錄宠进,默認(rèn)對應(yīng)于宿主機(jī)的目錄是在宿主機(jī)的docker volume下:/var/lib/docker/volumes/<volume-id>/_data/<project-name>)晕拆,默認(rèn)將所有的caches存儲(chǔ)在container里的/cache目錄(config.toml里的cache_dir字段可以重新指明cache的目錄),注意build_dircache_dir指向的均是container里的目錄材蹬,要想將container里的數(shù)據(jù)持久化实幕,需要用到volumes字段,這個(gè)字段的使用和docker volume的使用是類似的堤器,只需在config.toml[runner.docker]部分添加volumes = ["/cache", "<host_dir:container_dir>:rw"]即可實(shí)現(xiàn)container里/cache目錄數(shù)據(jù)的永久保存以及將host目錄掛載到相應(yīng)的container目錄并具有讀寫的功能昆庇。

  • Pull policies

    當(dāng)你使用dockerdocker+machine executors時(shí),你可以通過設(shè)置pull_policy來決定Runner如何pull docker image闸溃。pull_policy有三種值:
    always —— Runner始終從遠(yuǎn)程pull docker image整吆。
    if-not-present —— Runner會(huì)首先檢查本地是否有該image,如果有則用本地的辉川,如果沒有則從遠(yuǎn)程拉取表蝙。
    never —— Runner始終使用本地的image。

  • Helper image

    當(dāng)你使用docker, docker+machinekubernetes作為executor時(shí)员串,GitLab Runner將會(huì)使用特定的container來處理Git昼扛、artifacts 和cache 操作寸齐。通過在宿主機(jī)中鍵入以下命令:

    sudo docker images
    

    你會(huì)發(fā)現(xiàn)一些特殊的images,如:

    REPOSITORY                          TAG
    gitlab/gitlab-runner-helper     x86_64-3afdaba6
    gitlab/gitlab-runner-helper     x86_64-cf91d5e1
    

    當(dāng)然渺鹦,你也可以通過配置config.toml里的helper_image字段來讓Runner使用你自己定制化的helper image蛹含。

想要了解更多關(guān)于docker executor的信息,請?jiān)L問docker executor咽安。


常見問題

當(dāng)在Ubuntu18.04上使用docker executor runner時(shí),出現(xiàn)Runner無法連接網(wǎng)絡(luò)的問題

這個(gè)是Ubuntu18.04與Docker的問題,是關(guān)于宿主機(jī)與Container的DNS的映射問題,詳情可以訪問https://github.com/docker/libnetwork/issues/2187糕珊。
你的pipeline可能出現(xiàn)如下情況:

fatal: unable to access 'https://gitlab-ci-token:xxxxxxxxxxxxxxxxxxxx@code.siemens.com/zhen.xie/iavgitlabrunnertest.git/': Could not resolve host: code.siemens.com

該問題的解決辦法是在Runner的配置文件config.toml里增加dns = ["***.***.***.***"]动分,dns的值你可以通過在宿主機(jī)上運(yùn)行nmcli dev show來獲得。

Pipeline出現(xiàn)"JAVA_HOME is not set and no java command could be found in your PATH"

這個(gè)錯(cuò)誤通常出現(xiàn)在你使用Shell executor時(shí)红选,你可以在GitLab page上設(shè)置這個(gè)環(huán)境變量澜公,具體路徑是GitLab page -> Settings -> CI/CD -> Variables

如何配置GitLab Runner

請參考https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-global-section喇肋。

Runner間隔多久去GitLab上檢查是否有job

config.toml文件的check_interval字段會(huì)決定這個(gè)時(shí)間間隔玛瘸,它的默認(rèn)值是3秒(注意當(dāng)你把它設(shè)為0時(shí)依然采用的是默認(rèn)值3秒,而不是0秒)苟蹈。要解釋它的意義糊渊,首先我們先來定義worker,在config.toml文件中定義了很多runner慧脱,它們可能executor類型不同渺绒,可能注冊地址不同,但都是由GitLab Runner這個(gè)服務(wù)來管理的菱鸥,為了與GitLab Runner區(qū)分開宗兼,我們將config.toml文件中定義的runner稱為worker。對于不同的worker氮采,worker之間(如worker A ---> worker B)的間隔為check_interval / worker_nums殷绍,但是對于worker A本身來說它下次去檢查是否有job的時(shí)間間隔仍為check_interval。我們再舉個(gè)簡單例子:config.toml定義了3個(gè)worker—— worker A, worker B 和 worker C鹊漠,check_interval采用默認(rèn)值為3秒主到,第0秒時(shí)worker A會(huì)去檢查是否有屬于自己的job,第1秒時(shí)worker B會(huì)去檢查躯概,第2秒時(shí)worker C去檢查登钥,第3秒時(shí)worker A再檢查……這個(gè)過程中worker A到worker B的間隔為3 / 3 = 1秒,而對于worker A下次檢查job時(shí)的時(shí)間間隔為check_interval娶靡,即3秒牧牢。

官方文檔對check_interval的解釋:https://docs.gitlab.com/runner/configuration/advanced-configuration.html#how-check_interval-works

config.toml里的concurrent字段的意義

concurrent限制了整個(gè)GitLab Runner能并發(fā)處理job的數(shù)量姿锭。特別注意concurrentworker數(shù)量無任何關(guān)系塔鳍,所有worker的工作是受GitLab Runner控制的,如果concurrent值為1并且有一個(gè)worker已經(jīng)在工作了呻此,那么即使其他worker達(dá)到了可以工作的條件也只能“pending”轮纫。

cache存儲(chǔ)在哪里

請參考https://docs.gitlab.com/ee/ci/caching/#where-the-caches-are-stored

怎樣清除cache

注意cache是沒有過期時(shí)間的,而且每一次新的push觸發(fā)的pipeline趾诗,都會(huì)重新生成cache蜡感,重新生成的cache的名字為“<cache-key>-<num>”蹬蚁,其中num是隨著push數(shù)量遞增的。如果不去清除cache郑兴,cache會(huì)永久保留在Runner上犀斋,日積月累會(huì)填滿存儲(chǔ)空間的,因此最好隔一段時(shí)間進(jìn)行一次清除情连,清除方法請參考https://docs.gitlab.com/ee/ci/caching/#clearing-the-cache叽粹,或者使用clear_volumes.sh 這個(gè)簡單腳本來處理它, 清除cache的原理是將相關(guān)的volume移除,當(dāng)然却舀,docker也有自帶的清除命令虫几,推薦將docker system prune -f --volumes加入到定時(shí)任務(wù)中。

GitLab Runner 變量的優(yōu)先級

請參考https://docs.gitlab.com/ee/ci/variables/#priority-of-environment-variables

GitLab Runner有哪些預(yù)定義的變量

請參考https://docs.gitlab.com/ee/ci/variables/#predefined-variables-environment-variables

當(dāng)我的Runner采用docker作為executor時(shí)挽拔,無法build docker image

這是個(gè)“dind(docker in docker)” 問題辆脸,一般pipeline會(huì)報(bào)如下錯(cuò)誤:

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
time="2018-12-17T11:12:33Z" level=error msg="failed to dial gRPC: cannot connect to the Docker daemon. Is 'docker daemon' running on this host?: dial unix

你可以將本地的docker socket綁定到container里來解決這個(gè)問題,具體方法是將volumes = ["/var/run/docker.sock:/var/run/docker.sock"]配置到config.toml文件里螃诅。

想要了解更多關(guān)于“dind”的信息啡氢,請參考https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#use-docker-in-docker-executor

如何在job所對應(yīng)的container里使用git clone命令

如果你想在job運(yùn)行期間clone某些代碼(如shell或python的腳本)术裸,首先要確保你的宿主機(jī)有權(quán)限clone代碼倘是,然后你就可以將你的secret掛載到container里,例如袭艺,你是通過ssh的方式克隆代碼搀崭,并且你的ssh目錄為home/<user>/.ssh,你就可以在config.toml文件里添加如下配置:

volumes = ["/home/x1twbm/.ssh:/root/.ssh:ro"]

然后猾编,這個(gè)job所對應(yīng)的container就可以拉取指定代碼了瘤睹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市袍镀,隨后出現(xiàn)的幾起案子默蚌,更是在濱河造成了極大的恐慌冻晤,老刑警劉巖苇羡,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鼻弧,居然都是意外死亡设江,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門攘轩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叉存,“玉大人,你說我怎么就攤上這事度帮〖吣螅” “怎么了稿存?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瞳秽。 經(jīng)常有香客問我瓣履,道長,這世上最難降的妖魔是什么练俐? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任袖迎,我火速辦了婚禮,結(jié)果婚禮上腺晾,老公的妹妹穿的比我還像新娘燕锥。我一直安慰自己,他們只是感情好悯蝉,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布归形。 她就那樣靜靜地躺著,像睡著了一般鼻由。 火紅的嫁衣襯著肌膚如雪连霉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天嗡靡,我揣著相機(jī)與錄音跺撼,去河邊找鬼。 笑死讨彼,一個(gè)胖子當(dāng)著我的面吹牛歉井,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播哈误,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼哩至,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蜜自?” 一聲冷哼從身側(cè)響起菩貌,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎重荠,沒想到半個(gè)月后箭阶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡戈鲁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年仇参,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片婆殿。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诈乒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出婆芦,到底是詐尸還是另有隱情怕磨,我是刑警寧澤喂饥,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站肠鲫,受9級特大地震影響仰泻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜滩届,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一集侯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧帜消,春花似錦棠枉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至娄猫,卻和暖如春贱除,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背媳溺。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工月幌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人悬蔽。 一個(gè)月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓扯躺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蝎困。 傳聞我的和親對象是個(gè)殘疾皇子录语,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 一、持續(xù)集成(Continuous Integration) 要了解GitLab-CI與GitLab Runner...
    tsyeyuanfeng閱讀 97,877評論 18 134
  • 目錄持續(xù)集成&持續(xù)集成工具的介紹gitlab-ci runner的基本配置方法(mac版本) 持續(xù)集成 CI禾乘,Co...
    駱天涯閱讀 42,142評論 7 25
  • 這是阿里內(nèi)網(wǎng)的一篇文章澎埠,感有用,故轉(zhuǎn)載來了始藕,自己實(shí)際搭建了蒲稳,故記錄一下: 背景在日常工作中,我們往往會(huì)搭建基于je...
    新強(qiáng)吖閱讀 5,941評論 0 4
  • 捉奸記 《兩晉演義》第二回主說賈充家事鳄虱,第一部分是丑女配蠢兒弟塞,是為政治聯(lián)姻;第二部分則是幼女私佩幕賓拙已,乃敗家風(fēng)的奸...
    平凡的愛好閱讀 361評論 0 3
  • 還記得一起河邊柳枝編花環(huán) 還記得一起白雪地頭弄紅梅 不要嘆物是人非事事休 只想與你再戀一回 野菊花的花環(huán)是你送我的...
    香辣豌豆閱讀 530評論 0 1