**سلیب** *(SAliB)* که در **مدت دوری از کوئرا** به **قاب عکسی در دیوار** تبدیل شده است، پس از برگشت دوبارهی به کوئرا برای طراحی سوالات [**مسابقات کداستار** *(CodeStar)*](https://quera.org/events/codestar-0403)، با چالشهای جدیدی در **دیپلوی** و **مدیریت** برخی از **پایپلاینهای** *CI/CD* در پروژههای قبلی خود مواجه شده است. او که تا پیش از این **تعداد زیادی** از [**متغیرهای محیطی** *(Environment Variable)*](https://en.wikipedia.org/wiki/Environment_variable) خود را **به صورت کاملا دستی** مدیریت میکرد، حال با حضور در کوئرا و غیبتش از پروژههایش، با **چالش عجیبی** در **مدیریت متغیرهای محیطی** در زمان دیپلوی مواجه شده است.

سلیب برای حل مشکل مدیریت [**متغیرهای محیطی** *(Environment Variables)*](https://en.wikipedia.org/wiki/Environment_variable) به صورت دستی، **فرمت فایلی** `.env.example` و **متغیرهای محیطسلیبی** را معرفی میکند. **فایل** `.env.example` یک **فایل** `.env` برای مدیریت **متغیرهای محیطی** است. در این فایل مقادیر **متغیرهای مورد نیا**ز پروژه، به صورت **کلید-مقدارهای** `KEY=VALUE` تعریف میشوند. همچنین **ممکن** است کلیدی تعریف شده باشد اما **مقداری** برای آن **مشخص نشده باشد،** مثل `KEY=`. **فایلهای** `.env` و `.env.example` از **کامنتها** نیز برای **توضیح بیشتر** متغیرهای تعریف شده، با استفاده از `# Comment` نیز پشتیبانی میکنند. **به مثالهای زیر برای درک بیشتر فرمت گفته شده دقت کنید.**
```bash .env.example bash
POSTGRES_USER=admin
POSTGRES_PASSWORD=
POSTGRES_DB=mydatabase
# POSTGRES_SALIB=temp
REDIS_HOST=redis
REDIS_PORT=6379
```
```bash .env.example bash
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
```
**فایلهای** `.env.example` **به صورت پیشفرض** ابتدا توسط سلیب **مقداردهی میشوند.** به این صورت که **تعدادی از کلیدهای مختلف** برای هر پروژه در این فایل تعریف میشوند که **ممکن است توسط سلیب** از قبل **مقداری برای آنها** قرار داده شود یا مقادیر آنها برای **مقداردهی شدن در آینده خالی** بمانند. او برخی از مقادیر حساس مانند **رمزهای عبور** استفاده شده در پروژهها را از قبل در فایل `.env.example` **مقداردهی نمیکند** تا امنیت پروژه **بیشتر** حفظ شود. به مثال زیر توجه کنید:
```bash .env.example bash
# Database settings
DB_HOST=prod-db.server.com
DB_PORT=
DB_NAME=prod_db
DB_USER=prod_user
DB_PASSWORD=
```
- در مثال بالا، کلیدهای `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=`
# مثال
## ورودی نمونه ۱
```bash .env.example bash
# Database settings
DB_HOST=localhost
DB_PORT=
DB_NAME=myapp_db
DB_USER=postgres
DB_PASSWORD=
```
## خروجی نمونه ۱
```bash .env bash
# Database settings
DB_HOST=localhost
DB_PORT=5432
DB_NAME=myapp_db
DB_USER=postgres
DB_PASSWORD=password1
```
- در **فایل ورودی** `.env.example` **کلیدهای** `DB_PORT` و `DB_PASSWORD` از قبل مقداردهی **نشده** بودند. مقدار **کلیدهای** `DB_PORT` و `DB_PASSWORD` در **محیط اجرای اسکریپت** به ترتیب به صورت `5432` و `password1` مشخص شدهاند که با **اجرای اسکریپت** نوشته شده، این کلیدها نیز در فایل `.env` **مقداردهی** میشوند.
## ورودی نمونه ۲
```bash .env.example bash
# 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 bash
# 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
```
# آنچه باید آپلود کنید
+ **توجه:** شما باید موارد خواسته شده در سوال را **تنها** در قالب **فایل** `solution.sh` پیادهسازی کرده و **ارسال** کنید.
+ **توجه:** فایل `solution.sh` توسط سیستم داوری اجرا میشود و **نیازی به نوشتن دستور یا اسکریپت دیگری برای اجرای این فایل نیست.**
+ **توجه:** سیستم داوری محتویات فایل `.env.example` را به صورت جدا با **استریم ریدایرکشن** و یا **پایپلاین کردن** به اسکریپت شما **ورودی نمیدهد** و اسکریپت نوشته شده در فایل `solution.sh` خود **به تنهایی** قرار است تا **خواندن از فایل** `.env.example` و **نمایش خروجی** را انجام دهد.
ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.