JB的git之旅-gitlab ci介紹

jb發表於2018-05-24

提及到持續整合工具,想到的有jenkins、buildbot、gitlab ci,本文就來講講gitlab ci~

首先先掃盲:

什麼是持續整合?

JB的git之旅-gitlab ci介紹

持續整合指的是,頻繁地(一天多次)將程式碼整合到主幹。

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

防止分支大幅偏離主幹:
如果不是經常整合,主幹又在不斷更新,會導致以後整合的難度變大,甚至難以整合。

簡單總結:
減少風險、減少重複過程、專案更加透明

常見的持續整合系統組成

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

  • 一個自動構建過程,包括自動編譯、分發、部署和測試等。
  • 一個程式碼儲存庫,即需要版本控制軟體來保障程式碼的可維護性,同時作為構建過程的素材庫。
  • 一個持續整合伺服器

GitLab CI介紹

JB的git之旅-gitlab ci介紹

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

GitLab-Runner

這個是指令碼執行的承載者,.gitlab-ci.yml的script部分的執行就是由runner來負責的。
GitLab-CI瀏覽過專案裡的.gitlab-ci.yml檔案之後,根據裡面的規則,分配到各個Runner來執行相應的指令碼script。

JB的git之旅-gitlab ci介紹

.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
    複製程式碼

執行後長這樣:

JB的git之旅-gitlab ci介紹

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

yum install gitlab-ci-multi-runner
複製程式碼

JB的git之旅-gitlab ci介紹

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

點選一個專案->Settings->CI/CD->Runners setting,點選Expand

JB的git之旅-gitlab ci介紹
點選後會開啟後runner settings的介面,裡面就有runner的url跟token

JB的git之旅-gitlab ci介紹

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

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

如果是Linux則如下:

gitlab-ci-multi-runner register
複製程式碼

然後會要求輸入一堆東西,如下圖:

JB的git之旅-gitlab ci介紹

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的資訊:

JB的git之旅-gitlab ci介紹

到此為止,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
複製程式碼

下面為常用的關鍵字資訊,一般熟悉就夠用了:

JB的git之旅-gitlab ci介紹

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

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

JB的git之旅-gitlab ci介紹

點選進入具體job的執行情況:

JB的git之旅-gitlab ci介紹

gitlab CI大致就介紹完畢了,剩下的就是定義.gitlab-ci.yml檔案,做想執行的事情~

遇到的問題

1)gitlab ci結果顯示亂碼

JB的git之旅-gitlab ci介紹

暫時沒找到解決方案

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

現象:

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

解決方案: 這種問題,第一思路就是找error log,但是找了很久都沒找到error log檔案;

最後晚上找到一條命令:

journalctl -u gitlab-runner
複製程式碼

輸入後,會顯示log:

JB的git之旅-gitlab ci介紹
直接分析log,最後發現樓主是因為在執行的時候,沒有/home/gitlab-runner這個目錄導致start失敗,解決方案就是建立一個這個目錄即可

然後再輸入:

gitlab-runner start
gitlab-runner status
複製程式碼

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

JB的git之旅-gitlab ci介紹

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

3)gitlab 上一直顯示pending

JB的git之旅-gitlab ci介紹

JB的git之旅-gitlab ci介紹

原因: 在註冊gitlab runner的時候,有一步是:

JB的git之旅-gitlab ci介紹
這句話的意思是:是否在沒有標記的tag的job上執行,如果選擇預設值false,
那沒有標記tag的程式碼提交時不會觸發gitlab runner,測試階段,最好填寫true;

那如果是已經建立好的runner,不想重新註冊,怎麼辦?
開啟對應的runner介面,點選編輯圖示,把run untagged jobs勾上即可;

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

JB的git之旅-gitlab ci介紹

JB的git之旅-gitlab ci介紹
JB的git之旅-gitlab ci介紹

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

4)許可權不夠,無法建立目錄

JB的git之旅-gitlab ci介紹

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

謝謝大家~

JB的git之旅-gitlab ci介紹

相關文章