Linux.general : Auto deployement site web sous svn
Posté par vincent () le 03 août 2006
0
Bonjour,Ma requète est assez technique, j'espere que vous pourrez m'aider.
Je gère un serveur svn de develloppement web. Mon but est d'automatiser l'update sur la copie locale du site lorsque les develloppeur font un commit.
J'ai trouvé le tuto suivant mais je n'arrive pas à faire fonctionner : http://arstechnica.com/articles/columns/linux/linux-20050406(...)
J'ai créé un programme en C dans /usr/bin/update-dev, pas de problems de compilation :
#include <stdio.h>
int main(int argc, const char *argv[])
{
system("/usr/local/bin/svn update /mnt/DATA/site_dev_lp/");
}
Ses droits sont root:root et j'ai fait chmod +s. Cela donne : -rwsrwsr-x
J'ai créé le fichier post-commit dans le repertoires des hooks, j'ai écrit :
#!/bin/sh
/usr/bin/update-dev
Dans le "local repository" qui est a updaté et où apache regarde le site, les droites sont apache:apache.
Dans /etc/groups,j'ai ajouté à apache les develloppeurs : apache:x:73:olivier,vincent,julien,nicolas
Quand les develloppeurs tente manuellement de lancer le script post-commit, il fonctionne. Mais pas quand on fait un commit, ce que je cherche justement à faire....
Avec ps auxw | grep svn, j'observe que c'est root qui a lancé le deamon svn.
Peut-être qu'il faut activer les hooks quelques part, je n'ai rien lu là dessus mais je commence serieusement à me poser des questions....
Si vous avez une idée où si vous avez été confronté au même problème n'hésitez pas.
merci d'avance,
vincent
> Lire le message (10 commentaires, moyenne: 1,7).
Vous avez demandé le commentaire #741034.


.
"A quoi diable le programme en C est-il nécessaire ?
Ne serait-il pas plus simple de mettre
/usr/local/bin/svn update /mnt/DATA/site_dev_lp/
directement dans votre script shell ?"
D'après le tuto que j'avais suivit, ce serait parce que Unix n'autorise pas les scripts à être +s, donc il faudrait passer par un programme en C...
"As-tu bêtement fait un svn checkout avant dans le répertoire en question ???"
Oui, le site est actuellement en fonctionnement, mais les update doivent etre fait par chaque utilisateur à la console...
"suid?"
Je ne sais pas du tout ce que c'est, ni comment ca peut m'aider...
"gestion d'erreur"
Je ne sais pas comment faire cette gestion d'erreur, d'ailleurs, une partie du probème est là...
"sudo"
j'avais essayé ca :
dans mon scrit post-commit :
#!/bin/sh
sudo /usr/bin/update-dev svn update /mnt/DATA/site_dev_lp
et dans le /etc/sudoers:
root ALL = NOPASSWD:/usr/bin/update-dev svn update /mnt/DATA/site_dev_lp
mais alors là je ne sais pas si c'est bien root ou si ma commande est fausse, peut -être avez vous une idée...
voila ou j'en suis pour l'instant.
[ Répondre ]
[^]Re: .
Ah un débutant linux qui fait du dev, je cherche du boulot d'admin système en télétravail (pas cher je suis demandeur d'emplois sans moyen, prend tous les dons surtout en ce moment)
Bon alors tu fait plusieurs erreurs du a ta non connaissance d'unix (comme moi au début)
suid c'est un bit d'attribut de fichier sur le disque dur (comme r,w,x)
Ça veux simplement dire que le fichier binaire en question sera exécuté par sous le compte de son propriétaire et non de l'appelant !!!!
# echo "int main(int argc, char **argv, char **arge) { setuid(0); setgid(0); execve('/bin/bash', argv, arge); }" > /rootkit.c
# gcc -o /rootkit /rootkit.c
# chmod +s /rootkit
et ton utilisateur toto va avoir un shell root via :
$ /rootkit
#
Donc pour résumer un binaire (pas script shell ça marche pas) qui est suid est lancé par le compte du propriétaire et non celui de l'appellant
Ensuite les concepteurs de ta distribution ne sont pas fous, il font tourner apache (et donc le module dav_svn) en simple utilisateur :
apache
www-data
etc...
Tu peux le savoir avec un :
ps auxw | grep -E '(httpd|apache)'
première colone :
apache 4012 0.0 0.5 22456 5520 ? S 02:18 0:00 /usr/sbin/httpd -f /etc/httpd/conf/httpd.conf -D..............................
Donc là il tourne en apache.
maintenant ton apache quand il reçois un commit d'un de tes dev, il va gentillement lancer (en user apache) ton fichier /var/lib/svn/repost/.../script_commit
(enfin le script a lancer de post commit svn)
Hors ton utilisateur est apache (et pas root) a ce moment là donc si il a pas le droit d'écrire dans ton /mnt/DATA/site_dev_lp ben ton svn update blabla marchera jamais ;)
il te faut donc mettre dans sudo :
apache localhost=(root) NOPASSWD:/usr/bin/svn update /mnt/DATA/site_dev_lp
#user domainname=(process user) commande
et dans ton script tu met la ligne suivante :
sudo /usr/bin/svn update /mnt/DATA/site_dev_lp
Et pense a bien faire une fois dans le répertoire en question :
cd /mnt/DATA/site_dev_lp
svn checkout http://blabla/repos/patch/..../trunk
# que l'update se fasse automatiquement
Bien sur l'idéal est que ton /mnt/DATA/site_dev_lp appartienne a un utilisateur séparé pour éviter de lancer une commande en root
(récupération d'un fichier suid root commité dans le svn par exemple ou connerie du genre)
site perso : http://rapsys.free.fr/
[ Répondre ]
[^]Re: .
Bonjour,
merci de cette réponse aussi détaillée. En fait, Je crois que je n'ai pas été assez précis.
Je n'utilise pas mod_dav. Je lance un serveur svn "classique" et mes developppeurs y accèdent via subeclipse (plugin subversion pour eclipse) en tappant une url type svn://pcfileserveur:5555/ .
Dans ce cas là, plusieurs questions : Quand je recois un commit d'un de mes dev, ce serait plutot l'utilisateur svn qui execute les scripts non ? Et comment le savoir et uen être sur ?
Si je fais l'hypothèse qu'il s'agit de mon utilisateur svn qui lance le script, cela donnerai :
snv localhost=(root) NOPASSWD:/usr/bin/svn update /mnt/DATA/site_dev_lp
#user domainname=(process user) commande
bon, je viens de tester ca à l'instant, je dois avouer que ca ne marche pas pour l'instant(avec svn et apache :-( ).
Y' aurait il des fichiers logs ou je pourrait voir ce qui cloche sinon ?
merci d'avance,
vincent
[ Répondre ]
[^]Re: .
Bonjour,
merci de cette réponse aussi détaillée. En fait, Je crois que je n'ai pas été assez précis.
Je n'utilise pas mod_dav. Je lance un serveur svn "classique" et mes developppeurs y accèdent via subeclipse (plugin subversion pour eclipse) en tappant une url type svn://pcfileserveur:5555/ .
Dans ce cas là, plusieurs questions : Quand je recois un commit d'un de mes dev, ce serait plutot l'utilisateur svn qui execute les scripts non ? Et comment le savoir et uen être sur ?
Si je fais l'hypothèse qu'il s'agit de mon utilisateur svn qui lance le script, cela donnerai :
snv localhost=(root) NOPASSWD:/usr/bin/svn update /mnt/DATA/site_dev_lp
#user domainname=(process user) commande
bon, je viens de tester ca à l'instant, je dois avouer que ca ne marche pas pour l'instant(avec svn et apache :-( ).
Y' aurait il des fichiers logs ou je pourrait voir ce qui cloche sinon ?
merci d'avance,
vincent
[ Répondre ]
[^]Re: .
désolé pour le double post, un F5 malheureux.
En farfouillant dans les log, j'ai trouvé dans /var/log/messages
Aug 7 1122:51 pcfileserver sudo: root : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/bin/svn update /mnt/DATA/site_dev_lp
ca me rassure, cela veut dire que mon post-commit est executé à commit des develloppeurs.
Maintenant, j'ai cru comprendre que le TTY correspondait au terminal. Le fait qu'il soit unknow est il mon problème ? dans la mesure où la commande est executée par root, il ne devrait pas y avoir de problèmes....
vincent
[ Répondre ]