HackPig520

HackPig520 的博客

我是HackPig520,一个前端工程师,喜欢Web3和Minecraft。
github
gitlab
bilibili
tg_channel
keybase
email
twitter
zhihu
pixiv

用 GitLab CI 進行持續集成

本文對應用程序設計中常見的組件及其作用進行了介紹。

簡介#

從 GitLab 8.0 開始,GitLab CI 就已經集成在 GitLab 中,我們只要在項目中添加一個 .gitlab-ci.yml 文件,然後添加一個 Runner,即可進行持續集成。 而且隨著 GitLab 的升級,GitLab CI 變得越來越強大,本文將介紹如何使用 GitLab CI 進行持續集成。

一些概念#

在介紹 GitLab CI 之前,我們先看看一些持續集成相關的概念。

Pipeline#

一次 Pipeline 其實相當於一次構建任務,裡面可以包含多個流程,如安裝依賴、運行測試、編譯、部署測試伺服器、部署生產伺服器等流程。 任何提交或者 Merge Request 的合併都可以觸發 Pipeline,如下圖所示

+------------------+           +----------------+
|                  |  trigger  |                |
|   Commit / MR    +---------->+    Pipeline    |
|                  |           |                |
+------------------+           +----------------+

Stages#

Stages 表示構建階段,說白了就是上面提到的流程。 我們可以在一次 Pipeline 中定義多個 Stages,這些 Stages 會有以下特點:

所有 Stages 會按照順序運行,即當一個 Stage 完成後,下個 Stage 才會開始
只有當所有 Stages 完成後,該構建任務 (Pipeline) 才會成功
如果任何一個 Stage 失敗,那麼後面的 Stages 不會執行,該構建任務 (Pipeline) 失敗
因此,Stages 和 Pipeline 的關係就是:

+--------------------------------------------------------+
|                                                        |
|  Pipeline                                              |
|                                                        |
|  +-----------+     +------------+      +------------+  |
|  |  Stage 1  |---->|   Stage 2  |----->|   Stage 3  |  |
|  +-----------+     +------------+      +------------+  |
|                                                        |
+--------------------------------------------------------+

Jobs#

Jobs 表示構建工作,表示某個 Stage 裡面執行的工作。 我們可以在 Stages 裡面定義多個 Jobs,這些 Jobs 會有以下特點:

相同 Stage 中的 Jobs 會並行執行
相同 Stage 中的 Jobs 都執行成功時,該 Stage 才會成功
如果任何一個 Job 失敗,那麼該 Stage 失敗,即該構建任務 (Pipeline) 失敗
所以,Jobs 和 Stage 的關係圖就是:

+------------------------------------------+
|                                          |
|  Stage 1                                 |
|                                          |
|  +---------+  +---------+  +---------+   |
|  |  Job 1  |  |  Job 2  |  |  Job 3  |   |
|  +---------+  +---------+  +---------+   |
|                                          |
+------------------------------------------+

簡介#

配置好 Runner 之後,我們要做的事情就是在項目根目錄中添加 .gitlab-ci.yml 文件了。 當我們添加了 .gitlab-ci.yml 文件後,每次提交代碼或者合併 MR 都會自動運行構建任務了。

還記得 Pipeline 是怎麼觸發的嗎?Pipeline 也是通過提交代碼或者合併 MR 來觸發的! 那麼 Pipeline 和 .gitlab-ci.yml 有什麼關係呢? 其實 .gitlab-ci.yml 就是在定義 Pipeline 而已拉!

基本寫法#

我們先來看看 .gitlab-ci.yml 是怎麼寫的:

# 定義 stages
stages:
  - build
  - test

# 定義 job
job1:
  stage: test
  script:
    - echo "I am job1"
    - echo "I am in test stage"

# 定義 job
job2:
  stage: build
  script:
    - echo "I am job2"
    - echo "I am in build stage"

寫起來很簡單吧!用 stages 關鍵字來定義 Pipeline 中的各個構建階段,然後用一些非關鍵字來定義 jobs。 每個 job 中可以可以再用 stage 關鍵字來指定該 job 對應哪個 stage。 job 裡面的 script 關鍵字是最關鍵的地方了,也是每個 job 中必須要包含的,它表示每個 job 要執行的命令。

回想一下我們之前提到的 Stages 和 Jobs 的關係,然後猜猜上面例子的運行結果?

I am job2
I am in build stage
I am job1
I am in test stage

沒錯,根據我們在 stages 中的定義,build 階段要在 test 階段之前運行,所以 stage 的 jobs 會先運行,之後才會運行 stage 的 jobs。

常用的關鍵字#

下面介紹一些常用的關鍵字,想要更加詳盡的內容請前往 官方文檔

stages

定義 Stages,默認有三個 Stages,分別是 build, test, deploy。

types

stages 的別名。

before_script

定義任何 Jobs 運行前都會執行的命令。

after_script**

要求 GitLab 8.7+ 和 GitLab Runner 1.2+

定義任何 Jobs 運行完後都會執行的命令。

variables && Job.variables

要求 GitLab Runner 0.5.0+

定義環境變量。 如果定義了 Job 級別的環境變量的話,該 Job 會優先使用 Job 級別的環境變量。

cache && Job.cache

要求 GitLab Runner 0.7.0+

定義需要緩存的文件。 每個 Job 開始的時候,Runner 都會刪掉 .gitignore 裡面的文件。 如果有些文件 (如 node_modules/) 需要多個 Jobs 共用的話,我們只能讓每個 Job 都先執行一遍 npm install。 這樣很不方便,因此我們需要對這些文件進行緩存。緩存了的文件除了可以跨 Jobs 使用外,還可以跨 Pipeline 使用。

具體用法請查看 官方文檔

Job.script

定義 Job 要運行的命令,必填項。

Job.stage

定義 Job 的 stage,默認為 test。

Job.artifacts

定義 Job 中生成的附件。 當該 Job 運行成功後,生成的文件可以作為附件 (如生成的二進制文件) 保留下來,打包發送到 GitLab,之後我們可以在 GitLab 的項目頁面下下載該附件。 注意,不要把 artifacts 和 cache 混淆了。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。