使用Gitlab CI/DI 自動生成docker鏡像

因為項目中有多個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.

  1. 通過root賬號登錄gitlab,然后找到admin/runners頁面。
  2. 找到這個頁面的一個token
  3. 在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服務器

注意:如果想看之前某個標簽狀態下的文件,可以這樣操作

  1. git tag 查看當前分支下的標簽
  2. git checkout v0.21 此時會指向打v0.21標簽時的代碼狀態,(但現在處于一個空的分支上)
  3. cat test.txt 查看某個文件
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,983評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,772評論 3 422
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,947評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,201評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,960評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,350評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,549評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,104評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,914評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,089評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,340評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,753評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,007評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,834評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,106評論 2 375

推薦閱讀更多精彩內容