Gitlab-CI如何繼承環境變數?

Gitlab 中的變數可以在幾個地方設定:

  1. 在群組設定中
  2. 在項目設定中
  3. 裡面.gitlab-ci.yml

在這種情況下,群組和項目設定中的變數可以設定為“檔案”或“常規變數”,並選取“受保護”和“屏蔽”複選框。

Gitlab-CI如何繼承環境變數?

我們先從簡單的繼承開始,逐漸變得更複雜。

最終的優先列表可以在文件末尾找到。

組繼承 [來源]

來自組的變數是繼承的,規則是距離項目越近的組,其值越重要。

具有變數的組

Gitlab-CI如何繼承環境變數?

.gitlab-ci.yml

image: busybox:latest
variables:
  GIT_STRATEGY: none

echo:
  stage: test
  script:
    - echo $MSG

管道結果

$ echo $MSG
B

如果變數沒有在 B 組中指定,那麼我們會看到值 A。

繼承 .gitlab-ci.yml 中的變量 [來源]

這裡的一切都非常簡單:您可以全域設定一個變量,也可以在作業中覆寫它。

具有變數的組

Gitlab-CI如何繼承環境變數?

.gitlab-ci.yml

現在讓我們建立 2 個作業,在其中一個作業中我們將明確指定 $MSG。

image: busybox:latest
variables:
  GIT_STRATEGY: none
  MSG: "Custom in global .gitlab-ci.yml"

echo:
  stage: test
  script:
    - echo $MSG

echo with var:
  stage: test
  variables:
    MSG: "Custom in job .gitlab-ci.yml"
  script:
    - echo $MSG

管道結果

  • 迴聲:
    $ echo $MSG
    Custom in global .gitlab-ci.yml
    Job succeeded
  • 與變數回顯:
    $ echo $MSG
    Custom in job .gitlab-ci.yml
    Job succeeded

與群組和 .gitlab-ci.yml 內部的繼承 [來源]

讓我們試著結合前面的兩個例子。 群組變數優先於 .gitlab-ci.yml 內的變數。

具有變數的組

Gitlab-CI如何繼承環境變數?

.gitlab-ci.yml

image: busybox:latest
variables:
  GIT_STRATEGY: none
  MSG: "Custom in global .gitlab-ci.yml"

echo:
  stage: test
  script:
    - echo $MSG

echo with var:
  stage: test
  variables:
    MSG: "Custom in job .gitlab-ci.yml"
  script:
    - echo $MSG

管道結果

  • 迴聲:
    $ echo $MSG
    Y
    Job succeeded
  • 與變數回顯:
    $ echo $MSG
    Y
    Job succeeded

透過在項目設定中指定變數進行繼承 [來源]

專案設定中的變數始終具有最高優先權! 且 .gitlab-ci.yml 中指定的變數不起任何作用。

具有變數的組

組變數的優先權較低。
Gitlab-CI如何繼承環境變數?

.gitlab-ci.yml

讓我們使用前面範例中的文件。 這裡再次在 .gitlab-ci.yml 中指定了變量,但組內的變量仍然優先於它們。

image: busybox:latest
variables:
  GIT_STRATEGY: none
  MSG: "Custom in global .gitlab-ci.yml"

echo:
  stage: test
  script:
    - echo $MSG

echo with var:
  stage: test
  variables:
    MSG: "Custom in job .gitlab-ci.yml"
  script:
    - echo $MSG

管道結果

  • 迴聲:
    $ echo $MSG
    project-3
    Job succeeded
  • 與變數回顯:
    $ echo $MSG
    project-3
    Job succeeded

空值繼承 [來源]

空值也是一個值
空值不等於 Null

具有變數的組

Gitlab-CI如何繼承環境變數?

.gitlab-ci.yml

image: busybox:latest
variables:
  GIT_STRATEGY: none
  MSG: "Custom in global .gitlab-ci.yml"

echo:
  stage: test
  script:
    - echo $MSG

echo with var:
  stage: test
  variables:
    MSG: "Custom in job .gitlab-ci.yml"
  script:
    - echo $MSG

管道結果

  • 迴聲:
    $ echo $MSG
    Job succeeded
  • 與變數回顯:
    $ echo $MSG
    Job succeeded

使用 include 和 groups 進行繼承 [來源]

這裡我們將嘗試將project-2包含在project-3中
在這種情況下,團體具有優先權。

具有變數的組

Gitlab-CI如何繼承環境變數?

.gitlab-ci.yml

並在 .gitlab-ci.yml 中全域設定變量

variables:
 MSG: "With  include  .gitlab-ci.yml"
include:
 - project: how-is-gitlab-ci-inherit-environment-variables/z/y/project-3
   file: '.gitlab-ci.yml'

管道結果

  • 迴聲:
    $ echo $MSG
    B
    Job succeeded
  • 與變數回顯:
    $ echo $MSG
    B
    Job succeeded

繼承包含 [來源]

這裡我們將嘗試將project-2包含在project-3中。
條件是:團體和專案本身都沒有任何變數。

具有變數的組

Gitlab-CI如何繼承環境變數?

.gitlab-ci.yml

與前面的範例相同

variables:
 MSG: "With  include  .gitlab-ci.yml"
include:
 - project: how-is-gitlab-ci-inherit-environment-variables/z/y/project-3
   file: '.gitlab-ci.yml'

管道結果

  • 迴聲:
    $ echo $MSG
    With include .gitlab-ci.yml
    Job succeeded
  • 與變數回顯:
    $ echo $MSG
    Custom in job .gitlab-ci.yml
    Job succeeded

結果如下 優先事項:

  1. 項目設定中的變數
  2. 組中的變數
  3. 作業內嚴格指定的變數(包括包含的文件)
  4. .gitlab-ci.yml 內的全域變量
  5. 包含文件內的全域變數

結論

最不明顯的一點是,「變數離程式碼越近,它就越重要」這一規則首先適用於群組,然後同樣的規則適用於 .gitlab-ci.yml 中的變量,但僅在以下條件下有效組中的變數未指定。
接下來,重要的一點是要了解主 .gitlab-ci.yml 和包含的 .gitlab-ci.yml 的全域空間是通用的。 並且發生包含的文件具有優先權。

來源: www.habr.com

添加評論