iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 7
0
DevOps

用 GitLab CI 玩轉自動化測試與佈署系列 第 7

Day07 - GitLab CI 如何在工作中打包?談產出工作成品 artifact

在上一篇的內容中提到了定義各個層級的變數,其中提到了「工作繼承變數」其原理使用了工作(Job)將要傳遞的變數,寫入環境變數檔案裡頭,而後透過工作成品 artifact 將之傳送到後續需要的工作中使用。那麼 GitLab CI 所提供的工作成品(artifact) 可以做些什麼呢?

初見 GitLab 工作產出工作成品 Artifact

在規劃工作流程流水線時,有些工作最終會希望產出一些成果,像是原始碼組譯後的打包成果等等,這時候就可以在工作中定義工作成品(Artifact),將需要產出的檔案搜集起來。

第一個工作成品產出

default:
  image: centos:7

build:
  stage: build
  script:
    - echo "BUILD_VERSION=hello" >> variable.env
    - echo "BUILD_NAME=GitLab" >> variable.env
  artifacts:
    paths:
      - variable.env

如上第一個工作成品範例,在 script 的內容中,將兩個變數的內容輸出到 variable.env 檔案中,而後透過 artifactspaths 的設定,將 variable.env 這個檔案作為工作成品。其在工作執行後,可以見到畫面中顯示,多了一個 Uploading artifacts... 的 Script 在進行,其將定義中的檔案上傳到 GitLab Server 上做封存。

上傳檔案工作進行

保留後上傳的工作成品檔案該怎麼取得呢?

工作成品產出後的檔案放在哪邊呢?其會上傳到 GitLab Server 的空間中,因此其一,可以透過工作產出的連結看到 「Job artifacts」的區域,在這邊可以直接下載(Download),也可以透過瀏覽(Browse)查看產出的檔案。直接下載的工作成品預設會是一個 zip 壓縮檔,內容即是在 artifacts 設定要產出的工作成品。

查看產出結果

瀏覽產出的檔案則可以透過介面上直接查看內容,如果是 GitLab 支援直接呈現的檔案也可直接呈現。另外,如有與其他系統介接的需求,也可以透過 GitLab API 取得打包後的檔案

線上直接查看檔案

保留更多不一樣的檔案

  • 保留一個資料夾及一個檔案(如 GitLab 手冊上範例),如底下的範例,將會保留 binaries 資料夾底下的所有檔案及一個 .config 檔:
artifacts:
  paths:
    - binaries/
    - .config
  • 透過 * 保留符合模式的檔案,如底下的範例,將會保留路徑符合 path/*xyz/* 路徑底下的檔案們。
job:
  artifacts:
    paths:
      - path/*xyz/*
  • 保留某路徑,但「不包含」特定檔案,如底下的範例,建立之工作成品將不包含 *.o 檔案。
artifacts:
  paths:
    - binaries/
  exclude:
    - binaries/**/*.o
  • 保留所有 GIT 沒有追蹤的檔案,可以透過 artifacts:untracked 來進行設定,當設定為 true 時,如 binaries 資料夾底下有未被 GIT 追蹤的檔案,即會列進工作成品中。
artifacts:
  untracked: true
  paths:
    - binaries/

工作成品的檔案名稱設定

提供下載的檔案名稱一定只能叫做 artifact.zip 嗎?當然是可以修改的,只要透過 artifacts:name 這個檔案中來設定,也可以透過環境變數來作定義,例如使用 CI_COMMIT_REF_NAME 就可以以該分支或者是 Git Tag 的標示為檔名,範例如下:

job:
  artifacts:
    name: "$CI_COMMIT_REF_NAME"
    paths:
      - binaries/

工作的保存期限

那麼,產出的工作成品會保存多久呢?目前現行 GitLab 的保存期限預設值為 30 天,其可以透過 artifacts:expire_in 參數來做設定,其支援的設定格式如下,當沒有設定單位的時候,預設為「秒」:

  • '42'
  • 42 seconds
  • 3 mins 4 sec
  • 2 hrs 20 min
  • 2h20min
  • 6 mos 1 day
  • 47 yrs 6 mos and 4d
  • 3 weeks and 2 days
  • never

另外,在 GitLab 13.3 版本後,也開始支援永不清除的參數 never,但使用上必須要特別考量,是否產出的工作成品真的需要永不刪除?畢竟存放在 Server 上是會占系統儲存空間的。

總結

打包工作上的成品也是工作流程設計上很重要的一環,除需要產出什麼內容的成品、成品如何保存、保存多久等,都是需要思考的一部分。

接下來,將繼續往工作流程工作與工作間彼此的關聯討論。我是墨嗓(陳佑竹),期待這系列的文章能夠讓人有些幫助。


上一篇
Day06 - GitLab CI 變數還可以怎麼定義?再談 GitLab 各層級變數
下一篇
Day08 - GitLab CI 流水線上的每個工作都要執行嗎?談工作執行條件設定
系列文
用 GitLab CI 玩轉自動化測試與佈署31

尚未有邦友留言

立即登入留言