JB的git之旅-gitlab ci介紹

說起到持續集成工具,想到的有jenkins、buildbot、gitlab ci,本文就來說講gitlab ci~git

首先先掃盲:segmentfault

什麼是持續集成?

持續集成指的是,頻繁地(一天屢次)將代碼集成到主幹。windows

持續集成的好處主要有兩個:
快速發現錯誤:
每完成一點更新,就集成到主幹,能夠快速發現錯誤,定位錯誤也比較容易。bash

防止分支大幅偏離主幹:
若是不是常常集成,主幹又在不斷更新,會致使之後集成的難度變大,甚至難以集成。服務器

簡單總結:
減小風險、減小重複過程、項目更加透明curl

常見的持續集成系統組成

一個完整的構建系統必須包括:工具

  • 一個自動構建過程,包括自動編譯、分發、部署和測試等。
  • 一個代碼存儲庫,即須要版本控制軟件來保障代碼的可維護性,同時做爲構建過程的素材庫。
  • 一個持續集成服務器

GitLab CI介紹

GitLab CI
GitLab CI 是 GitLab 提供的持續集成服務,只要在你的倉庫根目錄 建立一個.gitlab-ci.yml 文件, 併爲該項目指派一個Runner,當有合併請求或者 push的時候就會觸發build。gitlab

GitLab-Runner
單元測試

這個是腳本執行的承載者,.gitlab-ci.yml的script部分的運行就是由runner來負責的。
GitLab-CI瀏覽過項目裏的.gitlab-ci.yml文件以後,根據裏面的規則,分配到各個Runner來運行相應的腳本script。測試

.gitlab-ci.yml
.gitlab-ci.yml 文件定義GitLab runner要作哪些操做。
默認有3個[stages(階段)]: build、test、deploy。

Pipelines
Pipelines是定義於.gitlab-ci.yml中的不一樣階段的不一樣任務。
把Pipelines理解爲流水線,流水線包含有多個階段(stages),每一個階段包含有一個或多個工序(jobs),
好比先購料、組裝、測試、包裝再上線銷售,每一次push或者MR都要通過流水線以後才能夠合格出廠。
而.gitlab-ci.yml正是定義了這條流水線有哪些階段,每一個階段要作什麼~

+------------------+           +----------------+
|                  |  trigger  |                |
|   Commit / MR    +---------->+    Pipeline    |
|                  |           |                |
+------------------+           +----------------+
複製代碼

Stages
Stages 表示構建階段,說白了就是上面提到的流程。
咱們能夠在一次 Pipeline 中定義多個 Stages,每一個Stage能夠完成不一樣的任務。
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  |   |
|  +---------+  +---------+  +---------+   |
|                                          |
+------------------------------------------+
複製代碼

簡單的說,要讓CI工做可總結爲如下幾點:
1)在倉庫根目錄建立一個名爲.gitlab-ci.yml 的文件
2)爲該項目配置一個Runner

完成上面的步驟後,每次push代碼到Git倉庫, Runner就會自動開始pipeline。

CI基本原理

持續集成基本原理實際上很是簡單:

  • 1.檢測到 git 有新的代碼提交(定時檢測或主動觸發),生成任務
  • 2.agent(真正幹活的進程,能夠分佈在多臺機器) 領取任務,拉取代碼,運行一段腳本(不管是單元測試仍是 APP 打包,均可以用腳本完成)
  • 3.展現結果:成功與否、測試覆蓋率、apk ipa 下載連接等

安裝及配置

1.安裝runner
本文以win10舉例:
首先,下載gitlab-ci-multi-runner-windows-amd64,並將其放到C:\CI

下載地址: https://gitlab-ci-multi-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-ci-multi-runner-windows-amd64.exe

Centos: 安裝gitlab-ci-multi-runner:

  • 添加yum源

    curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash
    複製代碼

執行後長這樣:

只要不報錯或者提示找不到的話,就能夠了,那接下來就安裝了~

yum install gitlab-ci-multi-runner
複製代碼

註冊等步驟則跟Windows一致~ 2.獲取gitlab的runners

點擊一個項目->Settings->CI/CD->Runners setting,點擊Expand

點擊後會打開後runner settings的界面,裏面就有runner的url跟token

3.配置runner
回到剛剛配置的目錄,樓主是在C:\CI
執行下面的命令:

gitlab-ci-multi-runner-windows-amd64.exe register
複製代碼

若是是Linux則以下:

gitlab-ci-multi-runner register
複製代碼

而後會要求輸入一堆東西,以下圖:

1)輸入Gitlab CI地址
2)輸入項目CI的token
3)輸入Runner的描述
4)輸入Runner的標籤
5)是否運行無標記的構,默認false,後面能夠改
6)是否將Runner跟當前項目綁定,默認false,若是不綁定,即爲共享runner,後面能夠改~
7)輸入Runner執行語言
複製代碼

執行完後,會發現CI目錄會多了個config.toml的文件,裏面就是剛剛的配置信息~

若是是Linux,Runner信息放哪裏呢?

  • 若是是以root用戶身份運行gitlab-ci-multi-runner register,那麼配置文件默認是/etc/gitlab-runner/config.toml
  • 若是是以非root用戶身份運行gitlab-ci-multi-runner register,那麼配置文件默認是~/.gitlab-runner/config.toml
  • 又或者是在當前工做目錄下./config.toml

下面須要開啓runner服務~

在CI目錄下,分別輸入install跟start命令:

gitlab-ci-multi-runner-windows-amd64.exe install

gitlab-ci-multi-runner-windows-amd64.exe start
複製代碼

若是須要中止,把start修改爲stop便可~

輸入完畢後,只要沒有報錯,則說明成功,而後回到gitlab項目-Runner Settings上,會發現多了個runner的信息:

到此爲止,runner設置完成了~

關於其餘平臺的安裝到註冊,詳情請看官網詳細介紹,大同小異: https://docs.gitlab.com/runner/install/

4).gitlab-ci.yml
如上面介紹的同樣,.gitlab-ci.yml 文件定義GitLab runner要作哪些操做;
它位於項目的根目錄。

一個簡單的.gitlab-ci.yml

stages:
        - test

    job1:
        stage: test
        script:
            - echo "jb1111112222"
複製代碼

很簡單,定義了一個叫job1的jobs,stages裏面是定義任務執行的順序,但上面體現不出來,而這個job1裏面就是輸出jb1111112222這串玩意~
注意:.gitlab-ci.yml是一個YAML文件,因此必需要格外注意鎖緊。使用空格,而不是tabs。

假如是這樣呢?

# 定義 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"

理所固然的,上面的運行結果就是這樣:
I am job2
I am in build stage
I am job1
I am in test stage

根據在 stages 中的定義,build 階段要在 test 階段以前運行,因此 stage:build 的 jobs 會先運行,
以後纔會運行 stage:test 的 jobs。
複製代碼

文件建立好了,內容也定義好了,而後須要添加到git倉庫~

git add .gitlab-ci.yml
git commit -m "Add .gitlab-ci.yml"
git push origin master
複製代碼

下面爲經常使用的關鍵字信息,通常熟悉就夠用了:

有關更多關鍵字信息,請看下面的文章: https://segmentfault.com/a/1190000010442764#articleHeader5

5)查看pipeline和jobs的狀態
成功的配置好Runner後,你應該查看最後一次提交後的狀態,從pending、到執行中、成功或失敗。

點擊進入具體job的執行狀況:

gitlab CI大體就介紹完畢了,剩下的就是定義.gitlab-ci.yml文件,作想執行的事情~

遇到的問題

1)gitlab ci結果顯示亂碼

暫時沒找到解決方案

2)runner無故端離線,而後一直start失敗,一直提示gitlab-runner: Service is running!, 即便重裝gitlab-runner也不能解決問題

現象:

輸入gitlab-runner start,卡住好久,而後沒有任何日誌輸出

解決方案: 這種問題,第一思路就是找error log,可是找了好久都沒找到error log文件;

最後晚上找到一條命令:

journalctl -u gitlab-runner
複製代碼

輸入後,會顯示log:

直接分析log,最後發現樓主是由於在執行的時候,沒有/home/gitlab-runner這個目錄致使start失敗,解決方案就是建立一個這個目錄便可

而後再輸入:

gitlab-runner start
gitlab-runner status
複製代碼

而後就能看到久違的is running!!

感動啊~爲了看到這個提示,都不知道找了多少方法,果真,看log纔是王道~

3)gitlab 上一直顯示pending

緣由: 在註冊gitlab runner的時候,有一步是:

這句話的意思是:是否在沒有標記的tag的job上運行,若是選擇默認值false,
那沒有標記tag的代碼提交時不會觸發gitlab runner,測試階段,最好填寫true;

那若是是已經建立好的runner,不想從新註冊,怎麼辦?
打開對應的runner界面,點擊編輯圖標,把run untagged jobs勾上便可;

步驟: projects-settings-CI/CD-Runners settings

這樣,就不會再是pending的狀態了~

4)權限不夠,沒法建立目錄

這個目錄就是問題2手動建立的目錄,手動chmod 777 /home/gitlab-runner便可

謝謝你們~

相關文章
相關標籤/搜索