Pirms kāda laika (nu jau 2 gadiem) mūsu projekta komanda sāka augt no 1.5 programmētājiem līdz 5 (precīzi neatceros). Kods sākotnēji tika versionēts (glabāts) SVN parodijā, ko sauc par Microsoft Source Safe. Ņemot vērā, ka nebūtu godīgi MSS uzskatīt par versionēšanas sistēmu, bet kā sliktu backup tūli vērtu gan. Tad vajadzēja atrast draudzīgu rīku, ar kuru varētu strādāt vairāk kā 1 programmētājs.
Šo problēmu spēja atrisināt divi rīki git
un hg
. Tātad vajadzēja izvēlēties vienu no abiem. git
tai laikā īsti nebija sakarīgas front-end saskarnes, tāpēc ne tik entuziastiskiem programmētājiem varētu nepatikt komandrinda. hg
ir ļoti draudzīgs Windows front-ends saukts par TortoiseHg. Ak, jā, mēs visi lietojam Windows, tāpēc Hg iegūst vairāk punktus nekā Git. Papildus, Hg ir diezgan pedantisks, glabājot vēsturi.
Tas var noderēt, lai kontrolētu, kas un ko ir izdarījis.
Produkcijas vides kods glabājas default
zarā. Visiem pieteikumiem, kuros jālabo kods, tiek veidots jauns zars no jaunākās revīzijas default
zarā. Hg atbalsta named branching, kas ļauj zaram piešķirt nosaukumu. Nosaukumi mūsu gadījumā tiek piešķirti pēc pieprasījuma numura.
Tā kā mums ir vairākas vides - produkcijas un testa, tad vēl tika izveidots .tests
zars (ar punktu, lai izvēlnēs būtu pirmais). Piemēram, ja vajag piegādāt dažus pieteikumus testēšanā, tas nozīmē, ka jāveic atbilstošo pieteikumu zaru hg merge
ar .tests
zaru. Tad, kad visi hg merge
ir izveidoti, varam kompilēt un likt uz testa vides. Parasti pēc katra hg merge
pārbauda, vai kods kompilējas, ja Nē, tad atceļam hg merge
. Pēdējos commit
var atcelt ar hg rollback
. Prātīgi to darīt tikai tad, ja izmaiņas jau nav aizgājušas uz centrālo glabātuvi, ar kuru visi sinhronizējas.
Runājot par centrālo glabātuvi, mums tāda ir tikai viena. Uz to arī tiek sūtītas visas izmaiņas kodā visos zaros. Testētāji var novilkt izmaiņas no centrālās glabātuves un pārslēgties uz attiecīgā pieteikuma zaru, un nokompilēt, un pārbaudīt, vai viss strādā. Attiecīgi pēc tam nodot testēšanā, atzīmēt, ka pieteikums var doties uz testa vidi - var tikt veikts hg merge
ar .tests
zaru.
Piegādes uz produkciju var iet divos ceļos.
SVN stilā: .tests
zars tiek hg merge
iekš default
zara - šo variantu mēs neizmantojam, jo ir pārāk ierobežots - mēs varētu piegādāt tikai tad, ja visas izmaiņas .tests
zarā ir akceptētas uz produkciju. Tas nozīmē, ka piegādēs būtu lielas ar daudz nopietnām izmaiņām. Visticamāk būtu nepieciešama vairāku testa zaru tagošana, no kuras revīzijas līdz kurai revīzijai piegādāt utt. (SVN laikam savādāk kā šādi nevar).
Otrs variants ir visus pieteikumus, kuri ir notestēti un akceptēti, uz produkciju tiek hg merge
ar default
zaru - šis variants atļauj piegādāt jebkuras izmaiņas, kas nav funkcionāli saistītas ar citam. Šādam piegājienam ir problēma, ka pastāv lielāka iespēja hg merge
konfliktu veidošana jaunu pieteikumu pievienošanai .tests
zarā, jo .tests
zars var būtu stipri advancējies uz priekšu no default
. Atceramies, ka no default
zara top visi jaunie pieteikumu zari. Protams to var samazināt visādos veidos, piemēram, kodu strukturējot tā, ka vienā failā ir maz koda rindiņu un ir daudz failu. Laba koda modularitāte arī varētu samazināt funkcionālo atkarību. Lai gan šeit ir problēma, ka nepieciešams veikt testus, lai pārbaudītu, ka jaunās izmaiņas, kas ielikts default
zarā tiešām strādā. Šai problēmai pašlaik izsargāšanās metode ir cerība. Un kā pieredze rāda tad tā nav pievīlusi - nav bijušas funkcionalitātes kļūdas slikta merge
rezultātā.
Beigās, ja viss ir izdevies un viss kompilējas, tad visas izmaiņas tiek sinhronizētas ar centrālo glabātuvi.
Vēl neizpētīta lieta ir veidot vairāku līmeņu izmaiņu glabāšanu, piemēram, programmētājs savas izmaiņas nesūta uz centrālo, bet gan uz testētāju glabātuvi, un ja viņi ir pārbaudījuši, tad izmaiņas var aizsūtīt uz centrālo glabātu. Šāds modelis varētu būt noderīgs lielām izstrādes komandām, lai kāds (praktikanti) muļķības nesadarītu. Piemēram, nepareizs zaru nosaukums, kods nenoformatēts, vai veidojas hg merge
konflikti (testētājs var pārbaudīt vai hg merge
neveido konfliktu).