Build — source code va bog‘liq resurslarni bajariladigan, tarqatiladigan yoki test qilinadigan artifactga aylantirish jarayoni.
Build faqat compiler chaqiruvi emas. Loyiha turiga qarab dependency resolution, code generation, transpilation, linking, asset processing, test va package yaratish bosqichlarini o‘z ichiga oladi.
Build pipeline
Keng tarqalgan jarayon:
Source
→ Dependency resolution
→ Code generation
→ Compile yoki transpile
→ Link
→ Test
→ Package
→ Artifact
Har loyiha barcha bosqichdan o‘tmaydi.
Interpreted loyiha ham dependency, asset va container image yaratish sabab build jarayoniga ega bo‘lishi mumkin.
Build target
Build tizimida aniq natija target deb ataladi.
Misollar:
- application;
- library;
- unit test;
- documentation;
- container image;
- installer;
- mobile package.
Target boshqa targetlarga dependency bo‘lishi mumkin.
Build graph
Target va vazifalar directed graph hosil qiladi.
Masalan:
package
├── executable
│ ├── source
│ └── generated code
└── assets
Build system dependency graph asosida vazifalarni to‘g‘ri tartibda va imkon qadar parallel bajaradi.
Incremental build
Faqat o‘zgargan source va undan ta’sirlangan targetlar qayta build qilinadi.
Bu incremental build.
To‘g‘ri dependency graph bo‘lmasa:
- kerakli target qayta qurilmaydi;
- eski artifact qoladi;
- “clean build”dagina xato ko‘rinadi.
Incremental build tez, clean build esa holatni tekshirish uchun muhim.
Clean build
Oldingi output va cache olib tashlanib, hamma narsa boshidan yaratiladi.
Clean build:
- yashirin dependency;
- stale generated file;
- noto‘g‘ri cache;
- local artifact
muammolarini aniqlaydi.
Har lokal buildni clean qilish vaqtni keraksiz oshiradi.
Build configuration
Ko‘p loyiha bir nechta konfiguratsiyaga ega:
Konfiguratsiya quyidagilarni o‘zgartirishi mumkin:
Secret source yoki binary ichiga qattiq yozilmaydi.
Debug build
Debug build:
bilan yaratiladi.
Source-level debugging osonroq.
Performance release builddan farq qilishi mumkin.
Release build
Release build:
- optimization;
- minification;
- dead code elimination;
- symbol stripping;
- code signing;
- production metadata
bilan tayyorlanadi.
Release artifact aynan CI pipeline orqali yaratilishi reproducibilityni oshiradi.
Build tool
Build tool:
- vazifalarni ta’riflaydi;
- dependency graph tuzadi;
- commandlarni ishga tushiradi;
- cache boshqaradi;
- parallelizmni nazorat qiladi;
- artifact joylashtiradi.
Tilga xos va umumiy build tizimlari mavjud.
Build script
Build qoidalari source bilan version control’da saqlanadi.
Script:
- input;
- output;
- command;
- environment;
- dependency
ni aniq ko‘rsatadi.
Faqat developer kompyuteridagi qo‘lda bajarilgan qadam CI’da takrorlanmaydi.
Build environment
Build natijasiga quyidagilar ta’sir qiladi:
- OS;
- architecture;
- compiler;
- SDK;
- environment variable;
- locale;
- timezone;
- dependency registry;
- system library.
Environment pin qilinmasa bir xil commit turli artifact yaratishi mumkin.
Hermetic build
Hermetic build faqat e’lon qilingan inputlardan foydalanadi.
U hostdagi tasodifiy:
ga tayanmaydi.
Bu reproducibility va remote build uchun muhim.
Reproducible build
Bir xil source, dependency va toolchain bir xil binary hosil qilsa reproducible build deyiladi.
To‘sqinlik qiluvchi omillar:
- timestamp;
- random value;
- absolute path;
- file order;
- locale;
- nondeterministic compiler;
- external network content.
Artifact hash orqali taqqoslanadi.
Build cache
Task input hashiga mos oldingi output qayta ishlatiladi.
Cache key quyidagilarni hisobga oladi:
- source;
- dependency;
- command;
- compiler versiyasi;
- environment;
- build flag.
Noto‘liq cache key eski yoki noto‘g‘ri artifact qaytaradi.
Remote cache
Jamoa va CI bir xil build outputlarini remote cache orqali bo‘lishadi.
Bir developer yaratgan targetni boshqasi qayta compile qilmaydi.
Cache artifacti ishonchli va integrity tekshiruvi bilan saqlanadi.
Parallel build
Independent targetlar bir vaqtda bajariladi.
Parallelizm CPUdan samarali foydalanadi.
Biroq build script yashirin umumiy fayl yoki global temporary directory ishlatsa race condition yuz beradi.
Har task aniq input va outputga ega bo‘lishi kerak.
Cross build
Bitta hostda boshqa platforma uchun build qilish cross-compilation hisoblanadi.
Kerakli qismlar:
Host tool va target binary aralashtirilmaydi.
Build number
CI har buildga noyob raqam yoki ID beradi.
Bu versiondan alohida.
Bir xil 2.4.1 versiya bir nechta candidate buildga ega bo‘lishi mumkin.
Final release qaysi build ekanligi aniq qayd etiladi.
Build failure
Build xatosi:
- compile;
- test;
- dependency;
- code generation;
- lint;
- packaging;
- signing;
- environment
bosqichida yuz berishi mumkin.
Log qaysi task, command va exit code xato berganini ko‘rsatadi.
Build sandbox
Har build task alohida cheklangan katalog yoki container ichida bajarilishi mumkin. Sandbox taskning faqat e’lon qilingan fayllarni o‘qishi va belgilangan outputni yozishini ta’minlaydi. Bu yashirin dependencylarni topish va untrusted build script ta’sirini kamaytirishga yordam beradi.
Generated artifactni tekshirish
Build muvaffaqiyatli tugagach artifact formati, version metadata, dependency va signature tekshiriladi. Zero-byte file yoki noto‘g‘ri platforma binarysi build task exit code’i 0 bo‘lsa ham yaroqsiz natija hisoblanadi.
Bog‘liq tushunchalar
Build system, Build target, Build graph, Incremental build, Clean build, Artifact, Compiler, Linker, Reproducible build, CI