5- تعلم YAML بالتفصيل

الفصل الخامس: تعلم YAML بالتفصيل

الآن سندخل إلى المرحلة التي تميز الشخص الذي يفهم YAML فعلاً عن الشخص الذي ينسخ ويلصق من الإنترنت.

معظم الناس يحفظون:

name: Laravel CI

لكنهم لا يعرفون:

  • ما هو name
  • ما هو Laravel CI
  • لماذا توجد :
  • لماذا لا توجد { }
  • لماذا لا توجد ;

نحن سنفهم كل حرف.


كيف يفكر YAML؟

قبل أي شيء يجب أن تعرف أن YAML عبارة عن:

Key: Value

أي:

مفتاح : قيمة

مثل القاموس.


مثال:

name: Ahmed

يفهمها YAML:

name = Ahmed

مثال:

age: 25

يفهمها:

age = 25

مثال:

city: Ankara

يفهمها:

city = Ankara

كل YAML تقريباً مبني على هذا المفهوم.


أولاً: القيم (Values)


أبسط قيمة

name: Laravel CI

دعنا نفككها حرفاً حرفاً.


name

هذا يسمى:

Key

أو:

Property

أو:

Attribute

هو اسم الحقل.


:

النقطتان لهما معنى مهم جداً.

تعني:

القيمة تبدأ هنا

بدون النقطتين:

name Laravel CI

هذا خطأ.


يجب:

name: Laravel CI

Laravel CI

هذه تسمى:

Value

القيمة المخزنة داخل المفتاح.


تمثيلها ذهنياً:

name

└── Laravel CI

أو:

{
"name": "Laravel CI"
}

أنواع القيم


نص String

name: Laravel CI

app: CloudSoft

country: Turkey

كلها نصوص.


رقم Number

port: 3306

version: 8

workers: 10

هنا YAML يفهم أنها أرقام.


Boolean

القيم المنطقية.


ssl: true

debug: false

يفهمها:

صح
خطأ

Null

لا توجد قيمة.


password: null

أو:

password:

معناها:

لا توجد قيمة

مثال واقعي

application:
name: CloudSoft
version: 1.0
debug: false

يفهمها YAML:

application

├── name = CloudSoft
├── version = 1.0
└── debug = false

ثانياً: القوائم Lists

القائمة تعني:

مجموعة عناصر

مثال حياتي:

لديك فروع Git:

main
develop
staging

كيف نكتبها؟

branches:
- main
- develop
- staging

دعنا نفككها.


branches

اسم القائمة.


branches:

معناها:

سأبدأ قائمة اسمها branches

هذه الشرطة مهمة جداً.

تعني:

عنصر جديد داخل القائمة

مثال:

branches:
- main

يفهمها YAML:

branches
└── main

مثال:

branches:
- main
- develop

يفهمها:

branches
├── main
└── develop

مثال أكبر:

branches:
- main
- develop
- testing
- production

تصبح:

branches
├── main
├── develop
├── testing
└── production

JSON المقابل:

{
"branches": [
"main",
"develop",
"testing",
"production"
]
}

لماذا القوائم مهمة في GitHub Actions؟

ستراها دائماً.

مثال:

on:
push:
branches:
- main
- develop

المعنى:

شغل Workflow إذا حدث Push على:

main
أو
develop

قائمة تحتوي أرقام

ports:
- 80
- 443
- 3306

تمثيلها:

ports
├── 80
├── 443
└── 3306

قائمة تحتوي كلمات

services:
- nginx
- mysql
- redis

تمثيلها:

services
├── nginx
├── mysql
└── redis

ثالثاً: الكائنات Objects

وهذا الجزء هو أهم شيء لفهم GitHub Actions.


الكائن:

شيء يحتوي خصائص بداخله

مثال:

لدينا قاعدة بيانات.

قاعدة البيانات لها:

Host
Port
Username
Password

نكتب:

database:
host: localhost
port: 3306

دعنا نفككها.


database

اسم الكائن.


database:

معناها:

سأبدأ كائناً اسمه database

host

خاصية داخل الكائن.


host: localhost

تعني:

host = localhost

port

خاصية أخرى.


port: 3306

تعني:

port = 3306

الشجرة:

database
├── host
└── port

JSON:

{
"database": {
"host": "localhost",
"port": 3306
}
}

مثال أكبر

server:
host: 192.168.1.10
port: 80
ssl: true

تمثيلها:

server
├── host
├── port
└── ssl

كائن داخل كائن

وهذا موجود كثيراً في GitHub Actions.


application:
database:
host: localhost
port: 3306

الشجرة:

application
└── database
├── host
└── port

لاحظ كيف أن:

المسافات = العلاقات

رابعاً: قائمة كائنات

هذه من أكثر الأشياء استخداماً في GitHub Actions.


مثال:

users:
- name: Ahmed
age: 25

- name: Ali
age: 30

تمثيلها:

users
├── Ahmed
│ └── 25

└── Ali
└── 30

JSON:

{
"users": [
{
"name": "Ahmed",
"age": 25
},
{
"name": "Ali",
"age": 30
}
]
}

أين سنرى هذا في GitHub Actions؟

في:

steps:

مثال:

steps:
- name: Install Dependencies
run: composer install

- name: Run Tests
run: php artisan test

كل عنصر داخل القائمة:

- name:

هو Object كامل.


خامساً: النصوص متعددة الأسطر

وهذه من أهم الأشياء في GitHub Actions.


مثال:

run: |
composer install
php artisan test

دعنا نفككها.


run

المفتاح.


run:

يعني:

نفذ أوامر

|

هذا الرمز يسمى:

Literal Block Scalar

لكن لا تحفظ الاسم.

احفظ وظيفته فقط.


معناه:

احتفظ بالأسطر كما هي

أي أن كل سطر بعده يعتبر جزءاً من النص.


مثال:

run: |
echo "Hello"

echo "World"

الناتج:

echo "Hello"

echo "World"

مثال GitHub Actions

run: |
composer install
php artisan migrate
php artisan test

GitHub ينفذ فعلياً:

composer install

php artisan migrate

php artisan test

لماذا لا نكتبها كسطر واحد؟

بدلاً من:

- run: composer install

- run: php artisan migrate

- run: php artisan test

يمكن جمعها:

run: |
composer install
php artisan migrate
php artisan test

الفرق بين | و >

هذا سؤال شائع جداً.


|

يحافظ على السطور.

message: |
Hello
World

الناتج:

Hello
World

>

يدمج السطور.

message: >
Hello
World

الناتج:

Hello World

في GitHub Actions ستستخدم:

|

في 95% من الحالات.


كيف يقرأ GitHub ملف YAML؟

مثال:

name: Laravel CI

on:
push:

jobs:
test:
runs-on: ubuntu-latest

steps:
- run: composer install

- run: php artisan test

GitHub يبني هذه الشجرة داخلياً:

name
└── Laravel CI

on
└── push

jobs
└── test
├── runs-on
│ └── ubuntu-latest

└── steps
├── composer install
└── php artisan test

وهنا تبدأ بفهم السر الحقيقي:

YAML ليس لغة برمجة.

YAML عبارة عن شجرة بيانات (Data Tree)، وGitHub Actions يقرأ هذه الشجرة ثم يحولها إلى Workflow حقيقية يتم تنفيذها على Runner. وفي الدرس القادم سنبدأ أول ملف GitHub Actions حقيقي ونحلله سطراً سطراً حتى تفهم كيف تتحول هذه الشجرة إلى Pipeline تعمل فعلياً.