Forum Linux.général Auto deployement site web sous svn

Posté par  .
Étiquettes : aucune
0
3
août
2006
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
  • # Rien à voir

    Posté par  . Évalué à 4.

    Si je résume, nous avons :
    - 1 programme en shell qui, lorsqu'il est lancé, appelle
    - 1 programme en C qui, lorsqu'il est lancé, lance une commande.

    Bien.

    Une question surgit : 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 ?

    Si cela ne résoud pas votre problème, rajoutez une ou deux couches supplémentaires, en utilisant des langages de barbus comme le Haskell ou, soyons fous, soyons mode, du ruby, si possible sur des rails.
    • [^] # Re: Rien à voir

      Posté par  . Évalué à 2.

      Apparemment le programme C sert de wrapper pour pouvoir lancer la commande en suid, vu que ca passera pas directement avec un script (ouais donc, pourquoi alors le script.. :))

      Je ne connais pas vraiment les subtilités de SVN, mais en supposant qu'en theorie ca soit correct, je pencherais vers un bidouille a faire du coté de SELinux ou autre chose qui empecherait l'execution de ton prog C en tant que root (ce qui serait le cas par defaut avec par ex. une fedora).

      Pour y voir un peu plus clair, essaye de logguer dans un fichier des getuid/geteuid ici et la...
      • [^] # Re: Rien à voir

        Posté par  (site web personnel) . Évalué à 2.

        Question toute conne...

        As-tu bêtement fait un svn checkout avant dans le répertoire en question ???
        (parce que ton svn update se base sur le fait qu'il a l'url du repository svn dans un fichier de conf dans un sous répertoire .svn)

        Hors si a la base c'est vide ton svn il dois te dire que tu peux aller te ré-habiller si tu lui donne pas l'url de dépot et une copie locale a mettre a jour ;)
        • [^] # Re: Rien à voir

          Posté par  (site web personnel) . Évalué à 2.

          Et si j'étais toi j'utiliserais plutôt un sudo, c'est plus sur je pense...
          (et ça te permet de lancer la commande sous un utilisateur non privilégié, donc éviter les ennuis de sécurité)
  • # gestion d'erreur dans le prog c

    Posté par  . Évalué à 0.

    Avec une gestion d'erreur primaire, le problème pourrait se résoudre.
    Pour ce qui est du suid, un script perl pourrait avantageusement remplacer le prog c et permettre de faire une gestion d'erreur complète pour peu d'effort.
  • # .

    Posté par  . Évalué à 1.

    "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.
    • [^] # Re: .

      Posté par  (site web personnel) . Évalué à 2.

      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)
      • [^] # Re: .

        Posté par  . Évalué à 0.

        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
      • [^] # Re: .

        Posté par  . Évalué à 0.

        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
        • [^] # Re: .

          Posté par  . Évalué à 0.

          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

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.