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
  • پژواک با vars:
    $ echo $MSG
    Custom in job .gitlab-ci.yml
    Job succeeded

ارث با گروه و داخل .gitlab-ci.yml [منابع]

بیایید سعی کنیم 2 مثال قبلی را با هم ترکیب کنیم. متغیرهای گروه بر متغیرهای داخل .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
  • پژواک با vars:
    $ 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
  • پژواک با vars:
    $ 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
  • پژواک با vars:
    $ echo $MSG
    Job succeeded

ارث با شامل و گروه ها [منابع]

در اینجا سعی خواهیم کرد پروژه-2 را در پروژه-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
  • پژواک با vars:
    $ echo $MSG
    B
    Job succeeded

ارث با شامل [منابع]

در اینجا سعی خواهیم کرد پروژه-2 را در پروژه-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
  • پژواک با vars:
    $ echo $MSG
    Custom in job .gitlab-ci.yml
    Job succeeded

نتایج به شرح زیر است اولویت های:

  1. متغیرها در تنظیمات پروژه
  2. متغیرها در گروه ها
  3. متغیرهایی که به شدت در داخل کارها مشخص شده اند (از جمله فایل های موجود)
  4. متغیرهای سراسری در gitlab-ci.yml
  5. متغیرهای سراسری در داخل فایل‌های شامل

نتیجه

واضح ترین نکته این است که قاعده "هر چه یک متغیر به کد نزدیک تر باشد، مهم تر است" ابتدا برای گروه ها کار می کند، و سپس همان قانون برای متغیرهای داخل .gitlab-ci.yml، اما فقط تحت شرط که متغیرها در گروه ها مشخص نشده اند.
در مرحله بعد، یک نکته مهم درک این موضوع است که فضای جهانی برای gitlab-ci.yml اصلی و شامل آن مشترک است. و فایلی که در آن inclusion رخ می دهد دارای اولویت است.

منبع: www.habr.com

اضافه کردن نظر