Gitlab-CI使用及.gitlab-ci.yml配置入門
一、 Gitlab-CI/CD使用場景
首先,公司使用Gitlab作為工作倉庫進行程式碼釋出及版本控制,Gitlab內建了CI/CD的工具,這些工具可以用於程式碼提交的同時完成映象構建、自動化測試、自動化部署等連續的工作:
- CI: Continuous Integration(持續整合)
- CD: Continuous Delivery(連續交付)
-
CD: Continuous Deployment(持續部署)
這裡暫時只討論CI持續整合部分的工作,我們常用CI來做一些自動化工作,這種自動化工作會執行在一臺集中的機器上,比如程式映象的打包,單元測試,部署等,它可以節省專案開發迭代過程中維護正確的程式碼所耗費的時間。
例比如CI中自動測試,在多人協同開發的過程中,可能會有頻繁的不同分支的程式碼推送更新,使用CI管道,可在程式碼釋出的同時觸發CI中定義的單元測試操作,以便於在開發早期發現錯誤,從而確保所有新程式碼的提交都不影響專案功能。
二、 瞭解Gitlab-CI/CD工作流
參考下圖先了解CI/CD的具體工作流和概念,黃色部分為主要涉及的概念,將在後文重點說明:
- 你當前的程式碼庫託管在Gitlab上, 且已經為程式碼倉庫配置了
gitlab-runner
服務, 它是用來實際執行CI任務的伺服器; - 提交程式碼,且根目錄中包含一個名為
.gitlab-ci.yml
檔案,該檔案是用來指定構建、測試和部署流程、以及CI觸發條件的指令碼,其概念類似於docker-compose.yml檔案; - Gitlab檢測到
.gitlab-ci.yml
檔案,若當前提交符合檔案中指定的觸發條件,則會使用配置的gitlab-runner
服務執行該指令碼進行測試等工作; - 若
.gitlab-ci.yml
中定義的某個自動化指令碼執行失敗,將判定為此次CI不通過,則需要提交者修復問題程式碼後重復提交,直至自動化CI通過。 - 沒有問題的提交才能被專案負責人merge到主分支,進行後續的部署工作(此文暫不涉及CD自動化部署)
三、 如何編寫.gitlab-ci.yml
檔案
.gitlab-ci.yml
檔案中指定了CI的觸發條件、工作內容、工作流程,編寫和理解此檔案是CI實戰中最重要的一步,該檔案指定的任務內容總體構成了1個pipeline
pipeline
包含不同的stage
執行階段、每個stage
包含不同的具體job
指令碼任務。
.gitlab-ci.yml示例檔案及常用說明
Pipeline說明
一個.gitlab-ci.yml
檔案觸發後會形成一個pipeline
任務流由gitlab-runner
來執行處理,pipeline
中stage
、job
概念如下,需要按照專案實際情況定義不同stage
和job
, 自己繪製了一個流程示意圖幫助理解:
.gitlab-ci.yml
檔案執行順序及邏輯說明
按1.
所示在專案根目錄中編寫好yml檔案,
-
首先綠色方框中定義了
stage
的階段順序,總共定義了3個階段,按順序依次命名為build、test、deploy; -
第一個藍色方框定義了build階段的一個
job
,該job
僅在tags階段的分支提交時觸發,執行script中的指令碼,按照DockerfileCI檔案將專案打包為成名為img的映象,並推送到倉庫中,然後移除本地映象; -
第二個藍色方框定義了test階段的一個
job
,該job
沒有限制觸發條件,將在每次提交時執行。-
Image
指定了該階段使用的基礎映象,該映象為本地手動提前建立並推送; -
services
指定了該階段依賴使用的服務,mongo和redis,該job執行時會初始化指定服務版本的容器,並分別暴露域名為mongo:27017、redis:6379,需要在配置檔案中提前配置好CI專用的配置檔案; -
befor_script
指定了在執行正式指令碼之前預先執行的命令,列印python版本資訊、將CI專用測試配置檔案置為專案讀取的配置檔案、執行測試資料初始化指令碼、npm構建前端部分; -
script
指定了正式指令碼執行命令,開始執行django的單元測試。
-
-
其他gitlab-ci.yml檔案參考
- CI/CD Example: https://docs.gitlab.com/ee/ci/examples/
- Job Keyword: https://docs.gitlab.com/ee/ci/yaml/#job-keywords
四、 Gitlab-Runner介紹和使用
上面講了.gitlab.yml
檔案如何編寫以及其中的job執行順序邏輯,那各個job實際的執行者是誰呢,答案就是gitlab-runner
,一般來說gitlab-runner
會和gitlab所在的伺服器進行隔離,因為一個任務的構建、往往會執行編譯、測試、釋出的過程,這個過程會消耗大量的系統資源。gitlab-runner
幾乎可以安裝在任何的機器上,只要能和gitlab所在伺服器及docker倉庫伺服器進行通訊即可。
一般來說,gitlab上已由負責人配置好了gitlab-runner
,我們只需要編寫好.gitlab.yml
檔案提交程式碼即可觸發runner進行工作。但對於初學者來說,你可能想能不能在提交程式碼前在本地先執行.gitlab.yml
檔案的job,本地除錯成功檢查沒有問題後再進行最終程式碼的提交,觸發服務端的CI流程。答案當然也是可以的。之前已經說了,.gitlab.yml
檔案中定義的job其實是某個伺服器中的gitlab-runner
在執行,那我們也可以在本地安裝好gitlab-runner
手動的來執行本地.gitlab.yml
中的job
。
Gitlab-runner的安裝
你幾乎可以在任何機器上安裝gitlab-runner
,這裡講一下mac上的安裝方式:
-
mac安裝:
brew install gitlab-runner
-
gitlab-runner-helper
安裝:docker pull gitlab-runner-helper
注:gitlab-runner需要依賴gitlab-runner-helper本地映象,最好提前pull到本地倉庫或者私有倉庫中。
使用gitlab-runner
執行本地.gitlab.yml
中定義的job
目前本地的gitlab-runner
貌似只能一次執行一個指定的job,而不能自動完成yml檔案包含的pipeline的總流程,但作為本地測試也是足夠了。當然,本地必須啟動有docker服務,並且提前準備好了需要的基礎映象, job會基於基礎映象,將原生代碼置於一個新目錄中執行,本地runner時一般為生成容器中的/builds/projects0
目錄。
- 進入本地專案根目錄,即包含了
.gitlab.yml
的目錄 -
執行
gitlab-runner
命令:gitlab-runner exec docker test_job --docker-pull-policy=never
-
引數釋義
-
gitlab-runner exec docker
為固定命令寫法; -
test_job
為.gitlab.yml
中定義的一個job
; -
--docker-pull-policy=never
表示使用本地的docker映象而非網路倉庫
-
這樣很簡單的安裝和命令便能在本地執行一個gitlab-runner
的測試了。
推送程式碼到gitlab分支
本地測試沒問題後便可放心的將程式碼推送至遠端分支了,如果當前是fork倉庫,則需要同時將程式碼推送至upstream觸發主倉庫的CI流程,CI通過後,後續才可將分支程式碼合併至master。
五、欄位詳解
關鍵字 | 是否必須 | 描述 |
---|---|---|
script | 必須 | 定義Runner需要執行的指令碼或命令 |
image | 非必須 | 需要使用的docker映象,請查閱該文件 |
services | 非必須 | 定義了所需的docker服務,請查閱該文件 |
stage | 非必須 | 定義了工作的場景階段,預設是test |
type | 非必須 | stage的別名,不贊成使用 |
variables | 非必須 | 在job級別上定義的變數 |
only | 非必須 | 定義哪些git引用(分支)適用該job |
except | 非必須 | 定義了哪些git引用(分支)不適用該job |
tags | 非必須 | 定義了哪些runner適用該job(runner在建立時會要求使用者輸入標籤名來代表該runner) |
allow_failure | 非必須 | 允許任務失敗,但是如果失敗,將不會改變提交狀態 |
when | 非必須 | 定義job什麼時候能被執行,可以是on_success,on_failure,always或者manual |
dependencies | 非必須 | 定義了該job依賴哪一個job,如果設定該項,你可以通過artifacts設定 |
artifacts | 非必須 | 所謂工件。。就是在依賴項之間傳遞的東西,類似cache,但原理與cache不同 |
cache | 非必須 | 定義需要被快取的檔案、資料夾列表 |
before_script | 非必須 | 覆蓋在根元素上定義的before_script |
after_script | 非必須 | 覆蓋在根元素上定義的after_script |
environment | 非必須 | 定義讓job完成部署的環境名稱 |
retry | 非必須 | 定義job失敗後的自動重試次數 |
更多詳解:https://blog.csdn.net/sinat_17775997/article/details/116068193
附錄(涉及的其他相關操作)
配置docker私有倉庫
由於CI流程會使用到我們自己打包的一些docker映象,映象的上傳和下載會依賴組內的私有倉庫,下面介紹如何配置docker的倉庫連線:
-
編輯
deamon.json
配置檔案
Mac電腦可以直接通過docker應用, Preferences—>Docker Engine 直接編輯配置即可:
"insecure-registries": [
"你的私有倉庫host解析地址"
],
"dns": [
"你的私有倉庫dns地址"
]
作者:越大大雨天
連結:https://www.jianshu.com/p/4cc441b1c8a3