سلیب (SAliB) که در مدت دوری از کوئرا به قاب عکسی در دیوار تبدیل شده است، پس از برگشت دوباره‌ی به کوئرا برای طراحی سوالات مسابقات کداستار (CodeStar)، با چالش‌های جدیدی در دیپلوی و مدیریت برخی از پایپ‌لاین‌های CI/CD در پروژه‌های قبلی خود مواجه شده است. او که تا پیش از این تعداد زیادی از متغیر‌های محیطی (Environment Variable) خود را به صورت کاملا دستی مدیریت می‌کرد، حال با حضور در کوئرا و غیبتش از پروژه‌هایش، با چالش عجیبی در مدیریت متغیر‌های محیطی در زمان دیپلوی مواجه شده است.

تصویر سوال سوم

سلیب برای حل مشکل مدیریت متغیر‌های محیطی (Environment Variables) به صورت دستی، فرمت فایلی .env.example و متغیر‌های محیط‌سلیبی را معرفی می‌کند. فایل .env.example یک فایل .env برای مدیریت متغیر‌های محیطی است. در این فایل مقادیر متغیر‌های مورد نیاز پروژه، به صورت کلید-مقدار‌های KEY=VALUE تعریف می‌شوند. همچنین ممکن است کلیدی تعریف شده باشد اما مقداری برای آن مشخص نشده باشد، مثل KEY=. فایل‌های .env و .env.example از کامنت‌ها نیز برای توضیح بیشتر متغیر‌های تعریف شده، با استفاده از # Comment نیز پشتیبانی می‌کنند. به مثال‌های زیر برای درک بیشتر فرمت گفته شده دقت کنید.

POSTGRES_USER=admin
POSTGRES_PASSWORD=
POSTGRES_DB=mydatabase
# POSTGRES_SALIB=temp
REDIS_HOST=redis
REDIS_PORT=6379
Bash
.env.example
REACT_APP_API_URL=https://api.example.com

# Set the google maps key for dynamic map views
# To get the api key visit google console

REACT_APP_GOOGLE_MAPS_KEY=
REACT_APP_ENV=production
Bash
.env.example

فایل‌های .env.example به صورت پیش‌فرض ابتدا توسط سلیب مقداردهی می‌شوند. به این صورت که تعدادی از کلید‌های مختلف برای هر پروژه در این فایل تعریف می‌شوند که ممکن است توسط سلیب از قبل مقداری برای آن‌ها قرار داده شود یا مقادیر آن‌ها برای مقدار‌دهی شدن در آینده خالی بمانند. او برخی از مقادیر حساس مانند رمز‌های عبور استفاده شده در پروژه‌ها را از قبل در فایل .env.example مقدار‌دهی نمی‌کند تا امنیت پروژه بیشتر حفظ شود. به مثال زیر توجه کنید:

# Database settings
DB_HOST=prod-db.server.com
DB_PORT=
DB_NAME=prod_db
DB_USER=prod_user
DB_PASSWORD=
Bash
.env.example
  • در مثال بالا، کلید‌های DB_HOST، DB_NAME، DB_USER از قبل توسط سلیب در فایل .env.example مقدار‌دهی شده‌اند. همچنین کلید‌های DB_PORT و DB_PASSWORD از قبل توسط سلیب مقدار‌دهی نشده‌اند.

حال سلیب همیشه پر مشغله، از شما برای نوشتن بش اسکریپتی که بتواند مدیریت متغیر‌های محیط‌سلیبی را آسان‌تر کند کمک می‌خواهد. شما باید در این سوال بش اسکریپتی را بنویسید که با خواندن فایل .env.example و بررسی متغیر‌های محیطی مقداردهی شده در محیط اجرای اسکریپت، فایل .env را از روی فایل .env.example بسازد، به طوری که در صورتی که کلیدی از قبل در فایل .env.example مقدار‌دهی شده بود تغییری نکند، در صورتی که کلید از قبل مقدار‌دهی نشده بود، مقدار آن کلید را از روی متغیر‌های محیطی مقدار‌دهی شده در محیط اجرای اسکریپت دریافت کرده و آن را در فایل جدید .env به عنوان مقدار کلید قرار دهد. در نهایت در صورتی که کلیدی مانند KEY وجود داشته باشد که نه از قبل در فایل .env.example مقدار‌دهی شده باشد و نه در محیط اجرای اسکریپت مقداری برای آن مشخص شده باشد، باید به صورت TODO_KEY مشخص شود تا به سلیب یادآوری شود که باید این مقدار را به صورت دستی مقدار‌دهی کند.

ورودی اسکریپت

ورودی اسکریپت، فایل .env.example است که شامل تعدادی KEY=VALUE و کامنت‌های مختلف می‌باشد. همچنین توجه داشته باشید که می‌تواند کلید‌هایی وجود داشته باشد که مقدار نداشته باشد، این کلید‌ها به صورت KEY= مشخص می‌شوند. سیستم داوری محتویات فایل .env.example را به صورت جدا با استریم ریدایرکشن و یا پایپلاین کردن به اسکریپت شما ورودی نمی‌دهد و اسکریپت نوشته شده در فایل solution.sh خود به تنهایی قرار است تا خواندن از فایل .env.example و نمایش خروجی را انجام دهد.

خروجی اسکریپت

فایل solution.sh شما توسط سیستم داوری اجرا شده و با خواندن فایل .env.example و انجام پردازش بر روی آن باید فایل .env که شامل متغیر‌های محیط‌سلیبی است را به صورت گفته شده ذخیره‌سازی کند. به صورت کلی تغییرات زیر باید بر روی فایل .env.example اولیه اعمال شوند:

  • در صورتی که کلیدی از قبل در فایل .env.example مقدار‌دهی شده بود، مقدارش تغییری نکند، حتی اگر مقدار دیگری برای آن در محیط اجرا تعریف شده باشد.
  • در صورتی که مقدار یک کلید در فایل .env.example تعریف نشده بود، باید بررسی شود که آیا در محیط اجرا، متغیری محیطی با این نام تعریف شده است یا نه، در صورتی که تعریف شده بود مقدارش در فایل .env برای کلید مورد نظر قرار بگیرد.
  • در صورتی که کلیدی، نه در فایل .env.example از ابتدا و نه در محیط اجرا به صورت متغیر محیطی تعریف شده بود، باید مقداری که برای کلید KEY آن قرار میگیرد، به صورت TODO_KEY باشد.

همچنین توجه داشته باشید که سیستم داوری به بزرگی و کوچکی حروف حساس است. کامنت‌های نوشته شده در فایل .env.example اولیه باید به همان صورت بدون تغییر باقی بمانند، حتی اگر تعریفی از یک کلید به صورت کامنت شده باشند، مثل # KEY=

مثال

ورودی نمونه ۱

# Database settings
DB_HOST=localhost
DB_PORT=
DB_NAME=myapp_db
DB_USER=postgres
DB_PASSWORD=
Bash
.env.example

خروجی نمونه ۱

# Database settings
DB_HOST=localhost
DB_PORT=5432
DB_NAME=myapp_db
DB_USER=postgres
DB_PASSWORD=password1
Bash
.env
  • در فایل ورودی .env.example کلید‌های DB_PORT و DB_PASSWORD از قبل مقداردهی نشده‌ بودند. مقدار کلید‌های DB_PORT و DB_PASSWORD در محیط اجرای اسکریپت به ترتیب به صورت 5432 و password1 مشخص‌ شده‌اند که با اجرای اسکریپت نوشته شده، این کلید‌ها نیز در فایل .env مقداردهی می‌شوند.

ورودی نمونه ۲

# Feature flags
ENABLE_NEW_FEATURE=
ENABLE_OLD_FEATURE=

# Logging configuration
ENABLE_LOGGING=
LOG_LEVEL=debug

# Security settings
SECURITY_MODE=
SESSION_TIMEOUT=300
Bash
.env.example

خروجی نمونه ۲

# Feature flags
ENABLE_NEW_FEATURE=TODO_ENABLE_NEW_FEATURE
ENABLE_OLD_FEATURE=TODO_ENABLE_OLD_FEATURE

# Logging configuration
ENABLE_LOGGING=TODO_ENABLE_LOGGING
LOG_LEVEL=debug

# Security settings
SECURITY_MODE=secret
SESSION_TIMEOUT=300
Bash
.env.example

آن‌چه باید آپلود کنید

  • توجه: شما باید موارد خواسته شده در سوال را تنها در قالب فایل solution.sh پیاده‌سازی کرده و ارسال کنید.

  • توجه: فایل solution.sh توسط سیستم داوری اجرا می‌شود و نیازی به نوشتن دستور یا اسکریپت دیگری برای اجرای این فایل نیست.

  • توجه: سیستم داوری محتویات فایل .env.example را به صورت جدا با استریم ریدایرکشن و یا پایپلاین کردن به اسکریپت شما ورودی نمی‌دهد و اسکریپت نوشته شده در فایل solution.sh خود به تنهایی قرار است تا خواندن از فایل .env.example و نمایش خروجی را انجام دهد.


ارسال پاسخ برای این سؤال
فایلی انتخاب نشده است.