Difference between revisions of "SVN (WebCie)"

From A-Eskwiki
Jump to: navigation, search
(Zet er flink wat comments omheen want we hebben nu Git)
Line 1: Line 1:
 
[[Category:WebCie]]
 
[[Category:WebCie]]
 +
 +
We gebruiken tegenwoordig [[WebCie Git]], dus het overgrote gedeelte van de pagina staat vanaf nu in html-comments. Check dus de source als je toch nog SVN moet leren!
 +
 +
<!--
 
SVN (Subversion) is het magische systeem waarmee we controle houden op wat er gebeurt met alle WebCie-code. Ieder WebCie-lid heeft een kopie (een checkout) van het volledige systeem staan op zijn eigen account (in de map ~/wwwdebug). Deze code bepaalt wat jij te zien krijgt in je browser als je naar je persoonlijke debugpagina gaat (lijkt op http://blabla.debug.a-eskwadraat.nl). Als je wijzigingen in deze code aanbrengt, veranderen dus alleen de pagina's op jouw persoonlijke debug-omgeving. Dat noemen we een sandbox, het zorgt er voor dat je rustig je code kan ontwikkelen zonder dat de rest van de WWW daar last van heeft. Bovendien is jouw debugpagina alleen benaderbaar door WebCie-leden, dus als je per ongeluk lekkende SQL-queries schrijft is dat geen ramp.  
 
SVN (Subversion) is het magische systeem waarmee we controle houden op wat er gebeurt met alle WebCie-code. Ieder WebCie-lid heeft een kopie (een checkout) van het volledige systeem staan op zijn eigen account (in de map ~/wwwdebug). Deze code bepaalt wat jij te zien krijgt in je browser als je naar je persoonlijke debugpagina gaat (lijkt op http://blabla.debug.a-eskwadraat.nl). Als je wijzigingen in deze code aanbrengt, veranderen dus alleen de pagina's op jouw persoonlijke debug-omgeving. Dat noemen we een sandbox, het zorgt er voor dat je rustig je code kan ontwikkelen zonder dat de rest van de WWW daar last van heeft. Bovendien is jouw debugpagina alleen benaderbaar door WebCie-leden, dus als je per ongeluk lekkende SQL-queries schrijft is dat geen ramp.  
  
Line 96: Line 100:
  
 
Goed nieuws! Minder wachtwoorden! Het is me eindelijk gelukt om authenticatie van de svn-repo te koppellen aan het systeem dus we hebben geen aparte wachtwoorden voor de svn meer nodig. Het is zelfs zo dat als je in de werkkamer bent ingelogd dat je dan helemaal geen wachtwoord meer nodig hebt om bij de svn te komen (dit betekent niet dat iedereen er zomaar bij kan). Dat komt vanwege kerberos tickets enzo. Overigens is de default fallback als je geen kerberosticket hebt je systeemaccount met systeemwachtwoord, maar met een kerberosticket is de svn wel een heel stuk sneller. Je kan altijd een nieuwe ticket krijgen door in de terminal 'kinit *account*' te doen (met natuurlijk als account je eigen accountnaam). Anyway, mochten er problemen mee zijn, laat het dan vooral aan me weten.
 
Goed nieuws! Minder wachtwoorden! Het is me eindelijk gelukt om authenticatie van de svn-repo te koppellen aan het systeem dus we hebben geen aparte wachtwoorden voor de svn meer nodig. Het is zelfs zo dat als je in de werkkamer bent ingelogd dat je dan helemaal geen wachtwoord meer nodig hebt om bij de svn te komen (dit betekent niet dat iedereen er zomaar bij kan). Dat komt vanwege kerberos tickets enzo. Overigens is de default fallback als je geen kerberosticket hebt je systeemaccount met systeemwachtwoord, maar met een kerberosticket is de svn wel een heel stuk sneller. Je kan altijd een nieuwe ticket krijgen door in de terminal 'kinit *account*' te doen (met natuurlijk als account je eigen accountnaam). Anyway, mochten er problemen mee zijn, laat het dan vooral aan me weten.
                         
+
 
 +
-->
 +
 
 
== Hoe verhuis ik SVN naar Git? ==
 
== Hoe verhuis ik SVN naar Git? ==
  
Line 143: Line 149:
  
 
Importeer de commit-hooks van subversion en pas ze aan zodat ze met git werken. Ik heb besloten om ze in een nieuwe map hooks te zetten en dan te symlinken. Dit is een boel gespecialiseerd programmeerwerk, dus kan ik verder geen hints voor geven. Check wel even dat al je dingen executable zijn!
 
Importeer de commit-hooks van subversion en pas ze aan zodat ze met git werken. Ik heb besloten om ze in een nieuwe map hooks te zetten en dan te symlinken. Dit is een boel gespecialiseerd programmeerwerk, dus kan ik verder geen hints voor geven. Check wel even dat al je dingen executable zijn!
 +
 +
Pas in je lokale repository ook de cronscripts aan zodat ze werken met git ipv svn.
  
 
Nu gaan we dingen beschikbaar maken! Maak een repo voor alle commits en eentje voor de hooks. Op <code>vm-www</code>:
 
Nu gaan we dingen beschikbaar maken! Maak een repo voor alle commits en eentje voor de hooks. Op <code>vm-www</code>:
Line 174: Line 182:
 
</pre>
 
</pre>
  
=== Tot hier ben ik nu gekomen ===
+
Installeer een ssh key zodat je als user webcie kan git pull'en.
 +
Op vm-www-debug als user webcie:
 +
<pre>
 +
ssh-keygen                                                                   
 +
ssh-copy-id vm-www   
 +
     
 +
# Maak nu de repo voor demosite                                                     
 +
mkdir /srv/http/demo/git                                                     
 +
cd /srv/http/demo/git                                                         
 +
git init                                                                     
 +
git remote add origin ssh://vm-www/srv/git                                   
 +
git pull origin master                                                     
  
Hang alle andere svn-checkouts aan git ipv svn: de live site en iedereens debug.
+
# Stop de huidige inhoud van demosite in je git-repo                             
 +
rm -r gettext lib scripts share www                                           
 +
mv ../gettext ../lib ../scripts ../share ../www .                             
 +
# en gebruik symlinks om het weer werkend te krijgen                         
 +
ln -s /srv/http/demo/git/gettext ..                                           
 +
ln -s /srv/http/demo/git/lib ..                                               
 +
ln -s /srv/http/demo/git/scripts ..                                           
 +
ln -s /srv/http/demo/git/share ..                                             
 +
ln -s /srv/http/demo/git/www ..
 +
</pre>
 +
 
 +
Check goed dat alles werkt (zie ook [https://www.a-eskwadraat.nl/Service/Bugweb/7334 Bug #7334] voor een error die random was begonnen te gebeuren en random weer ophield), en doe hetzelfde voor de livesite in <code>/srv/http/www/git</code> (ik ga geen commando's geven want je moet hier heel goed bij nadenken!)
 +
       
 +
Ook nog wat cronjobs installeren (die je als het goed is al hebt vertaald van svn naar git!)
 +
                                                                 
 +
Op vm-www-debug als user webcie:
 +
<pre>             
 +
cd /srv/http/demo/scripts                                                     
 +
crontab -l # check dat je de juiste crontab wil aanpassen                     
 +
crontab cron/crontab_vm-www-debug.webcie                                     
 +
</pre>
 +
Op vm-www als user webcie:
 +
<pre>             
 +
cd /srv/http/demo/scripts                                                     
 +
crontab -l # check dat je de juiste crontab wil aanpassen                     
 +
crontab cron/crontab_vm-www.webcie                                     
 +
</pre>       
  
Update allerlei documentatie (want dat vinden onze afstammelingen altijd fijn)
+
Zorg er tenslotte "eventjes" voor dat iedereen overstapt naar Git en alle documentatie weer klopt.

Revision as of 17:30, 7 January 2017


We gebruiken tegenwoordig WebCie Git, dus het overgrote gedeelte van de pagina staat vanaf nu in html-comments. Check dus de source als je toch nog SVN moet leren!


Hoe verhuis ik SVN naar Git?

In december 2016 heeft de WebCie besloten om over te stappen naar Git. Omdat dit nogal een klus is en meerdere dagen duurde, leek het me handig om voor mezelf ook meteen bij te houden wat er voor stappen nodig waren. Zie ook StackOverflow en iemands website.

Maak in je homedir een mapje waar alle tsjak in terechtkomt.

mkdir ~/svn2git

Eerst zoeken we alle committers uit zodat we die naar git kunnen vertalen.

cd ~/wwwdebug
git svn rebase
git shortlog -sn > ~/svn2git/committers.txt
cd ~/svn2git

(alternatief als je nog geen gitsvn-checkout hebt, maar werkt niet want er staan HEEL ERG VEEL dingen in SVN:

svn log --quiet https://svn.a-eskwadraat.nl/svn/www/ | grep '^r' | awk '{print $3}' | sort -u > committers.txt

Vertaal nu gebruikersnamen naar naam + emailadres (het formaat is gebruikersnaam = Naam <emailadres&rt;. Gebruik bijvoorbeeld dit vim-macro: |df→yiw$a = ^[pa <^[pa@a-eskwadraat.nl>^[j (waarbij staat voor tab en ^[ voor escape)

vim authors.txt

We gaan nu een schone kopie van de repo maken om daar verscheidene vertalingen op toe te passen. Dit duurt ongelofelijk lang want er staan HEEL ERG VEEL dingen in SVN:

git svn clone https://svn.a-eskwadraat.nl/svn/www/ --no-metadata -A authors.txt -t tags -b branches -T trunk wwwdebug >>fetch_log 2>>error_log

(Merk op dat we elke branch uitchecken en het op zijn minst lineair is in het totaal aantal wijzigingen in elke commit op elke branch, wat ook wel O(griezelig groot) heet.)

Je kan nu misschien de volgende errors krijgen (hiervoor hebben we de bestanden fetch_log en error_log want een paar duizend commits keer een paar duizend files scrolt meteen uit je terminalbuffer):

  • ontbrekende author: voeg die toe in authors.txt en git svn fetch >>fetch_log 2>>error_log verder
  • ontbrekende bestanden (absent_file en/of object not found in commit): Volgens het internet: doe git svn reset -r... tot de laatste commit die wel klopte en git svn fetch >>fetch_log 2>>error_log verder. Dit bleek niet te werken bij het fetchen van r15195 naar trunk, dus toen ben ik maar een bestaande git-svn checkout gaan bewerken.

Vraag een sysopper of die heel lief voor je wil zijn en de commithooks uit de svn-repository in ~/svn2git/hooks wil zetten. Liefst ook het script dat de WebCie een mail stuurt als een nieuwe commit is gepusht, op dit moment te vinden in /usr/share/subversion/hook-scripts/mailer/mailer.py

Nu gaan we nog wat restjes ledendata weghalen, want blijkbaar was het een ding vroeger om ledendata in je repo te zetten... Zie ook StackOverflow.

git filter-branch --index-filter 'git rm --cached -r --ignore-unmatch www/whoswho_cprogs.old/' --prune-empty --tag-name-filter cat -- --all

(Check of het ook weg is in de obsolete branch, of mieter gewoon die hele branch weg!)

Importeer de commit-hooks van subversion en pas ze aan zodat ze met git werken. Ik heb besloten om ze in een nieuwe map hooks te zetten en dan te symlinken. Dit is een boel gespecialiseerd programmeerwerk, dus kan ik verder geen hints voor geven. Check wel even dat al je dingen executable zijn!

Pas in je lokale repository ook de cronscripts aan zodat ze werken met git ipv svn.

Nu gaan we dingen beschikbaar maken! Maak een repo voor alle commits en eentje voor de hooks. Op vm-www:

sudo mkdir -p /srv/git /srv/git-hooks
sudo chown webcie:webcie /srv/git /srv/git-hooks
sudo chmod o= /srv/git /srv/git-hooks
sudo chmod ug=rwx /srv/git /srv/git-hooks
sudo chmod g+s /srv/git /srv/git-hooks
cd /srv/git
git init --bare # want we willen niet dat er een checkout komt!
cd ../git-hooks
git init
git remote add origin ../git
git config core.sparsecheckout true # we hoeven alleen de hooks hier te hebben
echo hooks/ >> .git/info/sparse-checkout

In je lokale git-repo:

git remote add origin ssh://vm-www/srv/git
git push origin master

Op vm-www, in /srv/git-hooks:

git pull
cd /srv/git/hooks
ln -s /srv/git-hooks/* .

Installeer een ssh key zodat je als user webcie kan git pull'en. Op vm-www-debug als user webcie:

ssh-keygen                                                                     
ssh-copy-id vm-www     
      
# Maak nu de repo voor demosite                                                      
mkdir /srv/http/demo/git                                                       
cd /srv/http/demo/git                                                          
git init                                                                       
git remote add origin ssh://vm-www/srv/git                                     
git pull origin master                                                      

# Stop de huidige inhoud van demosite in je git-repo                              
rm -r gettext lib scripts share www                                            
mv ../gettext ../lib ../scripts ../share ../www .                              
# en gebruik symlinks om het weer werkend te krijgen                           
ln -s /srv/http/demo/git/gettext ..                                            
ln -s /srv/http/demo/git/lib ..                                                
ln -s /srv/http/demo/git/scripts ..                                            
ln -s /srv/http/demo/git/share ..                                              
ln -s /srv/http/demo/git/www ..

Check goed dat alles werkt (zie ook Bug #7334 voor een error die random was begonnen te gebeuren en random weer ophield), en doe hetzelfde voor de livesite in /srv/http/www/git (ik ga geen commando's geven want je moet hier heel goed bij nadenken!)

Ook nog wat cronjobs installeren (die je als het goed is al hebt vertaald van svn naar git!)

Op vm-www-debug als user webcie:

               
cd /srv/http/demo/scripts                                                      
crontab -l # check dat je de juiste crontab wil aanpassen                      
crontab cron/crontab_vm-www-debug.webcie                                      

Op vm-www als user webcie:

               
cd /srv/http/demo/scripts                                                      
crontab -l # check dat je de juiste crontab wil aanpassen                      
crontab cron/crontab_vm-www.webcie                                      

Zorg er tenslotte "eventjes" voor dat iedereen overstapt naar Git en alle documentatie weer klopt.