一污尉、持續(xù)集成(Continuous Integration)
要了解GitLab-CI與GitLab Runner,我們得先了解持續(xù)集成是什么。
持續(xù)集成是一種軟件開發(fā)實(shí)踐昧廷,即團(tuán)隊(duì)開發(fā)成員經(jīng)常集成他們的工作,通常每個(gè)成員每天至少集成一次偎箫,也就意味著每天可能會(huì)發(fā)生多次集成木柬。每次集成都通過自動(dòng)化的構(gòu)建(包括編譯,發(fā)布淹办,自動(dòng)化測(cè)試)來驗(yàn)證眉枕,從而盡快地發(fā)現(xiàn)集成錯(cuò)誤。許多團(tuán)隊(duì)發(fā)現(xiàn)這個(gè)過程可以大大減少集成的問題,讓團(tuán)隊(duì)能夠更快的開發(fā)內(nèi)聚的軟件速挑。
看完這段話谤牡,估計(jì)還是有點(diǎn)懵。怎么理解呢姥宝?我是這樣理解的:
軟件集成是軟件開發(fā)過程中的一個(gè)環(huán)節(jié)翅萤,這個(gè)環(huán)節(jié)的工作一般會(huì)包括以下流程:合并代碼---->安裝依賴---->編譯---->測(cè)試---->發(fā)布。軟件集成的工作一般會(huì)比較細(xì)碎繁瑣腊满,為了不影響開發(fā)效率套么,以前軟件集成這個(gè)環(huán)節(jié)一般不會(huì)經(jīng)常進(jìn)行或者只會(huì)等到項(xiàng)目后期再進(jìn)行。但是有些問題糜烹,如果等到后期才發(fā)現(xiàn)违诗,解決問題的代價(jià)很大,有可能導(dǎo)致項(xiàng)目延期或者失敗疮蹦。因此诸迟,為了盡早發(fā)現(xiàn)軟件集成錯(cuò)誤,鼓勵(lì)團(tuán)隊(duì)成員應(yīng)該經(jīng)常集成他們的工作愕乎,通常每個(gè)成員每天應(yīng)該至少集成一次阵苇。這就是所說的持續(xù)集成。所以說感论,持續(xù)集成是一種軟件開發(fā)實(shí)踐绅项。
軟件集成的工作細(xì)碎繁瑣,以前是由人工完成的比肄。但是現(xiàn)在鼓勵(lì)持續(xù)集成快耿,那豈不是要累死人,還影響開發(fā)效率芳绩。所以掀亥,應(yīng)該考慮將軟件集成這個(gè)工作自動(dòng)化,這就出現(xiàn)了所謂的持續(xù)集成系統(tǒng)妥色。
持續(xù)集成詳情見百度百科-持續(xù)集成
二搪花、GitLab-CI
GitLab-CI就是一套配合GitLab使用的持續(xù)集成系統(tǒng)(當(dāng)然,還有其它的持續(xù)集成系統(tǒng)嘹害,同樣可以配合GitLab使用撮竿,比如Jenkins)。而且GitLab8.0以后的版本是默認(rèn)集成了GitLab-CI并且默認(rèn)啟用的笔呀。
三幢踏、GitLab-Runner
那GitLab-Runner又是什么東東呢?與GitLab-CI有什么關(guān)系呢凿可?
GitLab-Runner是配合GitLab-CI進(jìn)行使用的惑折。一般地授账,GitLab里面的每一個(gè)工程都會(huì)定義一個(gè)屬于這個(gè)工程的軟件集成腳本,用來自動(dòng)化地完成一些軟件集成工作惨驶。當(dāng)這個(gè)工程的倉(cāng)庫(kù)代碼發(fā)生變動(dòng)時(shí)白热,比如有人push了代碼,GitLab就會(huì)將這個(gè)變動(dòng)通知GitLab-CI粗卜。這時(shí)GitLab-CI會(huì)找出與這個(gè)工程相關(guān)聯(lián)的Runner屋确,并通知這些Runner把代碼更新到本地并執(zhí)行預(yù)定義好的執(zhí)行腳本。
所以续扔,GitLab-Runner就是一個(gè)用來執(zhí)行軟件集成腳本的東西攻臀。你可以想象一下:Runner就像一個(gè)個(gè)的工人,而GitLab-CI就是這些工人的一個(gè)管理中心纱昧,所有工人都要在GitLab-CI里面登記注冊(cè)刨啸,并且表明自己是為哪個(gè)工程服務(wù)的。當(dāng)相應(yīng)的工程發(fā)生變化時(shí)识脆,GitLab-CI就會(huì)通知相應(yīng)的工人執(zhí)行軟件集成腳本设联。如下圖所示:
Runner可以分布在不同的主機(jī)上,同一個(gè)主機(jī)上也可以有多個(gè)Runner灼捂。
Runner類型
GitLab-Runner可以分類兩種類型:Shared Runner(共享型)和Specific Runner(指定型)离例。
Shared Runner:這種Runner(工人)是所有工程都能夠用的。只有系統(tǒng)管理員能夠創(chuàng)建Shared Runner悉稠。
Specific Runner:這種Runner(工人)只能為指定的工程服務(wù)宫蛆。擁有該工程訪問權(quán)限的人都能夠?yàn)樵摴こ虅?chuàng)建Shared Runner。
四的猛、GitLab-Runner的安裝與使用
我的操作系統(tǒng)是:Centos 7.0 64位
安裝gitlab-ci-multi-runner
- 添加yum源
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash
- 安裝
yum install gitlab-ci-multi-runner
這里是官網(wǎng)的安裝教程耀盗,其它操作系統(tǒng)的請(qǐng)參考
https://gitlab.com/gitlab-org/gitlab-ci-multi-runner
使用gitlab-ci-multi-runner注冊(cè)Runner
安裝好gitlab-ci-multi-runner這個(gè)軟件之后,我們就可以用它向GitLab-CI注冊(cè)Runner了卦尊。
向GitLab-CI注冊(cè)一個(gè)Runner需要兩樣?xùn)|西:GitLab-CI的url和注冊(cè)token袍冷。
其中,token是為了確定你這個(gè)Runner是所有工程都能夠使用的Shared Runner還是具體某一個(gè)工程才能使用的Specific Runner猫牡。
如果要注冊(cè)Shared Runner,你需要到管理界面的Runners頁面里面去找注冊(cè)token邓线。如下圖所示:
如果要注冊(cè)Specific Runner淌友,你需要到項(xiàng)目的設(shè)置的Runner頁面里面去找注冊(cè)token。如下圖所示:
找到token之后骇陈,運(yùn)行下面這條命令注冊(cè)Runner(當(dāng)然震庭,除了url和token之外,還需要其他的信息你雌,比如執(zhí)行器executor
器联、構(gòu)建目錄builds_dir
等)二汛。
gitlab-ci-multi-runner register
注冊(cè)完成之后,GitLab-CI就會(huì)多出一條Runner記錄拨拓,如下圖所示:
GitLab-CI會(huì)為這個(gè)Runner生成一個(gè)唯一的token肴颊,以后Runner就通過這個(gè)token與GitLab-CI進(jìn)行通信。
那么渣磷,問題來了婿着。注冊(cè)好了的Runner的信息存放在哪兒了呢?
原來醋界,Runner的信息是存放在一個(gè)配置文件里面的竟宋,配置文件的格式一般是.toml
。這個(gè)配置文件的存放位置有以下幾種情況:
- 在類Unix操作系統(tǒng)下(0.5.0之后版本)
- 如果是以root用戶身份運(yùn)行
gitlab-ci-multi-runner register
形纺,那么配置文件默認(rèn)是/etc/gitlab-runner/config.toml
- 如果是以非root用戶身份運(yùn)行
gitlab-ci-multi-runner register
丘侠,那么配置文件默認(rèn)是~/.gitlab-runner/config.toml
- 在其他操作系統(tǒng)下以及0.5.0之前版本
配置文件默認(rèn)在當(dāng)前工作目錄下./config.toml
一般情況下,使用默認(rèn)的配置文件存放Runner的配置信息就可以了逐样。當(dāng)然蜗字,如果你有更細(xì)化的分類需求,你也可以在注冊(cè)的時(shí)候通過-c
或--config
選項(xiàng)指定配置文件的位置官研。具體查看register命令的使用方法:gitlab-ci-multi-runner register --help
狈定。
問題:如果不運(yùn)行gitlab-ci-multi-runner register
命令,直接在配置文件里面添加Runner的配置信息可以嗎剿干?
回答:當(dāng)然不可以狱掂。因?yàn)?code>gitlab-ci-multi-runner register的作用除了把Runner的信息保存到配置文件以外,還有一個(gè)很重要的作用始花,那就是向GitLab-CI發(fā)出請(qǐng)求妄讯,在GitLab-CI中登記這個(gè)Runner的信息并且獲取后續(xù)通信所需要的token。
讓注冊(cè)好的Runner運(yùn)行起來
Runner注冊(cè)完成之后還不行酷宵,還必須讓它運(yùn)行起來亥贸,否則它無法接收到GitLab-CI的通知并且執(zhí)行軟件集成腳本。怎么讓Runner運(yùn)行起來呢浇垦?gitlab-ci-multi-runner
提供了這樣一條命令gitlab-ci-multi-runner run-single
炕置,詳情如下:
[root@iZ25bjcxoq5Z ~]# gitlab-ci-multi-runner run-single --help
NAME:
run-single - start single runner
USAGE:
command run-single [command options] [arguments...]
OPTIONS:
--name, --description Runner name [$RUNNER_NAME]
--limit Maximum number of builds processed by this runner [$RUNNER_LIMIT]
--ouput-limit Maximum build trace size [$RUNNER_OUTPUT_LIMIT]
-u, --url Runner URL [$CI_SERVER_URL]
-t, --token Runner token [$CI_SERVER_TOKEN]
--tls-ca-file File containing the certificates to verify the peer when using HTTPS [$CI_SERVER_TLS_CA_FILE]
--executor Select executor, eg. shell, docker, etc. [$RUNNER_EXECUTOR]
--builds-dir Directory where builds are stored [$RUNNER_BUILDS_DIR]
--cache-dir Directory where build cache is stored [$RUNNER_CACHE_DIR]
--env Custom environment variables injected to build environment [$RUNNER_ENV]
--shell Select bash, cmd or powershell [$RUNNER_SHELL]
--ssh-user User name [$SSH_USER]
--ssh-password User password [$SSH_PASSWORD]
--ssh-host Remote host [$SSH_HOST]
--ssh-port Remote host port [$SSH_PORT]
--ssh-identity-file Identity file to be used [$SSH_IDENTITY_FILE]
--docker-host Docker daemon address [$DOCKER_HOST]
--docker-cert-path Certificate path [$DOCKER_CERT_PATH]
--docker-tlsverify Use TLS and verify the remote [$DOCKER_TLS_VERIFY]
--docker-hostname Custom container hostname [$DOCKER_HOSTNAME]
--docker-image Docker image to be used [$DOCKER_IMAGE]
--docker-privileged Give extended privileges to container [$DOCKER_PRIVILEGED]
--docker-disable-cache Disable all container caching [$DOCKER_DISABLE_CACHE]
--docker-volumes Bind mount a volumes [$DOCKER_VOLUMES]
--docker-cache-dir Directory where to store caches [$DOCKER_CACHE_DIR]
--docker-extra-hosts Add a custom host-to-IP mapping [$DOCKER_EXTRA_HOSTS]
--docker-links Add link to another container [$DOCKER_LINKS]
--docker-services Add service that is started with container [$DOCKER_SERVICES]
--docker-wait-for-services-timeout How long to wait for service startup [$DOCKER_WAIT_FOR_SERVICES_TIMEOUT]
--docker-allowed-images Whitelist allowed images [$DOCKER_ALLOWED_IMAGES]
--docker-allowed-services Whitelist allowed services [$DOCKER_ALLOWED_SERVICES]
--docker-image-ttl [$DOCKER_IMAGE_TTL]
--parallels-base-name VM name to be used [$PARALLELS_BASE_NAME]
--parallels-template-name VM template to be created [$PARALLELS_TEMPLATE_NAME]
--parallels-disable-snapshots Disable snapshoting to speedup VM creation [$PARALLELS_DISABLE_SNAPSHOTS]
--virtualbox-base-name VM name to be used [$VIRTUALBOX_BASE_NAME]
--virtualbox-disable-snapshots Disable snapshoting to speedup VM creation [$VIRTUALBOX_DISABLE_SNAPSHOTS]
要讓一個(gè)Runner運(yùn)行起來,--url
男韧、--token
和--executor
選項(xiàng)是必要的朴摊。其他選項(xiàng)可根據(jù)具體情況和需求進(jìn)行設(shè)置。我們可以看出來此虑,這個(gè)命令里面的選項(xiàng)跟配置文件中Runner的配置項(xiàng)基本上是一樣的甚纲。那這個(gè)命令的運(yùn)行和配置文件有沒有什么關(guān)系呢?從我的試驗(yàn)和思考來看朦前,應(yīng)該是沒有什么關(guān)系的介杆。因?yàn)椋?/p>
- 這個(gè)命令里面并沒有指定配置文件位置的選項(xiàng)鹃操,如果讀取配置文件難道去讀取默認(rèn)位置嗎?但是配置文件的位置是可以指定的春哨,不一定在默認(rèn)位置荆隘,這不符合邏輯,所以它應(yīng)該不會(huì)去讀配置文件悲靴。
- 我刪掉配置文件臭胜,這個(gè)命令依然能夠運(yùn)行
所以,這個(gè)命令應(yīng)該只是一個(gè)能讓Runner運(yùn)行起來的基礎(chǔ)命令癞尚。但這個(gè)命令運(yùn)行起來的前提是耸三,GitLab-CI中必須事先注冊(cè)有這個(gè)Runner。
那配置文件有毛用浇揩?配置文件的作用在后面仪壮,但是從這里我們知道一點(diǎn):配置文件里面有Runner運(yùn)行時(shí)所需要的信息。
可能你還有一個(gè)問題:我用root的用戶注冊(cè)Runner時(shí)胳徽,注冊(cè)完Runner就可以用了积锅,并沒有手動(dòng)地去運(yùn)行Runner啊养盗?這個(gè)后面講缚陷。
批量地運(yùn)行Runner
正常情況下,如果我有多個(gè)Runner往核,我并不想手動(dòng)一個(gè)個(gè)地運(yùn)行箫爷,要是能一次運(yùn)行多個(gè)Runner多爽啊聂儒!嗯哼虎锚,gitlab-ci-multi-runner
就提供了這樣一個(gè)命令gitlab-ci-multi-runner run
,詳情如下:
[root@iZ25bjcxoq5Z gitlab-runner]# gitlab-ci-multi-runner run --help
NAME:
run - run multi runner service
USAGE:
command run [command options] [arguments...]
OPTIONS:
-c, --config "/etc/gitlab-runner/config.toml" Config file [$CONFIG_FILE]
-n, --service "gitlab-runner" Use different names for different services
-d, --working-directory Specify custom working directory
-u, --user Use specific user to execute shell scripts
--syslog Log to syslog
這個(gè)命令總共有5個(gè)選項(xiàng)衩婚,讓我們從選項(xiàng)來理解一下這個(gè)命令:
-
-c, --config
選項(xiàng)
這個(gè)選項(xiàng)是用來指定配置文件路徑的窜护。如果你想同時(shí)運(yùn)行多個(gè)Runner,你必須得知道你要運(yùn)行哪些Runner以及這些Runner運(yùn)行時(shí)所需要的信息非春。而前面我們說過柱徙,配置文件里面就存放著Runner運(yùn)行時(shí)所需要的信息。而且一個(gè)配置文件是可以存放多個(gè)Runner的信息的奇昙。如果不指定這個(gè)選項(xiàng)坐搔,就會(huì)使用默認(rèn)的配置文件。 -
-n, --service
選項(xiàng)
這個(gè)選項(xiàng)是用來指定服務(wù)的別名的敬矩。為什么要有這個(gè)選項(xiàng)呢?指定別名有什么意義呢蠢挡?我們從上一個(gè)選項(xiàng)可以看出來弧岳,一次只能運(yùn)行一批Runner凳忙,因?yàn)橐淮沃荒苤付ㄒ粋€(gè)配置文件。那如果我有多個(gè)配置文件禽炬,我要運(yùn)行多批Runner涧卵,那是不是給每一次批量運(yùn)行服務(wù)取不同的別名來區(qū)分更好一點(diǎn)呢。 -
-d, --working-directory
選項(xiàng)
這個(gè)選項(xiàng)是用來指定此次批量運(yùn)行服務(wù)的工作目錄的腹尖。如果自己沒有指定builds_dir
的話柳恐,此次運(yùn)行起來的Runner會(huì)把builds_dir
放到這個(gè)目錄里面。 -
-u, --user
選項(xiàng)
這個(gè)選項(xiàng)很重要热幔,它指定了該以什么用戶權(quán)限來運(yùn)行Runner乐设。為了安全,我認(rèn)為不應(yīng)該給運(yùn)行Runner的用戶過高的權(quán)限绎巨,更不應(yīng)該以root用戶來運(yùn)行Runner近尚。 -
--syslog
選項(xiàng)
如果指定了這個(gè)選項(xiàng),則把日志記錄到系統(tǒng)日志场勤。
使用服務(wù)
能夠批量地運(yùn)行Runner已經(jīng)很好了戈锻,但是還不夠好,為什么呢和媳?
首先格遭,gitlab-ci-multi-runner run
默認(rèn)是前臺(tái)運(yùn)行的,使用體驗(yàn)不好留瞳;
其次拒迅,當(dāng)gitlab-ci-multi-runner run
在后臺(tái)運(yùn)行的時(shí)候,要查看其運(yùn)行狀態(tài)不方便撼港,而且也沒有提供停止gitlab-ci-multi-runner run
的命令坪它。
所以,要是能將批量運(yùn)行Runner這個(gè)功能安裝為一項(xiàng)服務(wù)帝牡,就更爽了往毡!
gitlab-ci-multi-runner
確實(shí)就提供了這樣的功能。
install
靶溜、uninstall
开瞭、start
、stop
罩息、restart
嗤详、status
這6個(gè)命令就是和服務(wù)相關(guān)的。
我一開始對(duì)gitlab-ci-multi-runner
的服務(wù)概念感覺比較懵瓷炮,讓我們來看看安裝服務(wù)install
這個(gè)命令到底干了一件什么事情葱色。
[root@iZ25bjcxoq5Z ~]# gitlab-ci-multi-runner install --help
NAME:
install - install service
USAGE:
command install [command options] [arguments...]
OPTIONS:
--service, -n "gitlab-runner" Specify service name to use
--working-directory, -d "/root" Specify custom root directory where all data are stored
--config, -c "/etc/gitlab-runner/config.toml" Specify custom config file
--user, -u Specify user-name to secure the runner
從選項(xiàng)可以看出,一項(xiàng)服務(wù)的信息有4個(gè):服務(wù)名娘香、工作目錄苍狰、配置文件和用戶办龄。這個(gè)命令的選項(xiàng)和gitlab-ci-multi-runner run
的選項(xiàng)基本一樣×苷眩可見俐填,批量運(yùn)行Runner和服務(wù)之間的關(guān)系曖昧。至于是什么關(guān)系翔忽,往下看gitlab-ci-multi-runner start
這個(gè)命令英融。
[root@iZ25bjcxoq5Z ~]# gitlab-ci-multi-runner start --help
NAME:
start - start service
USAGE:
command start [command options] [arguments...]
OPTIONS:
--service, -n "gitlab-runner" Specify service name to use
啟動(dòng)一項(xiàng)服務(wù),只要指定服務(wù)的名稱就行了(默認(rèn)服務(wù)名稱是gitlab-runner)歇式。啟動(dòng)服務(wù)后驶悟,運(yùn)行命令ps -aux | grep gitlab-runner
查看后臺(tái)程序,發(fā)現(xiàn)啟動(dòng)服務(wù)其實(shí)就是在后臺(tái)執(zhí)行了一個(gè)批量運(yùn)行Runner的任務(wù)贬丛,所以服務(wù)安裝命令的選項(xiàng)才會(huì)和批量運(yùn)行Runner命令的選項(xiàng)基本一樣撩银。
root 18219 0.0 0.1 331872 5332 ? Ssl 00:06 0:00 /usr/bin/gitlab-ci-multi-runner run --working-directory /home/gitlab-runner --config /etc/gitlab-runner/config.toml --service gitlab-runner --user gitlab-runner --syslog
還有stop
命令用于停止服務(wù),restart
命令用于重啟服務(wù)豺憔,status
用于查看服務(wù)狀態(tài)额获。這三個(gè)命令的使用方法和start
類似,就不一一介紹了恭应。
五抄邀、其他一些思考
什么情況下需要注冊(cè)Shared Runner?
比如昼榛,GitLab上面所有的工程都有可能需要在公司的服務(wù)器上進(jìn)行編譯境肾、測(cè)試、部署等工作胆屿,這個(gè)時(shí)候注冊(cè)一個(gè)Shared Runner供所有工程使用就很合適奥喻。什么情況下需要注冊(cè)Specific Runner?
比如非迹,我可能需要在我個(gè)人的電腦或者服務(wù)器上自動(dòng)構(gòu)建我參與的某個(gè)工程环鲤,這個(gè)時(shí)候注冊(cè)一個(gè)Specific Runner就很合適。什么情況下需要在同一臺(tái)機(jī)器上注冊(cè)多個(gè)Runner憎兽?
比如冷离,我是GitLab的普通用戶,沒有管理員權(quán)限纯命,我同時(shí)參與多個(gè)項(xiàng)目西剥,那我就需要為我的所有項(xiàng)目都注冊(cè)一個(gè)Specific Runner,這個(gè)時(shí)候就需要在同一臺(tái)機(jī)器上注冊(cè)多個(gè)Runner亿汞。
六瞭空、最后
啰啰嗦嗦寫了一堆,大體上也算把自己對(duì)GitLab-Runner的理解過程寫清楚了。為了把GitLab-Runner的用法了解清楚匙铡,自己做了很多的測(cè)試图甜,但也難全面,中間有一些內(nèi)容也只是個(gè)人理解鳖眼,未必準(zhǔn)確,歡迎批評(píng)指正嚼摩。