持續(xù)集成(CI)
持續(xù)集成用于將開發(fā)團隊成員中的代碼集成到公共倉庫中。每當(dāng)開發(fā)者進行類似于代碼提交等操作的時候,便會執(zhí)行安裝依賴、編譯代碼、自動化測試等操作。
一個項目的持續(xù)集成工作如果采用純手工操作通常會比較繁瑣且容易出錯,因而引入gitlab-ci來進行自動化的持續(xù)集成工作,每個開發(fā)者完成一部分的功能模塊時便將其集成至主干之中,這樣做能夠更早地發(fā)現(xiàn)項目之中存在的一系列問題并加以解決,避免了以往在項目后期合并代碼產(chǎn)生大量難以解決問題的情況。
基本原理及流程
首先要確保有一臺部署了GitLab且版本在8.0以上的服務(wù)器,如果沒有服務(wù)器,直接使用 https://gitlab.com 上的服務(wù)也可以。之后還需要另一臺機器來安裝gitlab-runner。
這個gitlab-runner是個什么東西呢?簡單來說,它就是一個用來執(zhí)行集成腳本的東西。比如說,當(dāng)有人往倉庫里push了代碼,gitlab-ci就會找出和這個項目相關(guān)聯(lián)的runner,并通知runner執(zhí)行定義好的腳本。
具體如下圖所示

一臺機器上可以存在多個runner,runner也可以存在多個機器上,可以是開發(fā)服務(wù)器,可以是打包機,甚至也可以是你的本地電腦。
GitLab-Runner安裝和注冊
安裝相關(guān)的文檔在官網(wǎng)已經(jīng)介紹了,可以去官網(wǎng)進行查看 https://docs.gitlab.com/runner/install/
這邊發(fā)一下CentOS上的安裝流程(其實也是摘抄自官網(wǎng)的)
# 下載源文件
sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
# 賦予runner執(zhí)行權(quán)限
sudo chmod +x /usr/local/bin/gitlab-runner
# 如果要使用docker,請先下載docker(這步可選)
curl -sSL https://get.docker.com/ | sh
# 創(chuàng)建一個gitlab-runner賬號
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
# 安裝并作為服務(wù)運行
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start
安裝完成以后接下來演示注冊一個gitlab-runner
sudo gitlab-runner register
接下來會讓你輸入相關(guān)的url、token等信息。

這些信息在項目頁的setting->CI/CD->runner那欄展開中可以看到。如下圖所示:

之后會讓你輸入一個tag,這個字段要注意保存下,后續(xù)會和項目的配置文件中做關(guān)聯(lián)。這邊先命名為init-tag。
GitLab Runner中存在以下幾種類型:
- Specific Runner,它只能供部分項目使用,用來支持一些特定的需求。
- Shared Runner,這種Runner 是所有 GitLab 中的項目都可以使用的。
- Group Runner,當(dāng)你在一個Group下有多個項目,并且你希望這些項目都可以訪問一組Runner時,它會很有用。
如果你在使用 https://gitlab.com 的服務(wù),每個月可以獲得2000分鐘的Shared Runner構(gòu)建使用時間。在用戶的 Setting -> Pipelines quota 可以查看到已使用時間。對于個人或者小型企業(yè)來說,這個時間量基本是夠用的。

runner在執(zhí)行構(gòu)建任務(wù)的時候會有比較大的性能消耗,所以還是建議將其配置在專門的打包機上進行運行。
GitLab CI Pipeline相關(guān)的配置
在開始這節(jié)內(nèi)容之前,先簡單介紹一下pipeline、stage、job的概念。
job:最小的任務(wù)單元,通常只做一件事情,比如測試、編譯。
stage:代表一個階段,階段中可以包含多個jobs,一旦有一個job出現(xiàn)錯誤,那么下一個stage將不再執(zhí)行,只有全部jobs執(zhí)行成功才會開始執(zhí)行下一個stage。
pipeline:翻譯過來是管道,你也可以把它當(dāng)成一整個流水線,里面有多個stage有順序地排序在一起。
整體結(jié)構(gòu)可以看下圖:

圖中的便是一個完整的pipeline,其中Update、Test、Build分別代表了三個階段。每個階段中都有自己的job,比如Test階段中就有test-job1和test-job2兩個job。
有了以上的鋪墊,接下來我們可以來看看項目中的配置文件如何書寫。
首先在每個你要管理項目中的根目錄下添加一個.gitlab-ci.yml的文件。
.gitlab-ci.yml文件定義了Pipeline整體的結(jié)構(gòu)以及順序,并確定gitlab-runner要執(zhí)行什么。
下面是最簡單的示例
image: node:10.14.2
#有哪幾個階段要執(zhí)行
stages:
- stage1
- stage2
stage1-job1:
# 這個job屬于哪個階段
stage: stage1
# 要執(zhí)行的shell腳本
script:
- echo `pwd`
# 根據(jù)定義的標簽選擇對應(yīng)Runner
tags:
- init-tag
stage1-job2:
stage: stage1
script:
- echo `pwd`
tags:
- init-tag
stage2-job:
stage: stage1
script:
- echo `pwd`
tags:
- init-tag
我們前面注冊runner時存下的tag在這里就可以用上了
這樣我們每次push代碼到gitlab上以后,runner所在的機器就會自動執(zhí)行里面的shell命令了。
配置文件的詳細寫法可以參考官網(wǎng) https://docs.gitlab.com/ee/ci/yaml/
核心流程
最后總結(jié)一下大致的過程
- 首先注冊
runner,輸入url、token、tag等信息,注冊時會向GitLab發(fā)送一個請求。 -
GitLab接收到請求后會返回一個token給runner,runner之后和GitLab的請求通訊都會帶上這個token。 - 注冊成功后
runner會向GitLab輪詢請求,查看是否要執(zhí)行任務(wù)。 - 某位開發(fā)者push了代碼,代碼更新了,這時候流水線
pipeline啟動,并將第一個stage設(shè)置為pending狀態(tài)。 - 在步驟4完成沒多久,
runner的下一次請求已經(jīng)到達了,這時候會把pending狀態(tài)的stage發(fā)送到runner處,之后runner開始干活,執(zhí)行gitlab-ci.yml中的腳本。 - 當(dāng)執(zhí)行完了腳本后,
runner會發(fā)送最終的執(zhí)行結(jié)果,如果完成則為passed,失敗則為failed