Release Branch — este o ramură în Git Flow care este creată din develop pentru pregătirea unei lansări specifice. În ea se fixează versiunea aplicației, se repară ultimele bug-uri și se actualizează metadatele — fără a adăuga funcționalități noi. Conform Vincent Driessen, 2010, ramura release separă pregătirea lansării de dezvoltarea curentă, permițând desfășurarea ambelor activități în paralel.
Puncte principale
release/X.Y.Z conform versiunii aplicației.Release Branch (ramura de lansare) — este o ramură temporară în Git Flow, creată din develop atunci când echipa decide că setul curent de funcționalități este gata pentru lansare. Există exact cât durează pregătirea finală a lansării — de la câteva ore până la câteva zile.
Scopul principal al ramurii release — să înghețe un set specific de funcționalități pentru lansare, fără a opri dezvoltarea versiunilor următoare. În timp ce ramura release se pregătește pentru lansare, alți dezvoltatori pot continua să îmbine ramurile feature în develop pentru următoarea lansare.
În ramura release nu se creează funcționalități noi — doar corecturi de bug-uri, actualizarea versiunii aplicației, localizare și documentație. După finalizarea tuturor lucrărilor, ramura release este îmbinată în main (marcată ca lansare) și înapoi în develop (pentru ca corecturile de bug-uri să ajungă în versiunile viitoare).
Conform Atlassian, 2024, ramurile release sunt critic de importante pentru proiectele cu cicluri regulate de lansare — ele asigură predictibilitatea și stabilitatea procesului de lansare.
Ciclul de viață al ramurii release, de la creare până la ștergere, include mai multe etape. Înțelegerea fiecărei etape ajută echipa să sincronizeze acțiunile și să evite erorile.
release/2.5.0. develop continuă să accepte ramuri feature pentru versiunea următoare.v2.5.0.Punctul 6 — îmbinarea inversă în develop — este adesea uitat, dar este critic de important. Fără el, corecturile de bug-uri făcute în release nu vor ajunge în develop, iar în următoarea lansare aceleași erori pot apărea din nou.
Timpul de viață al ramurii release depinde de complexitatea lansării și de calitatea codului în develop. În medie, pregătirea durează între 2 și 5 zile lucrătoare pentru o aplicație mobilă de dimensiuni medii.
În ramura release se execută un set strict limitat de sarcini. Orice abatere de la această listă încalcă modelul Git Flow și creează riscuri pentru stabilitatea lansării.
| Tip de modificări | Permis | Exemplu |
|---|---|---|
| Versionare | Da | Actualizarea versionName în build.gradle |
| Corecturi bug-uri | Da | Repararea crash-ului la pornire |
| Localizare | Da | Adăugarea traducerilor pentru ecrane noi |
| Documentație | Da | Actualizarea CHANGELOG și README |
| Funcționalități noi | Nu | Adăugarea unui ecran de profil nou |
| Refactorizare | Nu | Rescrierea stratului de rețea |
| Actualizare biblioteci | Cu prudență | Doar versiuni patch pentru corecturi de bug-uri |
Regula interzicerii funcționalităților noi — cea mai importantă în ramura release. Dacă o funcționalitate nu a apucat lansarea, așteaptă următorul ciclu. Încercarea de a împinge o funcționalitate neterminată în ramura release — principala cauză a întârzierilor termenelor și a bug-urilor în producție.
În ramura release se actualizează obligatoriu numărul versiunii aplicației. Pentru Android sunt câmpurile versionCode și versionName în build.gradle, pentru iOS — CFBundleShortVersionString în Info.plist.
// build.gradle (app-level) — actualizarea versiunii în ramura release
android {
defaultConfig {
versionCode 42
versionName "2.5.0"
}
}
// Pentru iOS — actualizarea Info.plist
// CFBundleShortVersionString = 2.5.0
// CFBundleVersion = 42
Dezvoltatorii începători confundă adesea ramurile release și hotfix, deși scopul lor este fundamental diferit. O eroare în alegerea tipului de ramură poate duce la întârzierea unei corecturi critice sau la perturbarea procesului de lansare.
Dacă o eroare este descoperită în procesul de pregătire a lansării (în ramura release) — este o corectură obișnuită de bug. Dacă eroarea este descoperită în producție (pe main) — este hotfix și se creează din main, chiar dacă ramura release există deja.
Un standard unitar de denumire a ramurilor release simplifică navigarea prin depozit și permite sistemelor CI/CD să determine automat că ramura aparține procesului de lansare.
release/2.5.0.release/merlin.release/2024-12-01.Formatul release/X.Y.Z — preferat, deoarece leagă explicit ramura de numărul versiunii care va fi atribuit lansării. Aceasta simplifică căutarea și procesarea automată prin scripturile CI/CD.
Îmbinarea inversă (merge back) a ramurii release în develop — una dintre cele mai importante și, în același timp, adesea omise operații. Fără ea, toate corecturile de bug-uri făcute în release rămân doar în versiunea lansată și nu ajung în următorul ciclu de lansare.
Procesul de îmbinare inversă se execută după ce ramura release a fost deja îmbinată în main. Mai întâi release se îmbină în develop, apoi — se șterge. Aceasta garantează că develop conține toate corecturile făcute în procesul de pregătire a lansării.
După îmbinarea inversă sunt posibile conflicte — mai ales dacă în develop au apărut deja ramuri feature noi care au modificat aceleași fișiere. Dezvoltatorul responsabil pentru lansare rezolvă aceste conflicte și trimite develop pe server.
Unele echipe folosesc rebase în loc de merge pentru îmbinarea inversă, pentru ca istoricul să rămână liniar. Totuși, merge este mai sigur pentru develop, deoarece nu rescrie istoricul commit-urilor care ar putea fi deja folosite de alți dezvoltatori.
Să analizăm ciclul complet de lucru cu ramura release: de la creare până la ștergere după lansarea cu succes a aplicației mobile versiunea 2.5.0.
# 1. Crearea ramurii release din develop
git checkout develop
git pull origin develop
git checkout -b release/2.5.0
# 2. Actualizarea versiunii și corecturi de bug-uri
git add build.gradle
git commit -m "Bump version to 2.5.0"
# 3. Repararea bug-urilor (doar bugfixes)
git add src/fix/
git commit -m "Fix crash on payment screen"
# 4. Trimiterea ramurii release pe server
git push origin release/2.5.0
# 5. Îmbinarea release în main
git checkout main
git pull origin main
git merge --no-ff release/2.5.0
git tag -a v2.5.0 -m "Release 2.5.0"
git push origin main --tags
# 6. Îmbinarea inversă în develop
git checkout develop
git merge --no-ff release/2.5.0
git push origin develop
# 7. Ștergerea ramurii release
git branch -d release/2.5.0
git push origin --delete release/2.5.0
Comenzile 5 și 6 — îmbinarea dublă — sunt critic de importante. Mai întâi main primește codul lansării și tag-ul, apoi develop se sincronizează cu corecturile de bug-uri din release. Dacă se omite pasul 6, corecturile din lansare nu ajung în următorul ciclu de dezvoltare.
Pentru proiectele mobile cu lansări regulate, procesul de creare a ramurii release și actualizare a versiunii poate fi automatizat prin scripturi CI/CD. GitHub Actions permite crearea unui workflow care, la apăsarea unui buton, creează o ramură release cu actualizarea automată a versiunii.
Pentru proiectele mobile cu lansări regulate, procesul de creare a ramurii release și actualizare a versiunii poate fi automatizat prin scripturi CI/CD. GitHub Actions permite crearea unui workflow care, la apăsarea unui buton, creează o ramură release cu actualizarea automată a versiunii.
# GitHub Actions — automatizarea creării ramurii release
name: Create Release Branch
on:
workflow_dispatch:
inputs:
version:
description: 'Release version (e.g. 2.5.0)'
required: true
jobs:
create-release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Create release branch
run: |
git checkout develop
git checkout -b release/${{ inputs.version }}
git push origin release/${{ inputs.version }}
Întrebări frecvente
Doar o singură ramură release simultan, dacă urmați Git Flow. Prezența a două ramuri release active înseamnă că echipa încearcă să lanseze două versiuni în paralel — aceasta încalcă principiul lansărilor secvențiale și creează confuzie cu versiunile.
Eliminați commit-urile funcționalității neterminate din ramura release prin git revert și amânați funcționalitatea până la următoarea lansare. Nu lansați niciodată funcționalități neterminate în producție — datoria tehnică și potențialele bug-uri nu merită graba.
Pentru lansări simple cu o singură corectură, ramura release poate fi omisă și se poate face îmbinarea directă din develop în main. Cu toate acestea, pentru lansările standard, ramura release este obligatorie — fixează versiunea, izolează pregătirea și asigură îmbinarea dublă a corecturilor de bug-uri.
Folosiți git revert în main pentru a crea un commit nou care anulează toate modificările lansării. Apoi ștergeți tag-ul lansării cu comanda git push origin --delete vX.Y.Z. După remedierea problemelor, creați o nouă ramură release cu numărul de patch mărit.
Release candidate (RC) — este un artefact de compilare care trece testarea finală. Release branch — este ramura Git din care se creează release candidate. O ramură release poate genera mai multe compilări RC (RC1, RC2 etc.) pe măsură ce bug-urile sunt reparate.
Rezumat
release/X.Y.Z cu numărul versiunii conform SemVer.Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și