web-dev-qa-db-fra.com

Configurer un cycle de déploiement / build / CI pour PHP projets

Je suis un développeur isolé la plupart du temps, travaillant sur un certain nombre de grands projets, principalement basés sur PHP. Je souhaite professionnaliser et automatiser le traitement des modifications apportées à la base de code et créer un processus d'intégration continue permettant de passer au travail en équipe sans effectuer de modifications fondamentales.

Ce que je fais actuellement, 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 dans lequel 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 changeset est vérifié dans SVN après avoir été testé localement.

  • Je commence le processus de construction. Le SVN HEAD est extrait, modifié si nécessaire et préparé 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, utilisez un modèle par défaut pour analyser l'ensemble du code.

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

  • Les 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 par e-mail, RSS ou (de préférence) en sortie HTML que je peux saisir et mettre dans une page Web.

  • (éventuellement) un fichier texte "changelog" d'utilisateur final situé dans un emplacement prédéfini est mis à jour avec une partie prédéfinie du message de validation ("Il est désormais possible de filtrer simultanément" foo "et" bar " Ce message n’est pas nécessairement identique au message de validation SVN, qui contient probablement beaucoup plus d’informations internes.

  • Des éléments tels que les métriques de code, la vérification du style de code, etc., ne sont pas mon objectif principal actuellement, mais à long terme, ils le feront certainement. Les solutions qui apportent cette solution prête à l’emploi sont très bien considérées.

Je cherche

  • Commentaires et expériences de personnes se trouvant ou se trouvant dans une situation similaire et ayant mis en œuvre avec succès une solution à ce problème

  • En particulier, bons didacticiels pas à pas et procédures pas à pas sur la manière de le configurer.

  • Des solutions offrant autant d'automatisation que possible , par exemple en créant une API squelette, des scénarios de test, etc. 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 peux voir, mais je n'ai bien sûr pas d'expérience détaillée avec eux.

Je suis submergé avec le travail, donc j'ai une forte inclination pour des solutions simples. D'un autre côté, si une fonctionnalité est manquante, je vais pleurer sur le fait qu'elle est trop limitée. :) Les solutions de type pointer-cliquer sont également les bienvenues. Je suis également aux recommandations de produits commerciaux qui peuvent fonctionner avec les 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 utiliser dans mon propre environnement. Je suis prêt à installer Linux VM 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 si elles sont suffisamment souples pour interagir avec les autres parties. du processus.

Prime J'accepte la réponse qui, selon moi, me rapportera 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!

198
Pekka 웃

Je suis passé par buildbot , CruiseControl.net , CruiseControl et Hudson . Malgré tout, j’ai bien aimé CruiseControl *, c’était trop compliqué avec des cas de dépendance très complexes. buildbot n’est pas facile à installer, mais il a une belle aura (j’aime juste le python, c’est tout). Mais Hudson a vaincu les trois premiers parce que:

  1. C'est juste facile à mettre en place
  2. C'est facile à personnaliser
  3. Il a l'air bien et a la fonctionnalité de vue d'ensemble Nice
  4. Il a obtenu des mises à jour pointer-cliquer, pour lui-même et pour 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 que comme base pour les serveurs de construction mentionnés ci-dessus (CC.net était exécuté sur mono ), mais ils devraient tous, selon la documentation, utiliser plusieurs plates-formes.

Configurer un serveur Hudson

Conditions préalables:

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

A partir 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 à votre http://localhost:8080, si rien d’autre n’existe à l’avance sur ce port (vous pouvez spécifier un autre port en passant le --httpPort=ANOTHER_HTTP_PORT option à la 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 Subversion est installé par défaut).

Si cela vous intéresse, vous devez installer un serveur d’application Java, tel que Tomcat ​​ou jetée . 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 de la procédure suivante supposent une instance en cours de Hudson située à l'adresse http://localhost:8080

  1. Sélectionner un nouveau travail (http://localhost:8080/view/All/newJob) dans le menu de gauche
  2. Nommez le travail et cochez Build a free-style software project sur la liste
  3. En appuyant sur "ok", vous accédez à la page de configuration du travail. Toutes les options ont un petit point d'interrogation à côté d'elles. En appuyant dessus, vous obtiendrez un texte d’aide concernant l’option.
  4. Sous le groupe d'options 'Gestion du code source', vous utiliseriez Subversion. Hudson accepte l’accès à l’URL ainsi que l’accès au module local
  5. Dans le groupe d'options "Construire des déclencheurs", vous utiliseriez "Poll SCM". La syntaxe utilisée ici est celle de cron, donc interroger le référentiel Subversion toutes les 5 minutes serait */5 * * * *
  6. Le processus de construction du projet est spécifié dans le groupe d'options 'Construire'. Si vous avez déjà un fichier de compilation ant avec toutes les cibles dont vous avez besoin, vous avez de la chance. Il suffit de choisir "Invoke ant" et d'écrire le nom de la cible. Le groupe d'options prend également en charge les commandes maven et Shell, mais il existe également un plug-in disponible pour phing .
  7. Cochez les actions de construction supplémentaires dans 'Actions de post-construction', telles que les notifications par courrier électronique ou l'archivage des artefacts de construction.

Pour configurer des processus pour lesquels hudson n’a pas de plug-ins, vous pouvez les appeler directement via un script Shell à partir de la configuration, ou vous pouvez écrire votre propre plugin

Pièges:

  • Si vous en avez pour fabriquer des artefacts de construction, n'oubliez pas que Hudson se nettoie à intervalles réguliers.
  • Si vous avez plus de 20 projets configurés, envisagez de ne pas afficher leur statut de construction comme page principale par défaut de hudson.

Bonne chance!

76
Steen

Le terme que vous recherchez est "intégration continue".

Voici un exemple d'utilisation de 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. Donc, vous pouvez même l'utiliser avec GitHub ou Beanstalk ou autre chose.

Ensuite, vous pouvez intégrer cela 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

N'oubliez pas cependant 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 prend en charge l'intégration continue intégrée, mais uniquement en tant que côté client (pas en tant que serveur CI).

Essayez d’utiliser un serveur SVN/GIT/etc. solution, car ils couvriront vos sauvegardes et feront fonctionner leurs serveurs, vous permettant ainsi de vous concentrer sur le développement.

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

22
Michiel

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

Il supporte SVN et supporte maintenant Git et possède 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 excellent pour les personnes (comme moi) qui n'aiment pas prendre des jours pour configurer leurs outils). Bien que cela puisse paraître coûteux, étant un développeur seul, j'ai acheté la licence du kit de démarrage pour 10 $ (10 $ par logiciel). C'est parfait pour les petites équipes et ça vaut le coup d'oeil.

6
Steven Rosato

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

De plus, son source libre et ouverte. :)

il a nombre de plugins ..

PHPCI comprend des plugins d'intégration pour:

  • Atoum
  • Behat
  • Feu de camp
  • Codeception
  • Composer
  • Email
  • Grognement
  • IRC
  • PHP
  • Peluche
  • MySQL
  • PDepend
  • PostgreSQL
  • Code renifleur PHP
  • Détecteur Copier/Coller PHP
  • Spéc. PHP
  • Unité PHP
  • Commandes Shell
  • Tar/Zip
5
Ajay Patel

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 à d'autres outils d'intégration continue tels que SonarQube (+ SQUALE) pour mesurer l'endettement technique et Thucydides pour les tests d'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, il s’agit simplement d’un meilleur système de contrôle de version qui vous aidera ultérieurement à redimensionner vos efforts de développement.

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

PHPUnit - Pour les tests unitaires

PHP CodeSniffer - Vérifie les standards de codage

PHP Depend - Affiche vos dépendances de code PHP

XDEBUG - Pour les tests de performance

Tous ces outils et être déclenché avec un travail Jenkins et contribue à la qualité et à la performance de votre code.

Bonne chance et amusez-vous!

3
AgileDeveloper

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

Je lance un environnement TEST en parallèle avec mon environnement PROD. Je n'ai aucun test local en soi. S'il est trop difficile d'entrer dans un véritable environnement TEST, je répare mon processus de construction. Je ne vois pas l'intérêt de tester localement, car les environnements sont différents. UPDATE: La seule chose que je fais localement est de lancer "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, ce qui inclut du code non engagé. Ce n'est pas la tasse de thé de tout le monde, mais je vais très souvent tester. Tout s’engage avant de passer à PROD.

Une partie de mon processus de construction (similaire au vôtre) crée deux fichiers META. La première contient les 100 dernières modifications (en général) et donne également le numéro actuel de la liste de modifications. La montre moi 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 construction. Ensemble, ils me donnent des versions reproductibles.

Je ne construis pas directement dans l'environnement cible, mais dans une zone de stockage intermédiaire sur le serveur. J'utilise SSH alors c'est logique. Cela me donne quelques avantages. Plus important encore, cela évite de mourir à mi-chemin d'un téléchargement volumineux. Cela me donne également une place pour stocker les fichiers META, et tous les fichiers de construction sont automatiquement archivés (pour que je puisse revenir directement à n'importe quelle compilation). Le script enregistre également la mise à jour (il y a donc une entrée dans le flux de journalisation et je peux voir avant et après) et lance tous les démons (j'utilise daemontools donc "svc -t"). Tous ces éléments sont mieux lotis sur la machine cible.

Un autre problème concerne les modifications de la base de données. Je conserve un script principal du schéma de base de données que je mets à jour à chaque modification du schéma. Chacune des modifications entre également dans un script changes.sql, qui est chargé avec la construction dans la zone de transfert. Le script est exécuté dans le cadre du script d'installation.

3
Phil Wallach

Je suis principalement un administrateur système mais parfois je code PHP). En tant que projet parallèle, j'ai créé des scripts qui simplifient et simplifient la configuration d'un système complet PHP Environnement CI utilisant Jenkins.Il exécute également un exemple de projet pour vous permettre de voir comment chaque étape de construction est configurée.

Si vous voulez l'essayer, vous avez uniquement besoin d'une boîte Debian/Ubuntu et d'un accès Shell.

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

Update Pour ajouter du contenu à ma réponse:

Vous pouvez simplement configurer un CI Jenkins pour PHP avec Ansible. Depuis la v1.4, il prend en charge les rôles que vous pouvez télécharger à partir de leur site de la communauté galaxy.ansibleworks.com. Vous l’appelez jenkins-php .

3
Stephan

Considérez fazend.com , une plate-forme CI gratuite hébergée, 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.

2
yegor256

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

Il y a deux caractéristiques intéressantes dans les comptes payants (à partir de 15 heures, je pense):

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

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

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

2
Adam Hopkinson