iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 20
0
DevOps

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

Day20 - GitLab CI 返璞歸真續談 script 之自訂段落 section

在 GitLab runner 執行工作時,每個工作階段都是可以摺疊的(collapsible)的,一來是方便專注檢查每個階段,也可以透過上面顯示的時間作工作耗費時數的分析。而 script 的部分,是否也可以讓使用者自行分段呢?

插入 collapsible 示意圖

如何在 script 中建立自行定義的區段

如上方的動畫,在 GitLab runner 執行工作的畫面裡,每個工作的段落,都是允許作摺疊的,如 「Preparing the “docker+machine” executor」、「Preparing environment」等,都有屬於自己的段落。那麼,在 script 裡,可以怎麼自訂自己的段落呢?

在 GitLab 12.0 之後,開始提供使用者可以自行定義自己的段落,其語法結合了上一篇所提到的 ANSI 顏色控制碼以及 GitLab CI 定義的語法。首先是段落的起訖:

  • 段落開始標籤:
section_start:UNIX_TIMESTAMP:SECTION_NAME\r\e[0K TEXT_OF_SECTION_HEADER
  • 段落結束標籤:
section_end:UNIX_TIMESTAMP:SECTION_NAME\r\e[0K

其中起訖標籤裡提到幾個關鍵字:UNIX_TIMESTAMPSECTION_NAMETEXT_OF_SECTION_HEADER,這三個是組成自訂段落很重要的元素。

  • UNIX_TIMESTAMP 時間,需要填入「Unix timestamp」如:1601786054。每個平台上產生時間的方式可能不太一樣,以 ubuntu、CentOS 為例,會使用 date +%s 來產出。
  • SECTION_NAME 段落名稱,這個名稱在段落的開始與結束都需要填入,因此兩者名稱必須是一致的。主要是讓 GitLab Runner 在呈現時可以透過段落名稱正確的計算段落起訖及透過 timestamp 計算段落的執行時間。
  • TEXT_OF_SECTION_HEADER 段落個標題,在段落折疊時顯示在段落上方的名稱。

這邊以官方手冊上的例子來說明:

job:
  image: 'ubuntu:20.04'
  script:
    - echo -e "section_start:`date +%s`:my_first_section\r\e[0KHeader of the 1st collapsible section"
    - echo 'this line should be hidden when collapsed'
    - echo -e "section_end:`date +%s`:my_first_section\r\e[0K"

上面這個例子,其設定的 SECTION_NAME 為:my_first_section,而 TEXT_OF_SECTION_HEADER 為:Header of the 1st collapsible section

因此,在畫面輸出時,會如下表示:

顯示自訂摺疊畫面

自行定義的區段可以怎麼運用呢?

在之後的章節會再提到關於「如何讓流水線執行的更快」一些的議題,其中 script 的整理便是很重要的一環,如何找到 script 中,花費比較多時間的工作便可以透過將 script 內容進行段落的分段之後,根據每個段落的執行時間去進行語法的調整或是工作環境的調整。

以一個 PHP Laravel Framework 專案舉例來說,通常會在 CI 流程中加入單元測試環節,而 PHP 的單元測試,單就 script 的內容可能會有底下的步驟:

  1. 前置系統環境配置,更新 composer 套件、系統套件等
  2. 根據專案的套件相依描述檔 composer.json 從 composer registry 下載相關套件
  3. 根據 PHP 設定之單元測試參數進行單元測試

其對應的 Script 可能如下:

stages:
  - test

php-test:
  stage: test
  image: composer:1
  script:
    - composer install --prefer-dist
    - composer run post-root-package-install
    - composer run post-create-project-cmd
    - php ./vendor/bin/phpunit

針對這個 script 的每個步驟對其建立所屬的段落,針對上述範例增加段落後的 .gitlab-ci.yml 如下:

stages:
  - test

php-test:
  stage: test
  image: composer:1
  script:
    - echo -e "section_start:`date +%s`:composer_install\r\e[0KComposer Install"
    - composer install --prefer-dist
    - echo -e "section_end:`date +%s`:composer_install\r\e[0K"
    - echo -e "section_start:`date +%s`:project_env_prepare\r\e[0KProject Env Prepare"
    - composer run post-root-package-install
    - composer run post-create-project-cmd
    - echo -e "section_end:`date +%s`:project_env_prepare\r\e[0K"
    - echo -e "section_start:`date +%s`:phpunit_running\r\e[0KPhpUnit Execute"
    - php ./vendor/bin/phpunit
    - echo -e "section_end:`date +%s`:phpunit_running\r\e[0K"

執行後的結果如下:

分段落之後可以透過折疊去快速查看花費時間

如此在分析 runner 的執行時間瓶頸時,就可以針對瓶頸點一一突破,舉例來說如果是第一步驟前置環境配置花費比較多時間,可能就可以考慮將環境更新步驟,封裝到執行單元測試的這個 gitlab runner image。如果是第二步驟,更新 composer 的時間,就可以判斷,是否每個套件都是必要的、是不是每次都重新從 registry server 上下載,如果是,則可以考慮為 composer 配置 cache,讓近期載過的套件,可以直接從 cache 存取,加快下載速度。

總結:

有些時候某些執行階段,可能會希望一開始就是折疊後(collapsed)的狀態,這在 GitLab 13.5 之後做了這個功能,可以在段落開始宣告的內容裡頭加上 [collapsed=true] 的標注,其看起來會像是:

  • 段落開始標籤:
section_start:UNIX_TIMESTAMP:SECTION_NAME[collapsed=true]\r\e[0K TEXT_OF_SECTION_HEADER

這樣,在 GitLab Runner 呈現工作執行畫面時,就會預設為摺疊後的狀態,但這功能在撰寫這篇文章時尚未釋出,所以沒能擷取到畫面。

接下來,依然會繼續介紹關於 script 的其他細節;我是墨嗓(陳佑竹),期待這系列的文章能夠讓人有些幫助。


上一篇
Day19 - GitLab CI 返璞歸真談工作的核心 .gitlab-ci.yml 的 script
下一篇
Day21 - GitLab CI 選擇指定的 runner 來承接工作,談標籤 tags
系列文
用 GitLab CI 玩轉自動化測試與佈署31

尚未有邦友留言

立即登入留言