Detaljar rundt migreringa frå Subversion til Git for Cerebrum

Detaljane i migreringa av Cerebrum-koden.

1   Splitting av kode

Vi har etter diskusjon i tenestegruppa kome fram til at alt som ikkje er direkte avhengig av Cerebrum-koden skal splittast ut frå Cerebrum-repoet og leggast i eigne git-repo i Stash (https://utv.uio.no/stash).

Det vi skal splitte ut frå Cerebrum-repoet:

  • Brukerinfo: Frå cerebrum/clients/brukerinfo. Fullført.
  • cweb: Frå cerebrum/clients/cweb. Fullført.
  • CisClient: Frå cerebrum/clients/cis. Fullført, kalla CisClient.
  • JBofh: Frå cerebrum/clients/jbofh. TODO: Krever at oppsettet for å byggen den vert oppdatert. Let den difor bli i repoet enn så lenge.
  • Individuation: Frå cerebrum/clients/web/individuation.
  • phplib: Frå cerebrum/clients/web/phplib. Fullført.
  • Password: Frå cerebrum/clients/web/password. Fullført, kalla PasswordClient.
  • Postmaster: Frå cerebrum/clients/web/postmaster. Fullført, kalla PostmasterWebclient.
  • Individuation: Frå cerebrum/clients/web/individuation. Fullført.
  • AD-service: Frå cerebrum/servers/ad. Treng å oppdatere dokumentasjonen om dette samtidig.

Vi treng å sjå over kva vi skal gjere med enkelte delar:

  • ceresync - Utvikla av NTNU, ikkje oppdatert sidan 2010. Usikker på om det er behov for dette hos UiO, eller om det berre skal slettast.
  • cereweb - Utvikla av NTNU, ikkje oppdatert sidan 2010. Usikker på om det er behov for dette hos UiO, eller om det berre skal slettast.
  • servers/cerews - Utvikla av NTNU, ikkje oppdatert sidan 2010. Usikker på om det er behov for dette hos UiO, eller om det berre skal slettast.
  • `clients/examples/` - Usikker på om vi skal slette denne, eller kopiere filene inn i andre repo?
  • cerebrum/doc/ - Vi har ikkje konkludert med korleis vi ønsker å ha dokumentasjonen for Cerebrum framover, så usikker på kva vi skal gjere med dette. Det er i tillegg nokre mapper under her som tilhøyrer kode som er splitta ut i eigne repo. Desse bør flyttast over, men mest sannsynleg er det enklare å uførte etter migreringa.
  • servers/ephorte/ - Usikker på kor tilknytta Cerebrum-koden denne er. Skal uansett gå ut av produksjon innan sommaren 2014.

Det er også nokre repo under git.uio.no som skal flyttast til Stash:

  • Bilagslønn. TODO: Ikkje flytta endå.
  • phplib2. Flytta til Stash, men repo er ikkje sletta frå git.uio.no endå.
  • Alumni. Flytta til Stash, men repo er ikkje sletta frå git.uio.no endå.

2   Migrering av koden

For å migrere koden over frå svn til git følger vi git-scm.com sitt kapittel Git and Other Systems - Migrating to Git som utgangspunkt. Prosessen vert då:

  1. Lag mapping av utviklarar, frå brukarnamn i svn til fullt namn og e-postadresse i git. Det har vore ein del utviklarar frå tidlegare tider, så det kan hende vi treng å grave litt før vi finn ut kven alle er.
  2. Sjekk ut koden lokalt gjennom git svn clone. Dette tek tid, så det bør optimaliserast.
  3. Push koden til Stash.

2.1   Mapping av utviklarar

Vi henter ut lista over alle registrerte brukarnamn frå svn:

svn log ^/ --xml | grep -P "^<author" | sort -u | perl -pe 's/<author>(.*?)<\/author>/$1 = /' > users.txt

Denne lista er sjekka inn i cerebrum_sites/etc/svn_authors.txt for vidare bruk. Etter migreringa trengs ikkje fila lenger. Døme på formatet til kvar linje:

jazz = Jasmina Hodzic <jazz@usit.uio.no>

Lista er blitt forsøkt oppdatert med riktige namn, men denne kan vere mangelfull. I verste fall vil ikkje dei vi kjenner til få fullt namn eller riktig registrert e-postadresse i nytt Git-repo.

2.2   Optimalisering

Kloninga til git vha. git svn clone vil ta tid. Det er anbefalt litt optimalisering ved å speile repoet lokalt, og bruke tmpfs for kjappare lesing og skriving til filer.

  1. Lag ein kopi (mirror) av svn-repoet lokalt, for å unngå nettverkstrafikk. Kommandoar for dette:

    TODIR=/tmp/cerebrum_mirror
    svnadmin create $TODIR
    echo '#!/bin/sh' > $TODIR/hooks/pre-revprop-change
    chmod 755 $TODIR/hooks/pre-revprop-change
    svnsync init file://$TODIR svn+ssh://svn.uio.no/svnroot/cerebrum
    svnsync --non-interactive sync file:///$TODIR
    

    Deretter kan du heller bruke dette repoet når du migrerer i staden for å bruke svn.uio.no direkte. Køyringa tek rundt 3 timar første gangen, men du kan køyre den siste kommandoen fleire ganger for å få inn seinare revisjonar, om det har dukka opp meir sidan sist forsøk:

    svnsync --non-interactive sync file:///$TODIR
    
  2. Mount mappa du skal lage den git-migrerte kopien i til tmpfs:

    mkdir /tmp/cerebrum-stash
    sudo mount -t tmpfs tmpfs /tmp/cerebrum-stash
    

    Mappa vil då berre ligge i minnet og ikkje på disk, og vil difor vere meir effektiv å lese og skrive til.

Du er då klar til ei litt meir effektiv migrering.

2.3   Utskilling av andre tenester i eigne repo

Det er ønskeleg å rydde opp i repoet før vi migrerer, og vi skiller difor ut ulike system og tenester i eigne git-repo. Det er enklare å gjere dette før enn etter migreringa av Cerebrum-koden, så vi bruker litt ekstra tid på å få gjort dette først.

Utskillinga gjerast ved å køyre git svn clone på undermappa i cerebrum-repoet som det gitt systemet høyrer heime. Kommandoen for dette er typisk:

git svn clone --no-metadata \
    --authors-file=$HOME/src/cerebrum_sites/etc/svn_authors.txt \
    file:///tmp/cerebrum_mirror/trunk/cerebrum/clients/systemX \
    /tmp/cerebrum-systemX

Til dømes, for Brukerinfo:

git svn clone --no-metadata \
    --authors-file=$HOME/src/cerebrum_sites/etc/svn_authors.txt \
    file:///tmp/cerebrum_mirror/trunk/cerebrum/clients/brukerinfo \
    /tmp/brukerinfo

Etter kloninga sender ein det til eit nyoppretta repo i Stash, med git push på vanleg måte.

Når Cerebrum drift har oppgradert det gitte systemet til å bruke git, kan det slettast frå svn-repoet. Under migreringa av Cerebrum-koden må ein deretter hugse å fjerne denne mappa før ein sender repoet til Stash, slik at ein unngår at filer og historikk befinner seg både i cerebrum-repoet og det gitte systemet sitt repo.

2.4   Migrering av Cerebrum

Kommandoen for kloninga av koden:

git svn clone --no-metadata -T trunk/cerebrum \
     --authors-file=$HOME/src/cerebrum_sites/etc/svn_authors.txt \
     file:///tmp/cerebrum_mirror /tmp/cerebrum-stash

Ei kloning tek rundt 45 minutt.

Merk at parametera for tags (-t --tags) og branches (-b) er ikkje blitt brukt, då vi ikkje har behov for dei som er registrert i svn. Dei fleste branches er gamle og utdaterte, og det er i hovudsak NTNU UiT som har brukt tags. Vi tek difor ikkje med dette i migreringa. Ein eller to branches må takast manuelt etterpå.

Slett det som har blitt migrert ut av Cerebrum-repoet og inn i eigne repo og anna vi ikkje treng:

git stash
git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch \
    clients/brukerinfo clients/web clients/cweb clients/cis \
    clients/jbofh clients/web-jokim servers/ad' HEAD

Dette tek rundt 15 minuttar å køyre på ei oppegåande kontormaskin.

2.4.1   Push til Stash

For å pushe til Stash må du først opprette eit nytt, tomt repo i Cerebrum-prosjektet, evt. slette det gamle test-repoet, for deretter å køyre:

git remote add origin ssh://git@utv.uio.no:7999/crb/cerebrum.git
git push origin --all

Dette vert då den nye lokasjonen.

Av jokim
Publisert 1. apr. 2014 12:42