Ətraf mühit dəyişənləri — tətbiqin davranışını kodu dəyişmədən konfiqurasiya etmək üçün işəsalma mərhələsində tətbiqə ötürülən dinamik dəyərlərdir. Onlar inkişaf, test və istehsal mühitlərinin konfiqurasiyalarını ayırmağa imkan verir. Twelve-Factor App, 2025-ə görə, konfiqurasiya ətraf mühit dəyişənlərində saxlanmalıdır, koddakı deyil. Ətraf mühit dəyişənləri API açarlarının, backend URL-lərinin və funksionallıq bayraqlarının təhlükəsiz idarə edilməsini təmin edir.
Əsas məqamlar
Ətraf mühit dəyişənləri — əməliyyat sistemi API-si vasitəsilə tətbiq prosesinə çıxarılan açar-dəyər cütüdür. Onlar proses yaradılarkən ötürülür və yalnız onun işləmə müddəti ərzində mövcud olur. Mənbə koduna daxil edilmiş konfiqurasiya parametrlərindən fərqli olaraq, ətraf mühit dəyişənləri dəyərləri dəyişdirmək üçün yenidən kompilyasiya tələb etmir. Bu, kod və konfiqurasiya arasında dəqiq ayırma təmin edən Twelve-Factor App-in fundamental prinsipidir.
Mobil inkişafda ətraf mühit dəyişənləri müxtəlif mühitlər üçün konfiqurasiya problemini həll edir: tərtibatçı lokal serverdən, test edən staging-dən, istifadəçilər isə istehsal mühitindən istifadə edir. Koddakı if-else şərt operatorları ilə üç backend URL-sini saxlamaq əvəzinə, tərtibatçı qurma mərhələsində bir URL-ni ətraf mühit dəyişəni vasitəsilə ötürür. Bu, kodu sadələşdirir və test mühitində təsadüfən istehsal serverindən istifadə riskini aradan qaldırır.
Əsas üstünlük təhlükəsizlikdir: həssas məlumatlar kod repozitoriyasına daxil olmur. API açarları, Firebase sirləri, backend giriş tokenləri və sertifikatlar CI/CD vasitəsilə birbaşa qurma mühitinə yüklənir. Təcavüzkar kod repozitoriyasına giriş əldə etsə belə, orada sirləri tapmayacaq, çünki onlar CI sisteminin qorunan anbarlarında saxlanılır və yalnız ikili faylın qurulması mərhələsində ötürülür.
Mobil layihələr ən azı üç mühitə malikdir: development, staging və istehsal. Hər bir mühit öz konfiqurasiya dəstini tələb edir: server URL-si, paket adı, imza sxemi və push bildiriş sertifikatları. Ətraf mühit dəyişənləri olmadan tərtibatçı hər qurma əvvəli əl ilə konfiqurasiyanı dəyişməli olur ki, bu da səhvlərə gətirib çıxarır: unudulmuş istehsal açarı test qurmasında real istifadəçilərə bildiriş göndərilməsinə və ya pullu API-nin xərclənməsinə səbəb ola bilər.
Ətraf mühit dəyişənləri kodu dəyişmədən backendi dəyişməyə imkan verir: API_BASE_URL dəyişənindəki dəyəri əvəz etmək kifayətdir. Funksionallıq bayraqları (feature flags) FEATURE_CHAT_ENABLED=true tipli dəyişənlər vasitəsilə idarə olunur ki, bu da istehsal mühitinə təsir etmədən staging-də yeni imkanları aktivləşdirməyə imkan verir. Hər bir mühit üçün qurma mərhələsində yüklənən öz .env faylı yaradılır.
class AppConfig {
static final String apiBaseUrl =
const String.fromEnvironment('API_BASE_URL',
defaultValue: 'http://localhost:8080');
}
Sərt kodlaşdırılmış açarlar mobil tətbiqlərin geniş yayılmış zəiflikidir. Təcavüzkar jadx və ya Hopper kimi alətlərlə APK və ya IPA-nı dekompilyasiya edir və ikili fayldan sirləri çıxarır. Hətta obfuskasiya da string literal qorumur — onlar dekompilyasiyadan sonra koddakı asanlıqla tapılır. Ətraf mühit dəyişənləri bu problemi həll edir, açarları CI/CD vasitəsilə qurma mərhələsində ötürür, burada onlar jurnallarda maskalanır.
object Config {
val apiKey: String =
System.getenv("API_KEY") ?: throw
IllegalStateException("API_KEY not set")
}
Ətraf mühit dəyişənləri qurma pipeline-ları ilə inteqrasiya olunur: GitHub Actions, GitLab CI, Bitrise və CircleCI jurnallarda görünməyən gizli dəyişənləri dəstəkləyir. Qurma mərhələsində CI budaq və ya teqdən asılı olaraq müvafiq dəyərləri əvəz edir: develop budağı üçün staging, v* teqi üçün istehsal istifadə olunur. Bu, prosesi avtomatlaşdırır və insan faktorunu aradan qaldırır, hər qurmanın düzgün konfiqurasiya dəsti almasını təmin edir.
.env faylı ətraf mühit dəyişənlərini KEY=VALUE formatında saxlamaq üçün standart üsuldur. Repozitoriyaya daxil edilmir, bunun əvəzinə repozitoriyaya bütün dəyişənlərin şablonu və boş dəyərləri olan .env.example əlavə olunur. Hər bir tərtibatçı komandanın digər üzvlərinin konfiqurasiyasına təsir etmədən öz .env faylını yaradır. Müxtəlif mühitlər üçün ayrıca fayllar istifadə olunur: .env.dev, .env.stage, .env.prod.
# .env.example — tərtibatçılar üçün şablon
API_BASE_URL=http://localhost:8080
FEATURE_CHAT_ENABLED=true
SENTRY_DSN=
Mobil layihələr üçün .env faylları ilə işləmək üçün ixtisaslaşmış kitabxanalar mövcuddur:
CI/CD-də budaq parametrləri müxtəlif .env fayllarını əvəz etməyə imkan verir: test serverləri üçün .env.dev, buraxılışöncəsi üçün .env.stage və tətbiq mağazalarında nəşr üçün .env.prod. Sirləri olan fayllar təhlükəsiz anbarlardan (Vault, AWS Secrets Manager) yüklənir və repozitoriyada saxlanılmır. Bu, hətta versiya nəzarət sistemi kompromat edilsə belə, sirlərin qorunmasını təmin edir.
iOS ekosistemi qurma səviyyəsində dəyişənləri idarə etmək üçün xcconfig fayllarından istifadə edir. Onlar Xcode sxemlərinə qoşulur və Debug və Release konfiqurasiyaları üçün dəyərləri ləğv etməyə imkan verir. xcconfig faylları miras almağı dəstəkləyir: ümumi parametrləri olan əsas fayl və hər bir mühit üçün spesifik fayllar yaradıla bilər.
xcconfig faylları dəyişənləri KEY = VALUE formatında saxlayır və Xcode-da Konfiqurasiya parametrləri vasitəsilə qurma sxeminə qoşulur. xcconfig-dən dəyişənlər Info.plist-də $(VARIABLE_NAME) sintaksisi vasitəsilə əlçatandır ki, bu da müxtəlif sxemlər üçün müxtəlif paket identifikatorları və tətbiq adları istifadə etməyə imkan verir. Mühiti tez müəyyən etmək üçün tətbiq adına Dev və ya Staging suffiksi əlavə olunur.
# Config/Dev.xcconfig — tərtibat konfiqurasiyası
API_BASE_URL = http://localhost:3000
BUNDLE_ID_SUFFIX = .dev
APP_DISPLAY_NAME = MyApp Dev
iOS-da dəyişənlərə runtime girişi üçün Bundle.main.object(forInfoDictionaryKey:) vasitəsilə Info.plist-dən dəyərləri oxuyan Configuration.swift faylı istifadə olunur. Bu yanaşma dəyişənlərin qurma mərhələsində təyin edilməsini və tətbiqin işə salınmasından dərhal sonra əlçatan olmasını təmin edir. Dəyərlər modulun inisializasiyası zamanı bir dəfə oxunur və tətbiqin həyat dövrü ərzində sürətli giriş üçün keşlənir.
enum AppEnvironment {
static var apiBaseURL: URL {
guard let urlString = Bundle.main
.object(forInfoDictionaryKey: "API_BASE_URL"),
let url = URL(string: urlString as! String)
else { fatalError("API_BASE_URL is not configured") }
return url
}
static var isChatEnabled: Bool {
Bundle.main.object(
forInfoDictionaryKey: "FEATURE_CHAT_ENABLED"
) as? Bool ?? false
}
}
Android ətraf mühit dəyişənlərini BuildConfig — sahələri modulun build.gradle faylında təyin olunan avtomatik yaradılan sinif vasitəsilə dəstəkləyir. BuildConfig hər bir flavor və qurma növü üçün ayrıca kompilyasiya mərhələsində yaradılır. Bu, koddakı şərt operatorlarından istifadə etmədən debug və release üçün müxtəlif dəyərlərə malik olmağa imkan verir ki, bu da məhsuldarlığı və təhlükəsizliyi artırır.
BuildConfig sahələri defaultConfig-da və ya konkret buildTypes-da buildConfigField vasitəsilə təyin edilir. Hər bir mühit üçün ayrıca buildType və ya productFlavor yaradılır. Bu, konfiqurasiyaların ciddi izolyasiyasını təmin edir: debug lokal serverdən, release istehsal mühitindən istifadə edir. BuildConfig sahələri statik tipləşdirilmişdir ki, bu da koddakı müraciətlərdə səhvləri aradan qaldırır.
// build.gradle (Module: app)
android {
defaultConfig {
buildConfigField "String", "API_BASE_URL",
"\"http://localhost:8080\""
}
buildTypes {
debug {
buildConfigField "String", "API_BASE_URL",
"\"http://dev.api.itsectr.com\""
}
release {
buildConfigField "String", "API_BASE_URL",
"\"https://api.itsectr.com\""
}
}
}
Layihənin kökündəki gradle.properties faylı qlobal Gradle dəyişənlərini saxlayır. Onlar $variableName sintaksisi vasitəsilə bütün modullarda əlçatandır və asılılıqların versiyalarını, qurma bayraqlarını və API açarlarını göstərmək üçün istifadə olunur. BuildConfig-dən fərqli olaraq, gradle.properties yalnız Gradle konfiqurasiyası mərhələsində işləyir, tətbiqin runtime-da deyil. Buna görə də gradle.properties-də göstərilən parol və API açarları dekompilyasiya olunmuş koddakı görünmür, çünki onlar yalnız kompilyasiya mərhələsində BuildConfig yaratmaq üçün istifadə olunur.
# gradle.properties
SENTRY_DSN=https://key@sentry.io/project
MAPS_API_KEY=AIzaSy...
Android layihələrində sirlərin təhlükəsiz ötürülməsi üçün local.properties (VCS-dən xaric edilib) istifadə etmək və ya System.getenv() vasitəsilə CI/CD dəyişənlərindən dəyərləri build.gradle-a yükləmək tövsiyə olunur. Bu, açarların repozitoriyaya düşməməsini təmin edir. Google Play Console-da nəşr edərkən, bütün debug açarlarının müvafiq BuildConfig dəyərləri ilə müxtəlif buildTypes və ya productFlavors vasitəsilə istehsal versiyaları ilə əvəz edildiyinə əmin olun.
Tez-tez verilən suallar
Bəli, Flutter ətraf mühit dəyişənlərini runtime girişi üçün flutter_dotenv paketi və ya platforma dəyişənləri üçün yerli kanallar vasitəsilə dəstəkləyir. Dart-da həmçinin --dart-define vasitəsilə kompilyasiya mərhələsində dəyərləri ötürmək üçün String.fromEnvironment konstruktoru mövcuddur ki, bu da Flutter layihələri üçün üstünlük verilən üsuldur.
BuildConfig — hər bir buildType və flavor üçün kompilyasiya mərhələsində yaradılan tipləşdirilmiş sahələri olan Java sinifidir. gradle.properties — bütün Gradle modulları üçün qurma konfiqurasiyası mərhələsində əlçatan olan açar-dəyər cütlərindən ibarət mətn faylıdır. BuildConfig tətbiqin runtime-da işləyir, gradle.properties isə yalnız Gradle skriptlərində işləyir.
Repozitoriyanızın .gitignore faylına .env əlavə edin. Repozitoriyaya yalnız boş dəyərlər və hər bir dəyişənin təsviri ilə .env.example commitleyin. CI/CD üçün GitHub Actions, GitLab CI və ya Bitrise parametrlərində jurnallarda maskalanan və qurma başa çatdıqdan sonra oxunması mümkün olmayan şifrələnmiş sirlərdən istifadə edin.
Əksər CI sistemləri gizli ətraf mühit dəyişənlərini dəstəkləyir. GitHub Actions-da bunlar Secrets, GitLab CI-da — CI/CD Variables, Bitrise-də — Secrets adlanır. Qurma mərhələsində onlar qurma skriptinə process.env və ya System.getenv() vasitəsilə ötürülür. Gizli dəyişənlər qurma jurnallarında göstərilmir və repozitoriyanın fork-larında əlçatan deyil.
Feature flags — kodu yenidən kompilyasiya etmədən funksionallığı aktivləşdirən və ya söndürən boolean dəyişənlərdir. Nümunə: FEATURE_NEW_PAYMENT=true test üçün staging-də yeni ödəniş sistemini aktivləşdirir. İstehsalda eyni bayraq backend tam yerləşdirilənə qədər false olaraq təyin edilir. Bu, dəyişiklikləri mərhələli şəkildə təhlükəsiz tətbiq etməyə və problemlər olduqda geri qaytarmağa imkan verir.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun