在 GitLab runner 執行工作時,每個工作階段都是可以摺疊的(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_TIMESTAMP
、SECTION_NAME
及 TEXT_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
的內容可能會有底下的步驟:
其對應的 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 的其他細節;我是墨嗓(陳佑竹),期待這系列的文章能夠讓人有些幫助。