سلیب (SAliB) که در مدت دوری از کوئرا به قاب عکسی در دیوار تبدیل شده است، پس از برگشت دوبارهی به کوئرا برای طراحی سوالات مسابقات کداستار (CodeStar)، با چالشهای جدیدی در دیپلوی و مدیریت برخی از پایپلاینهای CI/CD در پروژههای قبلی خود مواجه شده است. او که تا پیش از این تعداد زیادی از متغیرهای محیطی (Environment Variable) خود را به صورت کاملا دستی مدیریت میکرد، حال با حضور در کوئرا و غیبتش از پروژههایش، با چالش عجیبی در مدیریت متغیرهای محیطی در زمان دیپلوی مواجه شده است.
سلیب برای حل مشکل مدیریت متغیرهای محیطی (Environment Variables) به صورت دستی، فرمت فایلی .env.example
و متغیرهای محیطسلیبی را معرفی میکند. فایل .env.example
یک فایل .env
برای مدیریت متغیرهای محیطی است. در این فایل مقادیر متغیرهای مورد نیاز پروژه، به صورت کلید-مقدارهای KEY=VALUE
تعریف میشوند. همچنین ممکن است کلیدی تعریف شده باشد اما مقداری برای آن مشخص نشده باشد، مثل KEY=
. فایلهای .env
و .env.example
از کامنتها نیز برای توضیح بیشتر متغیرهای تعریف شده، با استفاده از # Comment
نیز پشتیبانی میکنند. به مثالهای زیر برای درک بیشتر فرمت گفته شده دقت کنید.
فایلهای .env.example
به صورت پیشفرض ابتدا توسط سلیب مقداردهی میشوند. به این صورت که تعدادی از کلیدهای مختلف برای هر پروژه در این فایل تعریف میشوند که ممکن است توسط سلیب از قبل مقداری برای آنها قرار داده شود یا مقادیر آنها برای مقداردهی شدن در آینده خالی بمانند. او برخی از مقادیر حساس مانند رمزهای عبور استفاده شده در پروژهها را از قبل در فایل .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=
مثال
ورودی نمونه ۱
خروجی نمونه ۱
- در فایل ورودی
.env.example
کلیدهایDB_PORT
وDB_PASSWORD
از قبل مقداردهی نشده بودند. مقدار کلیدهایDB_PORT
وDB_PASSWORD
در محیط اجرای اسکریپت به ترتیب به صورت5432
وpassword1
مشخص شدهاند که با اجرای اسکریپت نوشته شده، این کلیدها نیز در فایل.env
مقداردهی میشوند.
ورودی نمونه ۲
خروجی نمونه ۲
آنچه باید آپلود کنید
-
توجه: شما باید موارد خواسته شده در سوال را تنها در قالب فایل
solution.sh
پیادهسازی کرده و ارسال کنید. -
توجه: فایل
solution.sh
توسط سیستم داوری اجرا میشود و نیازی به نوشتن دستور یا اسکریپت دیگری برای اجرای این فایل نیست. -
توجه: سیستم داوری محتویات فایل
.env.example
را به صورت جدا با استریم ریدایرکشن و یا پایپلاین کردن به اسکریپت شما ورودی نمیدهد و اسکریپت نوشته شده در فایلsolution.sh
خود به تنهایی قرار است تا خواندن از فایل.env.example
و نمایش خروجی را انجام دهد.
ارسال پاسخ برای این سؤال