Bosh sahifa Wiki Build

Build

Buildsource 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:

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:

muammolarini aniqlaydi.

Har lokal buildni clean qilish vaqtni keraksiz oshiradi.

Build configuration

Ko‘p loyiha bir nechta konfiguratsiyaga ega:

Konfiguratsiya quyidagilarni o‘zgartirishi mumkin:

  • optimization;
  • debug symbol;
  • assertion;
  • logging;
  • feature flag;
  • signing;
  • target endpoint.

Secret source yoki binary ichiga qattiq yozilmaydi.

Debug build

Debug build:

  • kam optimization;
  • ko‘p debug symbol;
  • assertion;
  • qo‘shimcha log;
  • tez compile

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:

ni aniq ko‘rsatadi.

Faqat developer kompyuteridagi qo‘lda bajarilgan qadam CI’da takrorlanmaydi.

Build environment

Build natijasiga quyidagilar ta’sir qiladi:

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:

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