Feature freeze (фриз функција) и code freeze (фриз кода) — праксе замрзавања промена у бази кода пре издања мобилне апликације. Фриз функција забрањује додавање нове функционалности, али дозвољава исправљање грешака и рефакторисање, док фриз кода блокира било какве промене, фиксирајући тачку компилације издашног билда. Према подацима Trunk Based Development Guide, типично трајање фриза — од 24 сата до недељу дана, у зависности од сложености пројекта. Feature freeze смањује ризик од регресије и омогућава тиму да се фокусира на стабилизацију кода пре издања.
Главно
Feature freeze — привремена је забрана додавања нове функционалности у базу кода, која се уводи пре планираног издања. Тим престаје да међује функције и прелази на исправљање грешака, оптимизацију и полирање постојећег кода. Програмери довршавају незавршене функције само у оквиру исправки грешака, не ширећи обим.
Фриз функција решава проблем незавршених функција (work-in-progress) које не стижу за издање, али су већ делимично спојене у главну грану. Ако се настави са убацивањем нових функција, расте ризик од регресије: свака нова интеграција захтева поновно тестирање већ готових модула. Feature freeze фиксира обим издања, претварајући га из покретне мете у стабилан скуп функционалности.
Важно појашњење: feature freeze ≠ code freeze. При фризу функција дозвољене су исправке грешака, рефакторисање, ажурирање зависности и документације. Забрањене су само нове функције видљиве кориснику, односно било који код који мења понашање апликације из перспективе корисника. Провера на code review: ако PR додаје нови екран, дугме или API метод — одбија се до укидања фриза.
Code freeze (фриз кода) — строжа је пракса, у којој су било какве промене у коду потпуно забрањене. Чак ни исправке грешака нису дозвољене, осим ако су критичне. Code freeze се уводи на кратак рок (обично 24-48 сати) и гарантује да је издашни билд направљен из фиксног скупа комитова.
Разлика између фриза функција и фриза кода је у нивоу контроле. Фриз функција управља обимом: шта тачно улази у издање. Фриз кода управља квалитетом: елиминише ризик уношења нове грешке дан пре издања. У пракси многи тимови користе двоетапни модел: 1-2 недеље пре издања — feature freeze, 24-48 сати — code freeze. Code freeze је посебно актуелан за мобилне апликације, где билд треба отпремити у продавницу неколико дана пре планираног датума издања.
Изузетак из code freeze — безбедносне исправке критичних рањивости (CVE са оценом 9+). Такве промене пролазе кроз хитни процес са обавезним убрзаним code review и обавештавањем тима. Све остале промене се одлажу до следећег издашног циклуса.
| Критеријум | Feature freeze | Code freeze |
|---|---|---|
| Нове функције | Забрањене | Забрањене |
| Исправке грешака | Дозвољене | Забрањене |
| Рефакторисање | Дозвољено | Забрањено |
| Ажурирање зависности | Дозвољено | Забрањено |
| Документација | Дозвољена | Дозвољена |
| Типично трајање | 1-2 недеље | 24-48 сати |
Избор између фриза функција и фриза кода зависи од зрелости тима и учесталости издања. Тимови са CI/CD и feature flags могу се снаћи само са code freeze од 24 сата, док тимови са месечним издањима чешће користе оба фриза секвенцијално.
Поред потпуног фриза функција и фриза кода постоје флексибилније варијанте. Partial feature freeze (делимични фриз) блокира нову функционалност само у одређеним модулима — на пример, у модулу плаћања или модулу ауторизације, остављајући остале компоненте отвореним за промене.
BAU-freeze (business as usual freeze) — компромисна варијанта, у којој су забрањене само велике функције са обимом промена већим од одређеног прага (нпр. 500 линија кода). Мала побољшања, UI подешавања и исправке грешака настављају да се убацују. BAU-freeze је погодан за пројекте са continuous delivery, где је потпуно заустављање развоја на недељу дана економски неисплативо.
Такође постоји концепт deployment freeze (деплој-фриз) — потпуно заустављање деплоја на продукцију, карактеристично за празничну сезону (Божић, Black Friday). У овом периоду чак се и хотфикси блокирају, ако нису везани за безбедност. Deployment freeze обично траје 1-2 недеље и усклађује се на нивоу компаније.
Оптималан тренутак увођења фриза функција — након code complete, када су све планиране функције спојене и пролазе QA. Конкретан рок зависи од циклуса издања: за двонедељни спринт фриз функција се уводи 3-4 дана пре датума издања, за месечно издање — 7-10 дана пре. Code freeze се уводи 24-48 сати пре планираног времена компилације издашног билда.
Трајање фриза треба да буде минимално довољно за стабилизацију кода. Предугачак фриз (више од 2 недеље) демотивише тим и ствара нагомилавање неспојених функција, од којих свака након укидања фриза повећава ризик од конфликата. Прекратак фриз (мање од 24 сата за фриз функција) не даје времена за потпуно тестирање и исправке.
Препоручена пракса — постављати фриз не по календарском датуму, већ по стању базе кода. Фриз функција се уводи када број отворених грешака у издању премаши праг (нпр. 10 критичних грешака). Code freeze — када билд успешно прође smoke tests и регресиони скуп. Time-based freeze (фиксни датум) остаје стандард за регулисане индустрије (финтек, медтек), где је датум издања одобрен од регулатора.
Ручна контрола фризова — извор грешака: програмер може случајно да споји PR који треба да чека укидање фриза. Аутоматизација решава проблем кроз Git branch protection правила и CI/CD пајплајнове. У Git провајдеру (GitHub, GitLab, Bitbucket) подешавају се правила која блокирају спајање у издашну грану без посебног тага или одобрења release manager-а.
CI/CD пајплајн проверава статус фриза пре компилације билда. У Jenkins, GitLab CI или GitHub Actions додаје се корак који чита конфигурациони фајл са распоредом фризова и одбија билдове ако тренутни датум пада у период фриза. Алтернатива — feature flag у админ панелу који блокира деплој на продукцију.
# .github/workflows/check-freeze.yml
name: Check Freeze Status
on:
pull_request:
types: [opened, synchronize]
jobs:
check-freeze:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Check freeze status
run: node .github/scripts/freeze-check.js
- name: Block PR if frozen
if: failure()
run: echo "Фриз функција је активан. PR блокиран." && exit 1
Пример скрипте freeze-check.js чита JSON са распоредом фризова из корена репозиторијума. Ако тренутни датум пада у интервал између start_date и end_date за наведену грану — пајплајн не успева са поруком о статусу фриза. Git branch protection додаје другу баријеру: чак и ако пајплајн није радио, правило неће дозволити спајање PR-а без одобрења.
Прва грешка — фриз без јасног критеријума укидања. Тим замрзава код, али не одређује који услови морају бити испуњени за одмрзавање: нула критичних грешака, пролазак регресионог скупа, одобрење product manager-а. Без критеријума фриз се може одужити на недеље. Definition of done за фриз мора бити документован и познат сваком програмеру.
Друга грешка — превише изузетака из фриза. Сваки изузетак („овај PR није функција, већ технички дуг”) замагљује границу фриза. Ако изузеци премашују 20% нормалног тока PR-ова — фриз не ради. Тим једноставно преименује функције у исправке грешака да би заобишао блокаду.
Трећа грешка — игнорисање release candidate-а. Ако тим не прави release candidate билдове и одмах деплојује на продукцију након code freeze, смисао фриза се губи: грешке се откривају тек код корисника. Release candidate треба направити пре code freeze, тестирати га од стране QA и на стејџингу, и тек након потврде квалитета увести code freeze.
Четврта грешка — људски фактор при ручној контроли. Програмер може заборавити да провери статус фриза пре спајања, release manager — да пропусти обавештење. Једино поуздано решење — аутоматско блокирање на нивоу Git провајдера или CI/CD, које елиминише људску грешку.
Често постављана питања
Да, хотфикси критичних грешака (crash, security, data loss) су дозвољени током фриза функција. Међутим, хотфикс мора проћи убрзани code review и не сме садржати нову функционалност. Hotfix се убацује кроз засебну грану од последњег стабилног тага, а не кроз главну develop грану.
За мобилне апликације оптимално трајање фриза функција — 3-7 дана пре планираног датума издања. Code freeze — 24-48 сати пре компилације издашног билда. Трајање зависи од циклуса издања: за двонедељни спринт краће, за месечно издање — дуже.
Deployment freeze блокира било какве деплоје на продукцију, укључујући хотфиксе, и обично је везан за празничну сезону или велике догађаје. Code freeze блокира промене у коду, али деплој већ готовог билда може бити дозвољен. Deployment freeze — строжа пракса, примењена на нивоу целе компаније.
При зрелом continuous delivery фризови могу бити скраћени на code freeze од 24 сата пре издања или замењени feature flags. Међутим, чак и у CD тимовима користи се делимични фриз за критичне модуле (плаћања, ауторизација). CD не поништава фризове, већ их чини краћим и аутоматизованијим.
Обично одговорност лежи на release manager-у или tech lead-у. У малим тимовима (до 10 људи) улогу може обављати сениор програмер који проверава све PR-ове пре спајања. Release manager је такође одговоран за комуникацију датума фриза тиму и заинтересованим странама.
Завршни закључци
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође