Configuration d'un cycle de déploiement / build / CI pour les projets PHP

200

Je suis un développeur seul la plupart de mon temps, travaillant sur un certain nombre de grands projets, principalement basés sur PHP. Je souhaite professionnaliser et automatiser la gestion des modifications apportées à la base de code et créer un processus d'intégration continue qui rend possible la transition vers le travail en équipe sans avoir à effectuer des changements fondamentaux.

Ce que je fais en ce moment, c'est que j'ai un environnement de test local pour chaque projet; J'utilise SVN pour chaque projet; les modifications sont testées localement, puis transférées vers la version en ligne, généralement via FTP. La documentation de l'API est générée manuellement à partir du code source; Les tests unitaires sont quelque chose que je commence lentement, et cela ne fait pas encore partie de ma routine quotidienne.

Le «cycle de construction» que j'envisage ferait ce qui suit:

  • Un ensemble de modifications est archivé dans SVN après avoir été testé localement.

  • Je lance le processus de construction. La révision SVN HEAD est extraite, modifiée si nécessaire et préparée pour le téléchargement.

  • La documentation de l'API est générée automatiquement - si je ne l'ai pas encore configurée en détail, en utilisant un modèle par défaut, en analysant toute la base de code.

  • La nouvelle révision est déployée sur l'emplacement distant via FTP (y compris le renommage de répertoire, chmodding, l'importation de bases de données, etc.). C'est quelque chose que j'aime déjà beaucoup pour le phing , mais je suis ouvert à des alternatives bien sûr.

  • Des tests unitaires résidant dans un emplacement prédéfini sont exécutés. Je suis informé de leur échec ou de leur succès en utilisant la sortie e-mail, RSS ou (de préférence) HTML que je peux saisir et mettre dans une page Web.

  • (en option) un fichier texte "changelog" de l'utilisateur final dans un emplacement prédéfini est mis à jour avec une partie prédéfinie du message de validation ("Il est maintenant possible de filtrer à la fois" foo "et" bar "en même temps Ce message n'est pas nécessairement identique au message de validation SVN, qui contient probablement beaucoup plus d'informations internes.

  • Des choses comme les métriques de code, la vérification du style de code, etc. ne sont pas mon objectif principal en ce moment, mais à long terme, elles le seront certainement. Les solutions qui apportent ce prêt à l'emploi sont très aimablement envisagées.

je cherche

  • Commentaires et expériences de personnes qui sont ou étaient dans une situation similaire, et qui ont réussi à mettre en œuvre une solution pour cela

  • Surtout, de bons didacticiels pas à pas et des procédures pas à pas sur la façon de configurer cela

  • Des solutions qui fournissent autant d'automatisation que possible , par exemple en créant une API squelette, des cas de test et ainsi de suite pour chaque nouveau projet.

et aussi

  • Recommandations de produits . Ce que je sais jusqu'à présent, c'est phing / ant pour la construction, et phpUnderControl ou Hudson pour la partie rapport. Je les aime tous autant que je puisse voir, mais je n'ai bien sûr aucune expérience détaillée avec eux.

Je suis submergé de travail, j'ai donc une forte inclinaison vers des solutions simples. En revanche, s'il manque une fonctionnalité, je vais pleurer qu'elle soit trop limitée. :) Les solutions pointer-cliquer sont également les bienvenues. Je suis également aux recommandations de produits commerciaux qui peuvent fonctionner avec des projets PHP.

Ma configuration

Je travaille sur Windows localement (7, pour être exact) et la plupart des projets clients sont exécutés sur une pile LAMP, souvent sur un hébergement partagé (= pas de SSH distant). Je recherche des solutions que je peux exécuter dans mon propre environnement. Je suis prêt à configurer une machine virtuelle Linux pour cela, pas de problème. Les solutions hébergées ne m'intéressent que si elles fournissent tous les aspects décrits ou sont suffisamment flexibles pour interagir avec les autres parties du processus.

Bounty J'accepte la réponse qui, selon moi, me donnera le plus de kilométrage. Il y a beaucoup d'excellentes contributions ici, j'aimerais pouvoir accepter plus d'une réponse. Merci tout le monde!

Pekka 웃
la source

Réponses:

76

J'ai parcouru buildbot , CruiseControl.net , CruiseControl et Hudson . Bien que j'aie vraiment aimé CruiseControl *, c'était trop compliqué avec des cas de dépendance vraiment complexes. buildbot n'est pas facile à configurer, mais il a une belle aura (j'aime juste le python, c'est tout). Mais Hudson a conquis les trois premiers parce que:

  1. C'est simple à installer
  2. Il est facile de personnaliser
  3. Il a l'air bien et a une belle fonctionnalité de présentation
  4. Il a obtenu des mises à jour pointer-cliquer, pour lui-même et tous les plugins installés. C'est une fonctionnalité vraiment sympa, que j'apprécie de plus en plus

Mise en garde: je n'ai jamais utilisé Linux comme base pour les serveurs de build mentionnés ci-dessus (CC.net fonctionnait en mono ), mais ils devraient tous - selon les documents - fonctionner sur plusieurs plates-formes.

Configuration d'un serveur Hudson

Conditions préalables:

  • Java (1.5 vous servira très bien)
  • Accès en lecture au serveur subversion (j'ai un compte séparé pour l'utilisateur hudson)

De là, c'est juste:

java -jar hudson.war

Cela exécutera une petite instance de serveur directement à partir de votre console, et vous devriez pouvoir parcourir l'installation sur votre http://localhost:8080, si vous n'avez rien d'autre en cours d'exécution sur ce port à l'avance (vous pouvez spécifier un autre port en passant l' --httpPort=ANOTHER_HTTP_PORToption au commande ci-dessus) et tout s'est bien passé dans le processus d '«installation».

Si vous allez dans le répertoire des plugins disponibles ( http://localhost:8080/pluginManager/available), vous trouverez des plugins pour prendre en charge les tâches mentionnées ci-dessus (le support de subversion est installé par défaut).

Si cela vous a mis en appétit, vous devez installer un serveur d'applications Java, tel que Tomcat ou Jetty . Les instructions d'installation sont disponibles pour tous les principaux serveurs d'applications

Mise à jour : Kohsuke Kawaguchi a construit un installateur de service Windows pour Hudson

Mettre en place un projet à Hudson

Les liens dans la procédure suivante supposent une instance en cours d'exécution de hudson situé à http://localhost:8080

  1. Sélectionnez un nouveau travail ( http://localhost:8080/view/All/newJob) dans le menu de gauche
  2. Donnez un nom au travail et cochez Build a free-style software projectla liste
  3. Appuyez sur «ok» pour accéder à la page de configuration de la tâche. Toutes les options ont un petit point d'interrogation à côté d'eux. En appuyant sur ce bouton, un texte d'aide s'affiche concernant l'option.
  4. Dans le groupe d'options 'Source Code Management', vous utiliseriez Subversion. Hudson accepte à la fois l'accès URL et l'accès au module local
  5. Dans le groupe d'options 'Build Triggers', vous utiliseriez 'Poll SCM'. La syntaxe utilisée ici est celle de cron, donc interroger le dépôt subversion toutes les 5 minutes serait*/5 * * * *
  6. Le processus de construction du projet est spécifié dans le groupe d'options «Build». Si vous avez déjà un fichier de construction de fourmis avec toutes les cibles dont vous avez besoin, vous avez de la chance. Choisissez simplement 'Invoke ant' et écrivez le nom de la cible. Le groupe d'options prend également en charge les commandes maven et shell, mais il existe également un plugin disponible pour le phing .
  7. Cochez les actions de build supplémentaires dans «Actions post-build», telles que les notifications par e-mail ou l'archivage des artefacts de build.

Pour configurer des processus pour lesquels hudson n'a pas de plug-in, vous pouvez soit les appeler directement via un script shell depuis la configuration de construction, soit écrire votre propre plugin

Pièges:

  • Si vous le faites produire des artefacts de construction, n'oubliez pas de nettoyer Hudson après lui-même à intervalles réguliers.
  • Si vous avez plus de 20 projets configurés, pensez à ne pas afficher leur état de construction comme page principale par défaut sur hudson

Bonne chance!

Steen
la source
2
Je pense qu'il y a une erreur avec votre syntaxe cron. Cela fonctionnerait à la cinquième minute de chaque heure. Si vous voulez interroger le dépôt toutes les 5 minutes, vous devez utiliser * / 5
Brian Wigginton
2
@BrianWigginton: vous avez tout à fait raison. Et j'ai même essayé de corriger le message, mais je ne peux pas l'enregistrer car j'ai "une référence à un nom d'hôte invalide", à savoir 'localhost'. J'espère que les gens regardent ici pour la correction.
Steen
22

Le terme que vous recherchez est «intégration continue».

Voici un exemple de quelqu'un qui utilise GIT + phpundercontrol: http://maff.ailoo.net/2009/09/continuous-integration-phpundercontrol-git/

CruiseControl (qui est un serveur CI), peut utiliser Hosted SVN / GIT comme source. Vous pouvez donc même l'utiliser avec GitHub ou Beanstalk ou autre chose.

Ensuite, vous pouvez l'intégrer avec le type de logiciel suivant:

  • PHPUnit
  • php-codesniffer
  • phpdocumentor
  • PHP Gcov
  • PHPXref
  • Yasca
  • etc.

Vous pouvez également essayer ce CI hébergé: http://www.php-ci.net/hosting/create-project

Gardez cependant à l'esprit que ces outils nécessitent un support personnalisé si vous les intégrez vous-même.

Avez-vous également pensé à la gestion de projet et à la gestion des correctifs?

Vous pouvez utiliser Redmine pour la gestion de projet. Il a intégré le support d'intégration continue, mais uniquement en tant que côté client (pas en tant que serveur CI).

Essayez d'utiliser un SVN / GIT / etc hébergé. solution, car ils couvriront vos sauvegardes et maintiendront leurs serveurs en fonctionnement, afin que vous puissiez vous concentrer sur le développement.

Pour un tutoriel sur la façon de configurer Hudson, voir: http://toptopic.wordpress.com/2009/02/26/php-and-hudson/

Michiel
la source
2
Merci pour le lien. Les produits que je connais, ce que j'espère, ce sont plus des procédures pas à pas de type tutoriel comme celle que vous avez fournie.
Pekka
Salut, en octobre 2012, php-ci.net est-il en panne ou déjà retiré du service? Je n'arrive pas à me connecter à cette adresse, ni à trouver de nouvelles informations de l'année écoulée.
Ryan
@Ryan, je ne sais pas ce qui s'est passé. Je sais que vous pouvez essayer les autres. Vous pouvez peut-être essayer: CircleCI ou vous pouvez vérifier ce sujet: Intégration continue hébergée pour PHP?
Michiel
@Ryan, non ce n'est pas en panne, je l'utilise depuis un moment maintenant. Ils ont déménagé sur phptesting.org
omrakhur
6

J'utilise le serveur d'intégration continue Bamboo d'Atlassian pour mon projet PHP principal (avec leurs autres produits tels que fisheye (navigation dans le référentiel), jira (suivi des problèmes) et trèfle) (couverture du code)).

Il prend en charge SVN et prend désormais en charge Git et il a une excellente interface utilisateur. Il est disponible pour linux, windows et mac et peut fonctionner de manière autonome sur son propre serveur tomcat, ce qui est idéal pour les personnes (comme moi) qui n'aiment pas prendre des jours pour configurer leurs outils). Bien que cela puisse sembler cher, étant moi-même développeur seul, j'ai acheté la licence du kit de démarrage pour 10 $ (10 $ par logiciel). C'est super pour les petites équipes et ça vaut le coup d'oeil.

Steven Rosato
la source
Comment pouvez-vous configurer bamboo pour prendre en charge le phing? J'utilise actuellement des fourmis, mais il semble que le phing soit plus approprié pour le dépotage de php. Merci
Vincent
5

PHPTesting PHPCI C'est un joli serveur d'intégration continue construit en php.

De plus, sa source gratuite et ouverte. :)

il a un certain nombre de plugins ..

PHPCI comprend des plugins d'intégration pour:

  • Atoum
  • Behat
  • Feu de camp
  • Codeception
  • Compositeur
  • Email
  • Grognement
  • IRC
  • PHP
  • Peluche
  • MySQL
  • PDepend
  • PostgreSQL
  • Renifleur de code PHP
  • Détecteur de copier / coller PHP
  • Spécifications PHP
  • Unité PHP
  • Commandes shell
  • Tar / Zip
MarmiK
la source
Bien que j'aime PHPCI, je ne le recommande pas. C'est incroyablement bogué et non fiable. Il est triste de constater que les fonctionnalités de base courantes ne sont pas correctement testées à l'unité, de sorte que l'ajout d'une URL de projet est difficile sans gâcher.
Tek
@Tek quelle est votre stratégie CI pour PHP?
omrakhur
1
@omrakhur Je suis malheureusement bloqué avec PHPCI. Tous les autres logiciels sont tellement plus volumineux et prennent beaucoup de temps à configurer. Tout a ses avantages et ses inconvénients. Il vous suffit de choisir ce qui vous convient le mieux.
Tek
3

Je suis principalement un administrateur système mais parfois je code aussi PHP. En tant que projet parallèle, j'ai créé des scripts qui rendront simple et indolore la mise en place d'un environnement PHP CI complet à l'aide de Jenkins. Il exécute également un exemple de projet pour vous afin que vous puissiez voir comment chaque étape de génération est configurée.

Si vous voulez l'essayer, tout ce dont vous avez besoin est une boîte Debian / Ubuntu et un accès shell.

http://yauh.de/articles/379/setting-up-a-ci-environment-for-php-projects-using-jenkins-ci

Mettre à jour Pour ajouter du contenu à ma réponse:

Vous pouvez simplement configurer un CI Jenkins pour PHP en utilisant Ansible. Depuis la version 1.4, il prend en charge les rôles que vous pouvez télécharger à partir de leur site communautaire galaxy.ansibleworks.com et il fera le gros du travail pour vous. Cela s'appelle jenkins-php .

Stephan
la source
3

Je suggérerais d'utiliser Jenkins http://jenkins-ci.org/ c'est gratuit et c'est open source.

Il est assez simple à configurer, fonctionne sur plusieurs plates-formes et s'intègre bien avec d'autres outils d'intégration continue comme SonarQube (+ SQUALE) pour mesurer la dette technique et Thucydides pour tester l'automatisation.

Je suggère fortement d'utiliser GIT ou GIT Hub pour le contrôle de version au lieu de SVN. De mon point de vue, c'est juste un meilleur système de contrôle de version qui vous aidera à adapter vos efforts de développement plus tard.

Puisque vous travaillez principalement avec un projet PHP, vous pouvez utiliser d'autres outils.

PHPUnit - Pour les tests unitaires

PHP CodeSniffer - Vérifier les normes de codage

PHP Depend - Affiche vos dépendances de code PHP

XDEBUG - Pour les tests de performances

Tous ces outils peuvent être déclenchés par un travail Jenkins et contribuent à la qualité et aux performances de votre code.

Bonne chance et profitez-en!

AgileDeveloper
la source
3

Je n'utilise pas beaucoup de produits, ni même les types de produits que vous utilisez, mais je vais vous donner mon expérience.

J'exécute un environnement TEST en parallèle avec mon environnement PROD. Je n'ai aucun test local en soi. S'il est trop difficile de mettre tout en place dans un véritable environnement TEST, je corrige mon processus de construction. Je ne vois pas l'intérêt de tester localement, car les environnements sont différents. MISE À JOUR: La seule chose que je fais localement est d'exécuter "php -l" avant de télécharger quoi que ce soit. Arrête les erreurs stupides.

Le processus de construction fonctionne avec tout ce qui se trouve dans l'espace de travail actuel, qui inclut du code non validé. Ce n'est pas la tasse de thé de tout le monde, mais je vais tester très souvent. Tout est engagé avant de passer à PROD.

Une partie de mon processus de construction (similaire au vôtre) crée deux fichiers META. L'un contient les 100 dernières modifications (généralement) et me donne également le numéro de la liste de modifications actuelle. Le me montre quels changements sont installés. L'autre contient le CLIENTSPEC (en termes de Perforce) qui me montre exactement quelles branches ont été utilisées dans cette version. Ensemble, cela me donne des versions reproductibles.

Je ne crée pas directement dans l'environnement cible, mais dans une zone de transfert sur le serveur. J'utilise SSH donc cela a du sens. Cela me donne quelques avantages. Plus important encore, il évite de mourir à mi-chemin d'un téléchargement important. Cela me donne également un endroit pour stocker des fichiers META, et tous les fichiers de construction sont automatiquement archivés (afin que je puisse revenir directement à n'importe quelle construction). Le script enregistre également la mise à jour (il y a donc une entrée dans le flux de journaux et je peux voir avant et après) et lance tous les démons (j'utilise daemontools donc "svc -t"). Tout cela est mieux sur la machine cible.

Un autre problème concerne les modifications de la base de données. Je garde un script maître du schéma DB, que je mets à jour chaque fois que le schéma change. Chacune des modifications va également dans un script changes.sql, qui est téléchargé avec la génération dans la zone de transfert. Le script est exécuté dans le cadre du script d'installation.

Phil Wallach
la source
Merci pour votre contribution Phil, c'est une configuration très, très intéressante et je pense que je peux en utiliser certaines parties. Dans mon cas cependant, je n'aurai très souvent pas accès SSH à l'extrémité distante, j'ai donc besoin de beaucoup de "renseignements" localement, c'est pourquoi je pense que je vais avoir besoin d'un produit CI comme Hudson.
Pekka
2

J'ai récemment commencé le même type de processus et j'utilise Beanstalk pour l'hébergement svn.

Il y a deux fonctionnalités intéressantes dans les comptes payants (à partir de 15 $ je pense):

  • le déploiement permet à l'utilisateur de créer des cibles ftp pour les serveurs de production et de transfert, qui peuvent être déployées en cliquant sur un bouton (inc spécifiant une révision et une branche)
  • les webhooks permettent à l'utilisateur de configurer une URL qui est appelée à chaque validation / déploiement, en passant par des éléments comme le numéro de révision, la description et l'utilisateur. Cela pourrait être utilisé pour mettre à jour les documents, exécuter des tests unitaires et mettre à jour les journaux des modifications.

Je suis sûr qu'il existe d'autres serveurs svn hébergés ou auto-hébergés avec ces deux fonctionnalités, mais Beanstalk est celui dont j'ai l'expérience et il fonctionne très, très bien

Il existe également une API, qui, j'imagine, pourrait être utilisée pour intégrer davantage le déploiement dans votre processus.

Adam Hopkinson
la source
À la vôtre @adam. Je ne recherche pas tellement les services hébergés pour cela, car je crains qu'ils soient toujours trop limités pour ce dont j'ai besoin. Mais ce que vous dites semble intéressant, et l'API pourrait être un point de connexion pour le reste. Je vais y jeter un œil.
Pekka
Pas de soucis, pensais que tu pourrais dire ça. Cela me convient pour le moment, car je n'ai pas tout à fait la tête autour de svn (et je suis une équipe d'un homme), et ils offrent une exportation complète de repo si vous voulez bouger.
Adam Hopkinson
2

Prenons par exemple fazend.com , une plateforme CI hébergée gratuite, qui automatise les procédures de configuration et d'installation. Vous n'avez pas besoin de configurer le contrôle de version, le suivi des bogues, le serveur CI, l'environnement de test, etc. Tout est fait à la demande.

yegor256
la source
Mmm, ça a l'air très intéressant! Mais comment survivent-ils? Vous voyez que tout est gratuit? Comment paient-ils le serveur et les frais de l'E3?
Pekka
@Pekka Ce projet est parrainé par une société de développement de logiciels, c'est pourquoi le service est gratuit
yegor256