因為項目中有多個project,所以搭建了一個gitlab server. gitlab除了git的功能之外,還額外提供了CI和DI的功能。因為項目目前沒有做集成測試和靜態檢查,所以CI基本用不到。但是可以用DI來將項目文件打包成docker和vm image. 便于后續部署。
添加 gitlab runner
runner其實就是一個工作機器,gitlab的任務不是在gitlab server上完成的,而是在一些runner上面來執行的。所以第一步要添加runner.
install runner
官網有詳細的安裝步驟,鏈接如下:
https://docs.gitlab.com/runner/install/linux-repository.html
需要執行如下命令,以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
根據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.
這里創建一個shared runner.
- 通過root賬號登錄gitlab,然后找到admin/runners頁面。
- 找到這個頁面的一個token
- 在runner machine上執行如下命令:
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!
執行完之后,刷新admin/runners就可以看到新建的runner了。
配置job
上面已經安裝好一個可用的runner,接下來是配置在runner上執行的job.
編寫.gitlab-ci.yml
gitlab提供了一個很方便的配置工具,就是.gitlab-ci.yml, 將該文件放入到project的根目錄下即可。gitlab server上有詳細的文檔說明,位置如下:
http://gitlab-server-ip/help/ci/yaml/README.md
以fcsslib項目為例,要配置一個生成docker鏡像的job, 每次對project打tag的時候就會觸發job執行,生成一個fcsslib的鏡像,鏡像的version是tag的name. .gitlab-ci.yml的內容如下:
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的文件組織關系可以根據實際情況進行調整。only 規定了只有git tags操作和triggers才能觸發任務,triggers可以在gitlab的project->settings->CI/DI Pipelines下添加,添加之后會生成一個token,使用這個token就可以隨時觸發一次job了,在測試的時候非常有用。 tags 用來篩選符合條件的runners。
默認的script運行的位置是project的根目錄,runner會先將整個project取下來,然后在project根目錄下運行job.
更多.gitlab-ci.yml文件的用法可以參考上面說的配置文檔。
配置權限
在runner上運行任務的時候使用的是gitlab-runner賬戶,該賬戶沒有root權限,如果想使用更高的權限可以對gitlab-runner賬戶進行提權。
這里因為只有docker命令需要更高的權限,可以使用創建docker用戶組的方式解決。在runner上使用root賬戶執行如下命令:
usermod -aG docker gitlab-runner
然后就可以執行docker命令打包了。
docker文件的編寫
可以參考docker官方網站的實現。生成的docker鏡像也可以根據需要上傳到本地倉庫便于后續部署。這些操作都可以在job中執行,此處不再做過多說明。
job的觸發
按照上面的.gitlab-ci.yml文件中指定的規則,有兩種方法可以觸發job的執行。
triggers
可以執行如下命令:
http://:gitlab-server/api/v4/projects/:project_id/ref/REF_NAME/trigger/pipeline?token=TOKEN
git tags
可以對當前項目打標簽來觸發job的執行。git tag的常見命令如下:
列出標簽
$ git tag # 在控制臺打印出當前倉庫的所有標簽
$ git tag -l 'v0.1.\*'
打標簽
git標簽分為兩種類型:輕量標簽和附注標簽。輕量標簽是指向提交對象的引用,附注標簽則是倉庫中的一個獨立對象。建議使用附注標簽。
創建輕量標簽
$ git tag v0.1.2-light
創建附注標簽
$ git tag -a v0.1.2 -m “0.1.2版本”
創建輕量標簽不需要傳遞參數,直接指定標簽名稱即可。
創建附注標簽時,參數a即annotated的縮寫,指定標簽類型,后附標簽名。參數m指定標簽說明,說明信息會保存在標簽對象中。
切換到標簽
與切換分支命令相同,用git checkout [tagname]
查看標簽信息
用git show命令可以查看標簽的版本信息:
$ git show v0.1.2
刪除標簽
誤打或需要修改標簽時,需要先將標簽刪除,再打新標簽。
$ git tag -d v0.1.2 # 刪除標簽
參數d即delete的縮寫,意為刪除其后指定的標簽。
給指定的commit打標簽
打標簽不必要在head之上,也可在之前的版本上打,這需要你知道某個提交對象的校驗和(通過git log獲取)。
補打標簽
$ git tag -a v0.1.1 9fbc3d0
標簽發布
通常的git push不會將標簽對象提交到git服務器,我們需要進行顯式的操作:
$ git push origin v0.1.2 # 將v0.1.2標簽提交到git服務器
$ git push origin –tags # 將本地所有標簽一次性提交到git服務器
注意:如果想看之前某個標簽狀態下的文件,可以這樣操作
- git tag 查看當前分支下的標簽
- git checkout v0.21 此時會指向打v0.21標簽時的代碼狀態,(但現在處于一個空的分支上)
- cat test.txt 查看某個文件