iT邦幫忙

2025 iThome 鐵人賽

DAY 13
0

隨著 GitLab 每個月固定釋出新版本持續的演進,GitLab CI/CD YAML 的語法也陸續有一些更新、調整,難免,也會有一些語法會進入棄用階段,這一篇將會列出現行 GitLab CI/CD YAML 的語法,有哪些已經宣告即將停用,也會順帶提出目前可能的替代方案。

在目前最新版本的 GitLab 手冊中 Deprecated keywords紀錄著即將停用的語法關鍵字,這邊會分為幾個部分紀錄:

部分原本可以放置在 global 區域的調整到 default

.gitlab-ci.yml 的 global 區域,目前宣告,需要移動到 default 區段,如:imageservicescachebefore_scriptafter_script,移動後語法沒有變化,只是改放置到 default 區段下,例如手冊上的範例:

default:
  image: ruby:3.0
  services:
    - docker:dind
  cache:
    paths: [vendor/]
  before_script:
    - bundle config set path vendor/bundle
    - bundle install
  after_script:
    - rm -rf tmp/

only/except 調整為 rules 語法

另外,還有一系列語法是預備完全棄用的,如 only/except 這一對語法,主要原因是因為這語法可以由 rules 完全取代,因為彼此可以替代的語法同時存在 Job 中時,兩者很容易有所混淆。雖然目前還沒直接停用,也建議使用者目前可以把語法一律調整為 rules

透過 only / except 設定 Job 只在特定分支執行,或不在特定分支執行:

job1:
  script: echo
  only:
    - main
    - /^issue-.*$/
    - merge_requests

job2:
  script: echo
  except:
    - main
    - /^stable-branch.*$/
    - schedules

使用 rules 可以直接以 rules:if 替代,可以修改如下:

job1:
  script: echo
  rules:
    - if: $CI_COMMIT_BRANCH == "main"
    - if: $CI_COMMIT_BRANCH =~ "/^issue-.*$/"
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"

job2:
  script: echo
  rules:
    - if: $CI_COMMIT_BRANCH == "main"
    - if: $CI_COMMIT_BRANCH !~ "/^stable-branch.*$/"
    - if: $CI_PIPELINE_SOURCE == "schedule"

變數的比較及邏輯結合:

  • 相等 == 及 不相等 !=
    • if: $VARIABLE == "some value"
    • if: $VARIABLE != "some value"
  • 正規表示式成立 =~ 與不成立 !~
    • if: $VARIABLE =~ /^content.*/
    • if: $VARIABLE !~ /^content.*/
  • 前後邏輯 AND && 、前後邏輯 OR ||
    • ($CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH == "develop") && $MY_VARIABLE

當未設定條件時的預設條件:

only/except 的說明內容中有提到,所有的 job 當沒有設定條件時,其 only 的預設值如 job2,這邊說明的是因為有預設值,所以 job1 及 job2 的執行條件其實是一致的:

job1:
  script: echo "test"

job2:
  script: echo "test"
  only:
    - branches
    - tags

當未來 only/except 正式移除之後,可以想像,其代表的則會是:

job2:
  script: echo "test"
  rules:
    - if: $CI_COMMIT_BRANCH
    - if: $CI_COMMIT_TAG

if: $CI_COMMIT_BRANCH  代表的是當有 git 進行 push 到任何分支的動作而 if: $CI_COMMIT_TAG 則是代表有 push 任何的 tag。

其他原本可以在 only/except 中使用的還有 only:changesexcept:changes 其可以直接以 rules:changes 替代就不再贅述。

總結

隨著 GitLab 每個月的版本推進,在每個月的變更清單中,可以看到 GitLab 持續不斷的調整讓 CI/CD 的環境變得更加彈性、靈活,還有可以重複使用,當然有變更,就多少會有一些相對比較不成熟的功能做停用或棄用,如果要跟著 GitLab 一起前進,適時的檢視身邊的 CI/CD YAML 並對其做一些重構也是必要的。我是墨嗓(陳佑竹),期待這次的內容能帶給你實用的啟發與幫助。

參考連結


上一篇
Day12 - 透過 GitLab CI/CD Step 傳遞資訊
下一篇
Day14 - GitLab CI/CD YAML 的 rules 與 needs
系列文
GitLab CI 2025:深入玩轉流水線與實戰紀錄14
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言