因?yàn)轫?xiàng)目中有多個project,所以搭建了一個gitlab server. gitlab除了git的功能之外,還額外提供了CI和DI的功能柬祠。因?yàn)轫?xiàng)目目前沒有做集成測試和靜態(tài)檢查庶溶,所以CI基本用不到坤候。但是可以用DI來將項(xiàng)目文件打包成docker和vm image. 便于后續(xù)部署吨拗。
添加 gitlab runner
runner其實(shí)就是一個工作機(jī)器箕慧,gitlab的任務(wù)不是在gitlab server上完成的检柬,而是在一些runner上面來執(zhí)行的献联。所以第一步要添加runner.
install runner
官網(wǎng)有詳細(xì)的安裝步驟,鏈接如下:
https://docs.gitlab.com/runner/install/linux-repository.html
需要執(zhí)行如下命令厕吉,以ubuntu為例子:
# For Debian/Ubuntu/Mint
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
sudo apt-get install gitlab-runner
configure runner
根據(jù)gitlab的定義酱固,runner分為special和shared. 定義如下:
Shared Runners are useful for jobs that have similar requirements,
between multiple projects. Rather than having multiple Runners idling for
many projects, you can have a single or a small number of Runners that handle
multiple projects. This makes it easier to maintain and update Runners.
Specific Runners are useful for jobs that have special requirements or for
projects with a specific demand. If a job has certain requirements, you can set
up the specific Runner with this in mind, while not having to do this for all
Runners. For example, if you want to deploy a certain project, you can setup
a specific Runner to have the right credentials for this.
這里創(chuàng)建一個shared runner.
- 通過root賬號登錄gitlab,然后找到admin/runners頁面头朱。
- 找到這個頁面的一個token
- 在runner machine上執(zhí)行如下命令:
root@worker:/home/zhbo# gitlab-ci-multi-runner register
Running in system-mode.
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://172.30.42.156
Please enter the gitlab-ci token for this runner:
a8hH15vcz_ssa4FX8t-r
Please enter the gitlab-ci description for this runner:
[worker]:
Please enter the gitlab-ci tags for this runner (comma separated):
package
Whether to run untagged builds [true/false]:
[false]:
Whether to lock the Runner to current project [true/false]:
[true]: false
Registering runner... succeeded runner=a8hH15vc
Please enter the executor: ssh, docker+machine, docker, docker-ssh, parallels, shell, virtualbox, docker-ssh+machine, kubernetes:
ssh, docker+machine, docker, docker-ssh, parallels, shell, virtualbox, docker-ssh+machine, kubernetes
ERROR: Invalid executor specified
Please enter the executor: ssh, docker+machine, docker, docker-ssh, parallels, shell, virtualbox, docker-ssh+machine, kubernetes:
[ssh, docker+machine, docker, docker-ssh, parallels, shell, virtualbox, docker-ssh+machine, kubernetes]:
ERROR: Invalid executor specified
Please enter the executor: docker, docker-ssh, parallels, shell, virtualbox, docker-ssh+machine, kubernetes, ssh, docker+machine:
[ssh, docker+machine, docker, docker-ssh, parallels, shell, virtualbox, docker-ssh+machine, kubernetes]: shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
執(zhí)行完之后运悲,刷新admin/runners就可以看到新建的runner了。
配置job
上面已經(jīng)安裝好一個可用的runner项钮,接下來是配置在runner上執(zhí)行的job.
編寫.gitlab-ci.yml
gitlab提供了一個很方便的配置工具班眯,就是.gitlab-ci.yml, 將該文件放入到project的根目錄下即可烁巫。gitlab server上有詳細(xì)的文檔說明署隘,位置如下:
http://gitlab-server-ip/help/ci/yaml/README.md
以fcsslib項(xiàng)目為例,要配置一個生成docker鏡像的job亚隙, 每次對project打tag的時(shí)候就會觸發(fā)job執(zhí)行磁餐,生成一個fcsslib的鏡像,鏡像的version是tag的name. .gitlab-ci.yml的內(nèi)容如下:
after_script:
- docker rmi $( docker images -q -f dangling=true)
stages:
- build
package:
stage: build
script:
- mkdir docker/src
- cp -a app config.py manage.py docker/src/
- cd docker
- docker build -t fcss/taskmgr:$CI_COMMIT_REF_NAME .
only:
- tags
- triggers
tags:
- package
其中Dockerfile的文件組織關(guān)系可以根據(jù)實(shí)際情況進(jìn)行調(diào)整。only 規(guī)定了只有g(shù)it tags操作和triggers才能觸發(fā)任務(wù)诊霹,triggers可以在gitlab的project->settings->CI/DI Pipelines下添加羞延,添加之后會生成一個token,使用這個token就可以隨時(shí)觸發(fā)一次job了脾还,在測試的時(shí)候非常有用伴箩。 tags 用來篩選符合條件的runners。
默認(rèn)的script運(yùn)行的位置是project的根目錄鄙漏,runner會先將整個project取下來嗤谚,然后在project根目錄下運(yùn)行job.
更多.gitlab-ci.yml文件的用法可以參考上面說的配置文檔。
配置權(quán)限
在runner上運(yùn)行任務(wù)的時(shí)候使用的是gitlab-runner賬戶怔蚌,該賬戶沒有root權(quán)限巩步,如果想使用更高的權(quán)限可以對gitlab-runner賬戶進(jìn)行提權(quán)。
這里因?yàn)橹挥衐ocker命令需要更高的權(quán)限桦踊,可以使用創(chuàng)建docker用戶組的方式解決渗钉。在runner上使用root賬戶執(zhí)行如下命令:
usermod -aG docker gitlab-runner
然后就可以執(zhí)行docker命令打包了。
docker文件的編寫
可以參考docker官方網(wǎng)站的實(shí)現(xiàn)钞钙。生成的docker鏡像也可以根據(jù)需要上傳到本地倉庫便于后續(xù)部署。這些操作都可以在job中執(zhí)行声离,此處不再做過多說明芒炼。
job的觸發(fā)
按照上面的.gitlab-ci.yml文件中指定的規(guī)則,有兩種方法可以觸發(fā)job的執(zhí)行术徊。
triggers
可以執(zhí)行如下命令:
http://:gitlab-server/api/v4/projects/:project_id/ref/REF_NAME/trigger/pipeline?token=TOKEN
git tags
可以對當(dāng)前項(xiàng)目打標(biāo)簽來觸發(fā)job的執(zhí)行本刽。git tag的常見命令如下:
列出標(biāo)簽
$ git tag # 在控制臺打印出當(dāng)前倉庫的所有標(biāo)簽
$ git tag -l 'v0.1.\*'
打標(biāo)簽
git標(biāo)簽分為兩種類型:輕量標(biāo)簽和附注標(biāo)簽。輕量標(biāo)簽是指向提交對象的引用赠涮,附注標(biāo)簽則是倉庫中的一個獨(dú)立對象子寓。建議使用附注標(biāo)簽。
創(chuàng)建輕量標(biāo)簽
$ git tag v0.1.2-light
創(chuàng)建附注標(biāo)簽
$ git tag -a v0.1.2 -m “0.1.2版本”
創(chuàng)建輕量標(biāo)簽不需要傳遞參數(shù)笋除,直接指定標(biāo)簽名稱即可斜友。
創(chuàng)建附注標(biāo)簽時(shí),參數(shù)a即annotated的縮寫垃它,指定標(biāo)簽類型鲜屏,后附標(biāo)簽名。參數(shù)m指定標(biāo)簽說明国拇,說明信息會保存在標(biāo)簽對象中洛史。
切換到標(biāo)簽
與切換分支命令相同,用git checkout [tagname]
查看標(biāo)簽信息
用git show命令可以查看標(biāo)簽的版本信息:
$ git show v0.1.2
刪除標(biāo)簽
誤打或需要修改標(biāo)簽時(shí)酱吝,需要先將標(biāo)簽刪除也殖,再打新標(biāo)簽。
$ git tag -d v0.1.2 # 刪除標(biāo)簽
參數(shù)d即delete的縮寫务热,意為刪除其后指定的標(biāo)簽忆嗜。
給指定的commit打標(biāo)簽
打標(biāo)簽不必要在head之上己儒,也可在之前的版本上打,這需要你知道某個提交對象的校驗(yàn)和(通過git log獲撒帧)址愿。
補(bǔ)打標(biāo)簽
$ git tag -a v0.1.1 9fbc3d0
標(biāo)簽發(fā)布
通常的git push不會將標(biāo)簽對象提交到git服務(wù)器,我們需要進(jìn)行顯式的操作:
$ git push origin v0.1.2 # 將v0.1.2標(biāo)簽提交到git服務(wù)器
$ git push origin –tags # 將本地所有標(biāo)簽一次性提交到git服務(wù)器
注意:如果想看之前某個標(biāo)簽狀態(tài)下的文件冻璃,可以這樣操作
- git tag 查看當(dāng)前分支下的標(biāo)簽
- git checkout v0.21 此時(shí)會指向打v0.21標(biāo)簽時(shí)的代碼狀態(tài)响谓,(但現(xiàn)在處于一個空的分支上)
- cat test.txt 查看某個文件