1. 程式人生 > >.gitlab-ci.yml Gitlab CI 簡單配置

.gitlab-ci.yml Gitlab CI 簡單配置

Gitlab

最近離職,一張機票跨越小半個中國,來魔都找了一份喜歡的工作。穩定了就開始繼續寫東西啦 ?‍

畢業實習的時候在公司裡面積極推 Git,考慮到同事的學習成本,在 GogsGitlab 之間,我選了 Gogs,不為別的,只為原生中文 ?。然後一大段時間,我都是在 Github 和 Gogs 這兩個平臺進行協作的,Gitlab 的大名也不時的在耳邊響起。

現在的公司版本控制用的是 Gitlab,所以藉此機會我也簡單適應了一下,其實和 Github 差不太多,更多的是 Gitlab 提供了一整套的解決方案,其中就包含了 CI/CD。

我還是比較崇尚那句話的:一切能自動化的工作都應該被自動化掉!

.gitlab-ci.yml

在 Gitlab 官網上有很多關於 gitlab CI 如何搭建的介紹,在此我就不多做介紹了,就是照著程式碼敲到命令列執行即可,現在要講的是如何配置一個簡單的 Gitlab CI 配置檔案。

.gitlab-ci.yml 這個檔案即是 Gitlab CI 的配置檔案,你需要將這個檔案放到你 repo 的根目錄即可,然後你每次提交, Gitlab 都會自動地去讀取執行該檔案的內容,如果你提交了一個新的 .gitlab-ci.yml,那 gitlab CI 會使用你剛提交的那份配置檔案進行 CI

下面就貼一份簡單的用於部署前端專案的 .gitlab-ci.yml 檔案:

# 這個是我現在專案初期使用的一個配置檔案
# 下面我就開始簡單的講一下各個配置的作用
# yml 檔案支援註釋,像當前文字這樣,左側以 # 號開頭即為註釋

# 下面這個是表示,我們執行 CI 用的映象是 kkarczmarczyk/node-yarn:latest
# 因為我司的 CI 任務是選的在 Docker 上執行,所以每次執行 CI 任務的時候,都會新啟動一個 Docker 容器
# 然後在容器中依次執行下面的命令
# 注意:不同的 stage 執行前,都會將該容器環境設定為初始化時的狀態
image: kkarczmarczyk/node-yarn:latest

# 定義全域性的快取策略,如上所說,每個不同的 stage,CI 都會重新啟動一個新的容器,所以我們之前 stage 中的檔案都會消失
# 那在前端開發中,就意味著每個 stage 都要重新完整裝一次 node_modules,這樣的時間和網路成本都不低
# 所以我們選擇將這些檔案快取下來
# 但是,快取也要講究實效性,例如我在第二次的提交中增加了一個庫,那第二次的 CI 就不能再重複使用上一次的 node_modules 快取了
# 在 .gitlab-ci.yml 中,我們通過設定 cache 的 key 來區分不同的快取
cache:
  # 該 Key 的值為一個系統變數,gitlab 在執行的時候內建了不少的系統變數供使用,下面的配置表示
  # 以每次提交的 ref 號為 key 來區分不同快取,效果就是同一次提交中的所有 stage 用同一份 cache
  key: ${CI_COMMIT_REF_SLUG}

# 定義 stage,stage 可以簡單的理解為“步驟”,會順序執行,如果上一步錯了,那不會繼續執行下一步
# 比如像下面我定義的,第一步先初始化,第二步檢查程式碼規範,第三步進行單元測試,第四步構建,第五步就直接將專案部署到伺服器
stages:
  - init
  - lint
  - unit_test
  - build
  - deploy

# 這個是某個任務的名稱,你可以隨意起名
install_packages:
  # 指定該任務所屬的步驟,每到一個步驟,該步驟所對應的所有任務都會並行執行
  stage: init
  # 指定要快取的檔案以及資料夾
  cache:
    # 這個屬性是 gitlab 比較新版本里面加的特性,意思是在這一步,我只上傳這個快取,我不會拉取該快取
    policy: push
    # 指定快取的內容,在下面我快取了 node_modules 這個資料夾,你還可以在下面繼續新增檔案或者資料夾
    paths:
      - node_modules/
  # 該任務要執行的指令碼,順序執行
  # 都是 bash 命令
  # 預設當前目錄就是 repo 的根目錄
  script:
    # 我先列出所有檔案的列表,便於 script 出錯後進行除錯
    - "ls -la"
    # 設定 yarn 的源,會快一些
    - 'yarn config set registry "https://registry.npm.taobao.org"'
    # 安裝所有依賴,也就是 node_modules
    - "yarn"

# 執行完 init 這個 stage(步驟)後,我們的 node_modules 目錄就快取下來了
# 然後我們就開始執行程式碼檢查
lint_code:
  # 對應的步驟是程式碼檢查,可以多個任務指向同一個 stage,這些任務將會被並行執行
  stage: lint
  # 定義快取
  cache:
    # 下面的配置指示,我們當前只拉取快取,不上傳,這樣會節省不少時間
    policy: pull
    # 指定要快取的檔案/資料夾
    paths:
      - node_modules/
  # 該任務要執行的 bash 指令碼
  script:
    - "ls -la"
    - "yarn lint"

# 單元測試
unit_test:
  # 隸屬於 單元測試 這個步驟
  stage: unit_test
  # 同 lint_code 任務,拉取快取,我們就不用再重新下載 node_modules 了
  cache:
    policy: pull
    paths:
      - node_modules/
  # 執行 bash 命令
  script:
    - "ls -la"
    - "yarn test:unit"

build:
  stage: build
  cache:
    policy: pull
    paths:
      - node_modules/
  # artifacets 是打包你指定的檔案或者資料夾,然後你可以通過 gitlab 的頁面進行下載的
  artifacts:
    # artifacets 的名字
    name: "dist"
    # artifacets 的過期時間,因為這些資料都是直接儲存在 Gitlab 機器上的,過於久遠的資源就可以刪除掉了
    expire_in: 60 mins
    # 制定需要打包的目錄,這裡我把 dist 目錄給打包了,準備釋出到伺服器
    paths:
      - dist/
  script:
    - "ls -la"
    - "yarn build"

# 部署任務
deploy:
  stage: deploy
  # 該命令指定只有 master 分支才能夠執行當前任務
  only:
    - master
  # 部署指令碼,在下面的程式碼中,我用到了很多類似 ${AMAZON_PEM} 的變數,由於我們的私鑰、Ip 都算是不宜公開顯示的資訊,
  # 所以我用到了 Gitlab 的變數工具,在 repo 的 CI/CD > Environments 中,這些變數值只有專案管理員才有許可權訪問
  script:
    - "ls -la"
    - "ls -Rl dist"
    - 'echo "${AMAZON_PEM}" > amazon.pem'
    - "chmod 600 amazon.pem"
    - "scp -o StrictHostKeyChecking=no -i amazon.pem -r dist/* ${AMAZON_NAME_IP}:/usr/share/nginx/html/"

坑 s

在使用的過程中,還是經歷了一些坑的,也記錄下來

  • 公司的 Gitlab 估計是版本問題,cache 基本是失效的,所以無奈,我直接添加了一個 before_script 來在每個 jobs 執行前都完整安裝一次 node_modules
  • 將伺服器私鑰儲存到 Gitlab 的 CI 變數中後,本想通過 echo ${AMAZON_PEM} > amazon.pem,把私鑰儲存為檔案使用,結果發現 echo 出來的文字沒有了換行,最終解決辦法是 echo "${AMAZON_PEM}" > amazon.pem(就只需要加兩個引號)