安裝GitLab Runner
本教程的安裝環(huán)境為Ubuntu18.04。
- 運(yùn)行以下命令增加GitLab官方倉庫:
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
-
安裝最新版本的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
注冊
- 運(yùn)行如下命令:
sudo gitlab-runner register
- 輸入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)入這些頁面篡腌。
- 輸入你的注冊token:
Please enter the gitlab-ci token for this runner
xxx
在步驟2中你也可以同時(shí)看到 token信息
- 輸入對這個(gè)Runner的表述(同時(shí)也是這個(gè)Runner的名字),當(dāng)然勾效,你也可以稍后在GitLab page上修改它:
Please enter the gitlab-ci description for this runner
[hostame] my-runner
- 輸入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萌腿。
- 輸入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ù)
- 將GitLab Runner安裝為系統(tǒng)服務(wù):
sudo gitlab-runner install -n "<service-name>" -u <user-name>
- 啟動(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é)束后立即銷毀商膊。
-
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_dir
和cache_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目錄并具有讀寫的功能昆庇。 -
當(dāng)你使用
docker
或docker+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。 -
當(dāng)你使用
docker
,docker+machine
或kubernetes
作為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ù)量姿锭。特別注意concurrent
與worker數(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就可以拉取指定代碼了瘤睹。