前言
本文操作目標(biāo):搭建GitLab以及使用GitLab的CI Runner服務(wù)愁憔,對(duì)項(xiàng)目進(jìn)行測(cè)試粘招。
操作過一次稿存,才知道并非想像中的那么復(fù)雜而涉,也沒有像想中的那么簡(jiǎn)單著瓶。
在搭建自己的 CI Runner 之前,需要先明確一些概念:
Continuous Integration(持續(xù)集成)
CI 的全稱是 Continuous Integration (持續(xù)集成)啼县,是 extreme programming (極限編程) 的一部分材原。我們常用 CI 來做一些自動(dòng)化工作,這種自動(dòng)化工作會(huì)運(yùn)行在一臺(tái)集中的機(jī)器上季眷,比如程序的打包余蟹,單元測(cè)試,部署等瘟裸。這種構(gòu)建方式避免了了打包環(huán)境差異引動(dòng)的錯(cuò)誤客叉,并且通過 Gitlab 的 hook, 在代碼提交的各個(gè)環(huán)節(jié)自動(dòng)地完成一系列的構(gòu)建工作。
持續(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)聚的軟件送挑。
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助析。
準(zhǔn)備工作:
Centos7機(jī)器,2臺(tái)椅您。 一臺(tái)安裝GitLab和Runner外冀,一臺(tái)用來充當(dāng)Runner的操作機(jī)。
Docker安裝
GitLab功能十在是太豐富掀泳,安裝的服務(wù)太多雪隧。服務(wù)器資源緊缺,所以一臺(tái)服務(wù)器上用Docker來做安裝測(cè)試嘍员舵。
Docker的安裝及基礎(chǔ)使用脑沿,本章不做闡述。
GitLab安裝
從Gitblit轉(zhuǎn)移至GitLab马僻,發(fā)現(xiàn)其復(fù)雜度真不是一個(gè)數(shù)量級(jí)的庄拇。如果不需要在源碼上做很多服務(wù),還是Gitblit用的隨心巫玻。
使用Docker安裝GitLab丛忆,找了一個(gè)9.x的中文版
$ docker pull docker.io/twang2218/gitlab-ce-zh
$ docker images
docker.io/twang2218/gitlab-ce-zh latest b8165a7e3d68 3 months ago 1.39 GB
$ docker run --detach \
--hostname 192.168.1.8 \
--publish 8082:8082 --name gitlab9 \
--restart always \
--volume /home/gitlab:/var/opt/gitlab/git-data \
docker.io/twang2218/gitlab-ce-zh
$ docker ps
這里有一點(diǎn)要說明祠汇,端口映射,寫的是8082到8082熄诡,就是說訪問物理主機(jī)(192.168.1.8)的8082端口可很,相當(dāng)于訪問docker主機(jī)的8082端口。
但是GitLab默認(rèn)的服務(wù)端口是80凰浮,要下入docker主機(jī)我抠,改一下配置。
# 進(jìn)入docker主機(jī)的ssh
$ docker exec -it gitlab9 /bin/bash
# 修改 /etc/gitlab/gitlab.rb
bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
root@192:/# vim /etc/gitlab/gitlab.rb
#修改項(xiàng)目
external_url 'http://192.168.1.8:8082'
應(yīng)用配置更新
gitlab-ctl reconfigure
雷點(diǎn):直接重啟GitLab服務(wù)袜茧,配置是不會(huì)更新的
此時(shí)菜拓,訪問 http://192.168.1.8:8082,基本是OK的了笛厦。更新密碼纳鼎,創(chuàng)建項(xiàng)目之流,請(qǐng)君細(xì)測(cè)裳凸。
.gitlab-ci.yml
資料顯示贱鄙,GitLab8之后的版本,默認(rèn)集成姨谷,并啟用了GitLabCI逗宁,所以無需額外的任何配置。還是親兒子營(yíng)養(yǎng)多梦湘。
唯一的要求瞎颗,就是你的項(xiàng)目代碼里,必須有一個(gè)叫.gitlab-ci.yml
的文件捌议。使用GitLab管理后臺(tái)哼拔,可以添加文件,添加時(shí)可以選擇對(duì)應(yīng)的模板文件禁灼,還是很貼心的管挟。有如下圖示:
文件大概的內(nèi)容,就是一堆任務(wù)弄捕,包構(gòu)建命令(能夠把項(xiàng)目需要的環(huán)境構(gòu)建出來僻孝,以便運(yùn)行測(cè)試)測(cè)試命令,及其它你想執(zhí)行的命令守谓。
這里直接使用Laravel模板穿铆。然后需要針對(duì)自己的系統(tǒng),對(duì)腳本微調(diào):
- apt-get替換成yum斋荞。因?yàn)槲业哪繕?biāo)機(jī)是centos7
- 刪除docker相關(guān)的內(nèi)容荞雏。因?yàn)槲业哪繕?biāo)操作機(jī)沒有安裝docker,是一個(gè)臺(tái)空白機(jī)
- 將 https 替換成 http
- 增加tags laravel,(很重要)增加完如下
test:
# 下兩行 很重要
tags:
- laravel
script:
# 進(jìn)入后臺(tái)項(xiàng)目目錄
- cd backend
# run laravel tests
- php vendor/bin/phpunit --coverage-text --colors=never
腳本的任何錯(cuò)誤凤优,將造成任務(wù)運(yùn)行失敗
GitLab管理端悦陋,也可以看到此文件的語法檢查
CI Runner 安裝 注冊(cè)
先說一下大致流程:
1,安裝runner
2筑辨,runner注冊(cè)到 GitLab
3俺驶,當(dāng)代碼提交后,GitLab根據(jù) .yml的配置棍辕,通知runner暮现,起來,干活啦
4楚昭,runner收到任務(wù)栖袋,開始執(zhí)行作業(yè)
5,GitLab接收并顯示 runner 的運(yùn)行結(jié)果
CI Runner的安裝抚太,依然使用Docker的方式
無腦執(zhí)行
$ docker pull gitlab/gitlab-runner:latest
$ docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
下面開始實(shí)施注冊(cè)
1塘幅,首先需要在GitLab的后臺(tái),找到接收runner注冊(cè)的頁(yè)面凭舶,如下圖指引:
簡(jiǎn)單一點(diǎn)晌块,我們搞一個(gè)特定的Runners,頁(yè)面內(nèi)會(huì)提供注冊(cè)需要的url和密鑰
2帅霜,執(zhí)行注冊(cè)命令
需要進(jìn)入運(yùn)行runner的docker主機(jī),執(zhí)行相關(guān)命令呼伸,過程如下:
# 進(jìn)入docker主機(jī)的shell
$ docker exec -it gitlab-runner /bin/bash
# 注冊(cè)命令
root@94652dec6e02:/# gitlab-ci-multi-runner register
Running in system-mode.
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://192.168.1.8:8082/
Please enter the gitlab-ci token for this runner:
zQRBTAAmh1Zc9BxU6G61
Please enter the gitlab-ci description for this runner:
[94652dec6e02]: just for test
Please enter the gitlab-ci tags for this runner (comma separated):
laravel
Whether to run untagged builds [true/false]:
[false]:
Whether to lock the Runner to current project [true/false]:
[true]:
Registering runner... succeeded runner=zQRBTAAm
Please enter the executor: docker-ssh+machine, kubernetes, docker, docker-ssh, shell, ssh, parallels, virtualbox, docker+machine:
ssh
Please enter the SSH server address (e.g. my.server.com):
192.168.1.4
Please enter the SSH server port (e.g. 22):
Please enter the SSH user (e.g. root):
xx
Please enter the SSH password (e.g. docker.io):
xx
Please enter path to SSH identity file (e.g. /home/user/.ssh/id_rsa):
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
其中的 tags 非常重要身冀。 要和 .yml文件中的tags一致,否則會(huì)出來諸如“未找到有效的Runner”等錯(cuò)誤提示括享,使流水線作業(yè)擱置
可以檢查本地注冊(cè)情況
# gitlab-runner list
Listing configured runners ConfigFile=/etc/gitlab-runner/config.toml
first test Executor=ssh Token=e23c4a3320a90c3e81074de0f87fdc URL=http://192.168.1.8:8082/
just for test Executor=ssh Token=7ff71f37a5c9b108dbcb2234b574f2 URL=http://192.168.1.8:8082/
然后不要忘記搂根,要啟動(dòng)runner服務(wù)
# gitlab-runner start
這里我選擇了
ssh
的方式。此方式相當(dāng)于給runner找一個(gè)『肉機(jī)』去跑項(xiàng)目的集成測(cè)試代碼铃辖。其它方式待研究
同時(shí)剩愧,注冊(cè)成功之后,GitLab管理后臺(tái)娇斩,也可以看到注冊(cè)信息
測(cè)試
文行致此仁卷,已萬事俱備
push你的代碼至版本庫(kù),GitLabCI即開始工作犬第,如果你想看到綠色的成功圖標(biāo)锦积,根據(jù)提示一步一步調(diào)試你的 .yml腳本吧
文章寫的比較倉(cāng)促,主要用以記錄一次CI之旅歉嗓。如有運(yùn)行不通丰介,請(qǐng)與交流
比持續(xù)集成更重要的,是你首先要在你的項(xiàng)目里寫好各類測(cè)試,提高測(cè)試的覆蓋率哮幢,寫好從源碼到可運(yùn)行測(cè)試的構(gòu)建腳本带膀,然后再尋求可自動(dòng)化的方法
更新
本機(jī):Ubuntu16.04
本機(jī)通過 Shell 運(yùn)行:/opt/ ? ./gitlab-runner-linux-amd64 run
runner register 信息:executor docker
關(guān)鍵信息:使用本機(jī)的 docker 服務(wù),運(yùn)行 [runner executor doctor]
配置如下圖:cat ~/.gitlab-runner/config.toml
參考:https://www.cnblogs.com/xxred/p/11548254.html
再次強(qiáng)調(diào):編寫可測(cè)試代碼
參考博文
使用Gitlab-Runner Docker 構(gòu)建 node 項(xiàng)目
Docker搭建自己的Gitlab CI Runner
使用docker運(yùn)行g(shù)itlab服務(wù)
GitLab-CI 從安裝到差點(diǎn)放棄