gitlab-ci從入門到差點放棄

Runningfyy 發表於 2022-05-15
Git

1.前言

之前一直用jeakins部署,最近了解了一下gitlab-ci,就想嘗試一下,中途遇到很多坑。
簡單的記錄一下,然後談一談自己關於部署的一些理解。

2.gitlab-ci

簡介

前端CICD我理解的就是程式碼通過本地各種校驗後的不斷整合到遠端分支,然後觸發一列行為(比如安裝,打包,測試,部署)。
一般需要兩個伺服器,
一個是ci伺服器,用來跑各種任務(安裝,打包,測試,部署等等)
另外一個就是部署伺服器,可以是一個nginx,來展示靜態資源。
jeakins可以理解為一個ci伺服器。
當然 gitlab本身也提供一個ci伺服器,那就是gitlab-ci
這期間我遇到了好多坑,快崩潰了。

安裝runner的坑

如果是gitlab專案,在setting-cicd中,左側是私人的runner,右側是其他人提供的runner
runner可以簡單理解為ci伺服器上跑的ci服務
但是需要注意的是別人的runner不一定適用你,因為人家的ci伺服器上的環境也許是java環境,沒裝node,沒裝你需要的一些全域性包。所以一般都需要自己做一個符合自己專案的前端通用runner。
image.png

第一步:runner伺服器選擇
首先如果你是個人gitlab專案,那麼你可以找隨便找一臺伺服器。但是你是公司的專案,最後找一臺公司內網伺服器安裝,應該外網伺服器不一定能訪問你公司的自己搭的gitlab。
第二步:安裝runner方式選擇
安裝的話可以參考官網安裝,有幾種方式.但是對於我來說,由於公司的伺服器不能翻牆,下載安裝包特別慢,慢到崩潰的那種,所以我直接採用先下載安裝包,再安裝的方式。注意linux x86_64 對應的安裝包是amd64,別下錯了。

第三步:安裝全域性依賴包
runner只是在ci伺服器中一個服務,本地找不到包還是得從全域性找。
所以需要ci伺服器安裝 git nvm(管理node) nrm (管理npm源) vue-cli-serve 等等一些常用的全域性包。

第四步:註冊runner
註冊很簡單,其實就是runner和gitlab建立連結

gitlab-runner register 按提示一步步來就行了,一定得是ci伺服器能連的上gitlab才行
token和url在setting-runner裡面找完事後就可以發現自定義runner多了一個且可用。
image.png

第五步:更改runner許可權
肯定得用root許可權執行,預設使用者runner 公司的伺服器不認
image.png

sudo gitlab-runner uninstall # 刪除gitlab-runner

gitlab-runner install --working-directory /home/gitlab-runner --user root   # 安裝並設定--user(設定為root)

sudo service gitlab-runner restart  # 重啟gitlab-runner

ps aux|grep gitlab-runner  # 檢視當前runner使用者

3.跑通部署服務

.gitlab-ci.yml

專案根目錄下面新增.gitlab-ci.yml檔案,每次提交的時候gitlab根據該檔案啟動runner。
具體的含義大家自己去搜,我只說幾個關鍵的地方。

  • runner有名字,我的runner叫fyy,tag引數用來執行需要觸發的runner
  • stage是階段,一般有三個階段(加上單元測試、整合測試之類的程式碼檢測的可以是四個)
  • 每階段完成,生成的檔案會被刪除,所以需要cache快取一下
  • only引數指定只有哪個分支變化才觸發runner

runner-1.png


runner-restorecache.png

一個可用的參考的指令碼

stages:
  - install
  - build
  - deploy
cache: # 快取
  paths:
    - node_modules
    - dist
第一階段-install:
  tags:
    - fyy
  stage: install
  script:
    - pnpm install
    - echo '依賴安裝成功!'
  only:
    - mono-dp

第二階段-build:
  tags:
    - fyy
  stage: build
  script:
    - pnpm buildTest
    - echo '測試環境程式碼打包成功!'
  only:
    - mono-dp

第三階段-deploy:
  tags:
    - fyy
  stage: deploy
  script:  # 具體的部署方式,這裡是常規的部署,也可以容器化部署
    - cd dist
    - tar -cf dist.tar --exclude=./dist.tar .
    - 具體的shell指令碼(ssh連結,拷貝到指定目錄,解壓之類的)
  only:
    - mono-dp

npm安裝的坑

這個時候基本上可以了,mono-dp push 上去會觸發ci操作,在pipeline裡面可以看到流程。
我遇到的問題是npm安裝的時候會報一些錯,這個應該是我pnpm.lock檔案有問題引起的。
排查問題可以直接登入遠端伺服器手動試一試,手動在runner的專案目錄裡面/home/gitlab-runner/builds/-qUnF6qy/0/webproject/convergencemarketing/npm insatll build排查下,這個時候不要走ci流程了,會很慢。

runner 打包的坑

我遇到的問題是專案有些依賴走的全域性包,比如有個包叫chalk,沒寫進Package裡,ci的時候由於Package裡沒有就不會安裝,導致打包錯誤
解決方案就是排查下,專案不要有依賴全域性包的,全部改成本地的
但是vue-cli-serve這種就沒辦法,只能ci伺服器全域性去裝

4.總結與思考

最後亮一下成功的截圖
image.png
總體來說和jekins很類似,比較適合團隊開發與大型專案開發,流程比較清楚。
但是缺點也是有的,感覺比較慢,我這個專案大概12分鐘 這還是有pnpm+快取。
對於我這種小公司小專案,直接本地打包傳上去部署(走自己寫的部署服務,或者直接使用上傳軟體或者自定義plugin)會不會更適合一點(能控制在1分鐘)。