使用GitLab CI對項目進行持續(xù)集成

持續(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等信息。

register需要輸入的字段

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

注冊需要的信息

之后會讓你輸入一個tag,這個字段要注意保存下,后續(xù)會和項目的配置文件中做關(guān)聯(lián)。這邊先命名為init-tag。

GitLab Runner中存在以下幾種類型:

  1. Specific Runner,它只能供部分項目使用,用來支持一些特定的需求。
  2. Shared Runner,這種Runner 是所有 GitLab 中的項目都可以使用的。
  3. 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、stage、job的關(guān)系

圖中的便是一個完整的pipeline,其中UpdateTest、Build分別代表了三個階段。每個階段中都有自己的job,比如Test階段中就有test-job1test-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é)一下大致的過程

  1. 首先注冊runner,輸入url、token、tag等信息,注冊時會向GitLab發(fā)送一個請求。
  2. GitLab接收到請求后會返回一個token給runnerrunner之后和GitLab的請求通訊都會帶上這個token。
  3. 注冊成功后runner會向GitLab輪詢請求,查看是否要執(zhí)行任務(wù)。
  4. 某位開發(fā)者push了代碼,代碼更新了,這時候流水線pipeline啟動,并將第一個stage設(shè)置為pending狀態(tài)。
  5. 在步驟4完成沒多久,runner的下一次請求已經(jīng)到達了,這時候會把pending狀態(tài)的stage發(fā)送到runner處,之后runner開始干活,執(zhí)行gitlab-ci.yml中的腳本。
  6. 當(dāng)執(zhí)行完了腳本后,runner會發(fā)送最終的執(zhí)行結(jié)果,如果完成則為passed,失敗則為failed
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容