說起到持續集成工具,想到的有jenkins、buildbot、gitlab ci,本文就來說講gitlab ci~git
首先先掃盲:segmentfault
持續集成指的是,頻繁地(一天屢次)將代碼集成到主幹。windows
持續集成的好處主要有兩個:
快速發現錯誤:
每完成一點更新,就集成到主幹,能夠快速發現錯誤,定位錯誤也比較容易。bash
防止分支大幅偏離主幹:
若是不是常常集成,主幹又在不斷更新,會致使之後集成的難度變大,甚至難以集成。服務器
簡單總結:
減小風險、減小重複過程、項目更加透明curl
一個完整的構建系統必須包括:工具
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。
持續集成基本原理實際上很是簡單:
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跟token3.配置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信息放哪裏呢?
下面須要開啓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,那若是是已經建立好的runner,不想從新註冊,怎麼辦?
打開對應的runner界面,點擊編輯圖標,把run untagged jobs勾上便可;
步驟: projects-settings-CI/CD-Runners settings
這樣,就不會再是pending的狀態了~
4)權限不夠,沒法建立目錄
這個目錄就是問題2手動建立的目錄,手動chmod 777 /home/gitlab-runner便可
謝謝你們~