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的具體工作流和概念,黃色部分爲主要涉及的概念,將在後文重點說明:

  1. 你當前的代碼庫託管在Gitlab上, 且已經爲代碼倉庫配置了gitlab-runner服務, 它是用來實際執行CI任務的服務器;
  2. 提交代碼,且根目錄中包含一個名爲.gitlab-ci.yml文件,該文件是用來指定構建、測試和部署流程、以及CI觸發條件的腳本,其概念類似於docker-compose.yml文件;
  3. Gitlab檢測到.gitlab-ci.yml文件,若當前提交符合文件中指定的觸發條件,則會使用配置的gitlab-runner服務運行該腳本進行測試等工作;
  4. .gitlab-ci.yml中定義的某個自動化腳本運行失敗,將判定爲此次CI不通過,則需要提交者修復問題代碼後重復提交,直至自動化CI通過。
  5. 沒有問題的提交才能被項目負責人merge到主分支,進行後續的部署工作(此文暫不涉及CD自動化部署)

三、 如何編寫.gitlab-ci.yml文件

.gitlab-ci.yml文件中指定了CI的觸發條件、工作內容、工作流程,編寫和理解此文件是CI實戰中最重要的一步,該文件指定的任務內容總體構成了1個pipeline、1個pipeline包含不同的stage執行階段、每個stage包含不同的具體job腳本任務。

.gitlab-ci.yml示例文件及常用說明

 
 

Pipeline說明

一個.gitlab-ci.yml文件觸發後會形成一個pipeline任務流由gitlab-runner來運行處理,pipelinestagejob概念如下,需要按照項目實際情況定義不同stagejob, 自己繪製了一個流程示意圖幫助理解:

 
 
示例 .gitlab-ci.yml文件運行順序及邏輯說明

1.所示在項目根目錄中編寫好yml文件,

  1. 首先綠色方框中定義了stage的階段順序,總共定義了3個階段,按順序依次命名爲build、test、deploy;

  2. 第一個藍色方框定義了build階段的一個job,該job僅在tags階段的分支提交時觸發,執行script中的腳本,按照DockerfileCI文件將項目打包爲成名爲img的鏡像,並推送到倉庫中,然後移除本地鏡像;

  3. 第二個藍色方框定義了test階段的一個job,該job沒有限制觸發條件,將在每次提交時執行。

    • Image指定了該階段使用的基礎鏡像,該鏡像爲本地手動提前創建並推送;
    • services指定了該階段依賴使用的服務,mongo和redis,該job運行時會初始化指定服務版本的容器,並分別暴露域名爲mongo:27017、redis:6379,需要在配置文件中提前配置好CI專用的配置文件;
    • befor_script指定了在執行正式腳本之前預先執行的命令,打印python版本信息、將CI專用測試配置文件置爲項目讀取的配置文件、運行測試數據初始化腳本、npm構建前端部分;
    • script指定了正式腳本執行命令,開始執行django的單元測試。
  4. 其他gitlab-ci.yml文件參考

四、 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上的安裝方式:

注:gitlab-runner需要依賴gitlab-runner-helper本地鏡像,最好提前pull到本地倉庫或者私有倉庫中。

使用gitlab-runner運行本地.gitlab.yml中定義的job

目前本地的gitlab-runner貌似只能一次執行一個指定的job,而不能自動完成yml文件包含的pipeline的總流程,但作爲本地測試也是足夠了。當然,本地必須啓動有docker服務,並且提前準備好了需要的基礎鏡像, job會基於基礎鏡像,將本地代碼置於一個新目錄中執行,本地runner時一般爲生成容器中的/builds/projects0目錄。

  1. 進入本地項目根目錄,即包含了.gitlab.yml的目錄
  2. 執行gitlab-runner命令:
    gitlab-runner exec docker test_job --docker-pull-policy=never

 

  1. 參數釋義
    • 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和dns配置如下:
"insecure-registries": [
    "你的私有倉庫host解析地址"
],
  "dns": [
    "你的私有倉庫dns地址"
    ]

  

 
 
作者:越大大雨天
鏈接:https://www.jianshu.com/p/4cc441b1c8a3
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章