使用持續(xù)集成應(yīng)該是一個(gè)軟件開發(fā)工程師的自覺煮甥。 ——沃茲基.索德
前言
在實(shí)際工作中可缚,為了防止當(dāng)前分支大幅度偏離主干一铅,開發(fā)人員每天都會(huì)頻繁地將代碼集成到主干。如果不使用持續(xù)集成典予,人工重復(fù)進(jìn)行編譯部署等工作甜滨,無(wú)疑是低效且易出錯(cuò)的。所以持續(xù)集成的優(yōu)點(diǎn)顯而易見:
- 減少人工編譯部署過程中的低級(jí)錯(cuò)誤
- 縮短開發(fā)周期瘤袖,快速進(jìn)行版本迭代
- 隨時(shí)可部署
- 讓開發(fā)人員專心coding(高效)
目錄
- 為什么要用GitLab CI/CD
- 一點(diǎn)理論
- 一點(diǎn)實(shí)踐
- 一點(diǎn)問題
為什么要用GitLab CI/CD
GitLab8.0之后衣摩,GitLab CI就已經(jīng)集成在GitLab里了。使用GitLab CI可以說(shuō)是非常的簡(jiǎn)單方便捂敌,先看下預(yù)覽圖
作者之前也嘗試了Jenkins艾扮。Jenkins作為老牌的持續(xù)集成框架,在這么多年的發(fā)展中占婉,積累很多優(yōu)秀的插件工具泡嘴,不可否認(rèn)它具有很多GitLab CI不具備的功能,但是Jenkins的使用復(fù)雜度跟GitLab CI 相比還是高了不止一點(diǎn)(不信往下看)逆济。而且我覺得Jenkins的頁(yè)面設(shè)計(jì)太out酌予。如果你跟我一樣是個(gè)初學(xué)者磺箕,還是建議你從GitLab CI開始嘗試。
一點(diǎn)理論
在實(shí)踐之前我們先介紹一些GitLab CI的相關(guān)概念抛虫。
pipeline
每次代碼提交就會(huì)觸發(fā)一次pipeline松靡。一次pipeline可以看成一次構(gòu)建任務(wù)。構(gòu)建任務(wù)一般會(huì)包含:安裝依賴建椰,測(cè)試雕欺,編譯,部署服務(wù)等多個(gè)階段棉姐。
stage
stage就是上述構(gòu)建任務(wù)中的各個(gè)構(gòu)建階段屠列。一個(gè)pipeline可以定義多個(gè)stage。stage有以下特點(diǎn):
1.所有的stage按順序運(yùn)行伞矩,前一個(gè)stage完成后笛洛,下一個(gè)stage才會(huì)開始執(zhí)行。
2.只有當(dāng)所有的stage都完成后扭吁,該構(gòu)建任務(wù)(pipeline)才會(huì)成功撞蜂。
3.如果一個(gè)stage失敗盲镶,那么下一個(gè)stage不會(huì)執(zhí)行侥袜,該構(gòu)建任務(wù)(pipeline)失敗。
job
job表示構(gòu)建工作溉贿,是每個(gè)stage構(gòu)建階段里具體執(zhí)行的工作枫吧。跟pipeline與stage的關(guān)系類似,stage與job也是一對(duì)多的關(guān)系宇色,即一個(gè)stage里可以定義多個(gè)job九杂,而job具有以下特點(diǎn):
1.同一個(gè) stage 中的 jobs 會(huì)并行執(zhí)行
2.同一個(gè) stage 中的 jobs 都執(zhí)行成功時(shí),該 stage 才會(huì)成功
3.如果任何一個(gè) job 失敗宣蠕,那么該 stage 失敗例隆,即該構(gòu)建任務(wù) (pipeline) 失敗
GitLab runner
在了解了上面幾個(gè)主要概念之后,我們對(duì)GitLab CI的工作流程應(yīng)該大致已經(jīng)清晰了抢蚀,即下圖:
但是還有一個(gè)疑問就是:誰(shuí)去統(tǒng)籌做上面一系列的事情呢镀层?就是GitLab runner。
工作流程
綜合上述理論皿曲,要使用GitLab CI唱逢,我們首先要在項(xiàng)目的根目錄下添加一個(gè) .gitlab-ci.yml 文件,用來(lái)定義我們的stages屋休,jobs等一系列具體內(nèi)容坞古,好讓GitLab runner據(jù)此來(lái)完成它的工作。然后需要在服務(wù)器(開發(fā)或生產(chǎn)環(huán)境)上劫樟,配置一個(gè)GitLab runner痪枫,好讓GitLab runner去統(tǒng)籌持續(xù)集中過程中的所有事织堂。
一點(diǎn)實(shí)踐
作者在自己的GitLab上初始化了一個(gè)express項(xiàng)目作為例子,帶大家來(lái)實(shí)踐一下奶陈。
配置 .gitlab-ci.yml 文件
Configuration of your jobs with .gitlab-ci.yml 這是官方文檔捧挺。
我簡(jiǎn)單配置下demo項(xiàng)目的.gitlab-ci.yml文件:
作如下解釋:
GitLab runner 會(huì)根據(jù)這個(gè)文件內(nèi)容進(jìn)行構(gòu)建,不難看出整個(gè)構(gòu)建工作分為兩個(gè)stage(階段)尿瞭,第一階段install_deps:安裝依賴包闽烙,而具體的job內(nèi)容就是執(zhí)行:npm install。 第二階段:?jiǎn)?dòng)程序声搁。每次代碼提交黑竞,都會(huì)觸發(fā)這兩個(gè)構(gòu)建工作。添加緩存cache是因?yàn)槊總€(gè)job執(zhí)行成功后疏旨,runner都會(huì)去刪除.gitignore中的文件很魂。
安裝GitLab runner
GitLab runner的安裝很簡(jiǎn)單。installing-the-runner 官方文檔
作者以Ubuntu為例:
1檐涝、添加GItLa官方庫(kù)
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash
2遏匆、安裝runner
sudo apt-get install gitlab-runner
配置GitLab runner
這里我們配置一個(gè)specific runner。至于shared runner 和 specific runner的區(qū)別谁榜,大家可以通過官方文檔的介紹幅聘,自己去選擇,這里不贅述了窃植。Shared vs specific Runners
1帝蒿、拿到token
在你的項(xiàng)目setting->CI/CD->Runners settings下面找到url和token。
2巷怜、進(jìn)行配置
在服務(wù)器上輸入以下命令來(lái)配置一個(gè)runner:
sudo gitlab-runner register
然后根據(jù)提示把信息填完葛超。(作者為了簡(jiǎn)單方便演示。Please enter the executor :選擇的shell延塑。)
查看效果
更改代碼并提交绣张,然后在項(xiàng)目的CI/CD-->pipelines選項(xiàng)里直接可以看到構(gòu)建狀態(tài):如圖
一點(diǎn)問題
在上面的實(shí)踐中我遇到的一些坑:
1、npm命令找不到:
因?yàn)間itLab runner構(gòu)建的時(shí)候是以runner身份操作服務(wù)器的关带,解決方法是:通過link命令把npm鏈接到 /usr/local/bin/npm侥涵。
總結(jié)
如果你的代碼倉(cāng)庫(kù)使用的是GitLab,那么你好像沒有什么理由不使用GitLab CI豫缨。