Comment puis-je déployer automatiquement mon application après un push git (GitHub et node.js)?

92

J'ai mon application (node.js) déployée sur un VPS (linux). J'utilise git hub comme référentiel. Comment puis-je déployer l'application automatiquement, sur git push?

Avancée
la source
4
avez-vous vérifié git hooks progit.org/book/ch7-3.html , et vérifiez également sur github help.github.com/test-webhooks
Pawel Dubiel
1
Mise à jour pour le lien progit ci-dessus: git-scm.com/book/en/Customizing-Git-Git-Hooks
Code Noviciate
Git 2.10 ajoutera une fonctionnalité intéressante: les options push stackoverflow.com/a/38770670/6309
VonC

Réponses:

63

Exemple en PHP:

Accédez à github dans votre référentiel github ajouter cliquez sur "Admin"

cliquez sur l'onglet 'Service Hooks' => 'URL WebHook'

et ajouter

http://your-domain-name/git_test.php

puis créez git_test.php

<?php 
try
{
  $payload = json_decode($_REQUEST['payload']);
}
catch(Exception $e)
{
  exit(0);
}

//log the request
file_put_contents('logs/github.txt', print_r($payload, TRUE), FILE_APPEND);


if ($payload->ref === 'refs/heads/master')
{
  // path to your site deployment script
  exec('./build.sh');
}

Dans le build.sh, vous devrez mettre les commandes habituelles pour récupérer votre site depuis github

Pawel Dubiel
la source
6
Salut, merci beaucoup. Qu'est-ce qui empêche Bob d'exécuter mon script de déploiement?
Avancé
16
@Advanced 1 peut-être des autorisations de script, un indicateur d'exécution ... 2 l'ajout d'une balise de fermeture en PHP est une mauvaise pratique.
Pawel Dubiel
3
@Advanced Une technique pour s'assurer que Bob n'exécute pas votre script est de s'assurer que la requête POST provient des serveurs de Github. Vérifiez les en-têtes HTTP qu'ils envoient lors de la demande. Vous pouvez également créer une URL «secrète» qui n'est pas devinable.
jyap
5
@Purefan Pas une blague :) stackoverflow.com/questions/3219383/…
Pawel Dubiel
1
@ Arius2038 Avez-vous déjà entendu parler de "vous apprenez quelque chose de nouveau chaque jour"? eh bien c'est mon "quelque chose de nouveau" aujourd'hui. Merci d'avoir partagé!
Purefan
23

Il y a eu quelques mentions de hooks Git en tant que réponses / commentaires, ce qui a fonctionné pour moi dans le passé .. alors voici ma recette si quelqu'un d'autre a besoin de plus de détails.

J'utilise une combinaison du hook git post-receive et du node-supervisor pour effectuer un déploiement automatique simple (en supposant que vous utilisez un référentiel git distant sur cette machine).


Configurer votre crochet post-réception

Dans votre référentiel: sudo vi hooks/post-receive

Et cela devrait ressembler à quelque chose comme:

#!/bin/sh
GIT_WORK_TREE=/home/path/to/your/www
export GIT_WORK_TREE
git checkout -f

Définissez les autorisations de fichier: chmod +x hooks/post-receive

Git actualisera les fichiers dans le répertoire de votre application après une poussée vers le référentiel.


Exécuter Node avec Node-Supervisor

Vous devrez installer Node-Supervisor sur votre machine en tant que module de nœud global: sudo npm install supervisor -g

Maintenant, exécutez simplement votre application de nœud avec node-supervisor et il surveillera les modifications apportées aux fichiers de votre répertoire de travail:

supervisor /home/path/to/your/www/server.js(notez supervisorau lieu de node).

Wes Johnson
la source
C'est bien, mais une chose à savoir est que si vous ajoutez un nouveau npm à votre application locale, vous devrez également faire une installation npm pour ce module sur le serveur. Sinon, vous aurez probablement une application qui plante.
k00k
2
Non .. Tous les modules de nœuds dont dépend mon application locale sont installés dans le sous-répertoire node_modules de mon projet, qui est mon dépôt GIT local, donc lorsque j'ajoute, valide, puis pousse vers le serveur distant, ils sont également copiés.
Wes Johnson
8
Bien, mais ce que cela signifie, c'est que si l'un de ces modules avait du code qui a été compilé (comme mhash par exemple), il pourrait ne pas fonctionner sur un autre serveur avec un système d'exploitation et / ou une architecture différents. L'utilisation de package.json pour suivre vos dépendances, puis une stratégie de déploiement qui effectue un npm install -lsur le serveur distant est intelligente. Cela peut bien sûr être couplé à votre méthode en utilisant des crochets post-réception.
k00k
1
et vous pouvez simplement ajouter l'arbre de travail Git directement dans la commande git checkout: git --work-tree = / var / www / tree --git-dir = / var / repo / deploy.git checkout -f (plutôt que de créer la variable et l'exporter dans votre script.
JasonB
La question concerne Github, cependant.
Noah
18

Probablement très tard pour repondre ici. Mais j'ai trouvé ce projet sur github et semble faire ce que vous voulez faire mais d'une manière beaucoup plus propre.

https://github.com/logsol/Github-Auto-Deploy

Vérifiez-le. Je serais également intéressé de savoir ce que les autres en pensent en termes de commentaires et de votes positifs.

Bravo,
S

Saurabh Kumar
la source
15
"Probablement très tard pour repondre ici." Jamais trop tard. :) Vous contribuez en fait à toute la communauté (la plupart d'entre nous, googleurs; wow, juste en regardant ces 20k vues!), Pas le seul gars qui a posé la question "il y a quelque temps". Le temps, en lui-même, n'a pas d'importance: tant que la technologie en question est pertinente, votre réponse le sera aussi. (Merci pour le tuyau, BTW, vérifiant ça ...)
Sz.
1
merci pour votre tête! ;) Cela fonctionnait très bien pour moi à ce moment-là. Maintenant, je préfère utiliser travis (travis-ci.org), ( partout où je peux ) pour les déploiements automatisés. @lunakid
Saurabh Kumar
8

Dans un projet que je suis en train de développer, je suis les directives décrites dans le brillant livre de Jez Humble "Continuous Delivery" (qui vaut bien une lecture).

Cela signifie créer un pipeline de déploiement à l'aide d'une forme de serveur d'intégration continue (j'utilise l'édition communautaire gratuite de Thoughtworks de Go ), qui est chargé de vérifier d'abord votre code pour la qualité, la complexité et l'exécution des tests unitaires. Il peut ensuite suivre un pipeline de déploiement entraînant une poussée vers vos serveurs de production.

Cela semble très compliqué, mais ce n'est pas obligatoire, et cela rend tout le processus d'écriture de code et rend son passage en production sûr et sans souci (pas de jours de sortie effrayants!).

J'utilise un pipeline de déploiement complet pour les systèmes en direct et une version réduite pour les modules npm que j'écris, et les deux partagent la même technique de déploiement en 1 clic.

Roy
la source
& un autre +1 pour la recommandation de livre! Je découvre que CI ne doit pas être abordé avec désinvolture.
Merrick
eh bien, les gens posent une question simple, vous donnez une solution complète :). Je dois dire que c'est exagéré. Mais si vous utilisez déjà la livraison continue, c'est peut-être la voie à suivre.
windmaomao
8

Je viens de publier une solution basée sur les nœuds à votre problème: node-cd

Il s'agit d'une simple application de nœud s'exécutant sur votre VPS qui recevra les Hooks post- réception de Github et exécutera le script que vous aimez (par exemple, un script shell qui tuera votre application, git pull et la redémarrera).

A21z
la source
+1 parce que c'est pur node.js, donc l'affiche n'a rien à ajouter à sa pile, ni à utiliser un langage avec lequel il n'est pas à l'aise. Aussi, code vraiment bien présenté
code_monk
3

Voici une autre implémentation simple de nodeJS.

C'est un serveur de nœuds très simple qui s'exécute sur un nom d'hôte et un port que vous configurez et qui peut être configuré pour gérer les hooks Web GitHub post-recevoir. Et les actions réelles pul / test / deploy peuvent être personnalisées pour faire tout ce que vous voulez. Dans l'implémentation actuelle, il s'agit d'une commande shell qui est spécifiée en ligne dans le script du serveur nodeJS. Et il existe également un schéma de sécurité très simple basé sur secret_key.

https://github.com/shyam-habarakada/rscds

Mon serveur de test avait déjà un nœud installé et en cours d'exécution, donc l'écriture était rapide et facile.

Shyam Habarakada
la source
" votredomaine.com:8088/... " - VRAIMENT?! Clé "secrète" passée en clair dans l'URL !!!! Personne ne devrait utiliser cela.
Julian Knight
1
Prends une aspirine et installe Julian. Les paramètres Get sont chiffrés lors de l'utilisation de https.
Gavin
3

J'ai trouvé le projet pour un déploiement facile utilise git.

git-play

Je pense que c'est la bonne façon pour vous.

Vérifiez-le.

Oh Seung Kwon
la source
2

Si vous voulez une solution basée sur python / tornado, j'ai écrit un script pour gérer les requêtes POST des services Webhook de Github . Vous pouvez le trouver sur https://github.com/Akobi/ops/tree/master/autodeploy

Il utilise essentiellement un fichier de configuration JSON pour répertorier les dépôts à partir desquels vous attendez des push, les commandes que vous souhaitez exécuter lors du déploiement et le répertoire dans lequel les commandes doivent s'exécuter. Il vous suffit de modifier le fichier de configuration à votre guise et de l'exécuter le scénario!

De plus, j'utilise Nginx comme proxy inverse pour transmettre ces POST à ​​mon script. Vous pouvez trouver la configuration Nginx dans le même dépôt Github sous le dossier 'nginx'.

Bonne poussée!

Divij Rajkumar
la source
1

J'ai créé mon propre outil de déploiement rudimentaire qui extraire automatiquement les nouvelles mises à jour du référentiel - https://github.com/jesalg/SlimJim - En gros, il écoute le post-receive-hook github et utilise un proxy pour déclencher un script de mise à jour.

jésal
la source
1

Je suis le fondateur de https://commando.io et nous avons récemment annoncé une intégration avec GitHub via un service. L'intégration vous permet d'exécuter des exécutions sur des serveurs lorsque vous poussez vers un dépôt GitHub. Il s'agit d'une opportunité parfaite pour exécuter automatiquement des scripts de déploiement lorsque vous envoyez du code.

Une exécution est un script que vous écrivez dans Commando.io et qui peut être écrit en bash, perl, python, ruby, go ou node.js. Pour en savoir plus et voir un exemple de script d'exécution de l'exécution git pull, consultez l'annonce de notre article de blog: http://blog.commando.io/run-executions-via-github-push/

Justin
la source
1

Deepl.io semble être un nouveau candidat prometteur dans cet espace.

Caractéristiques (tirées de son site Web):

  • Attraper les webhooks de GitLab et GitHub
  • Configurer plusieurs référentiels
  • Configurer plusieurs branches par référentiel
  • Utilisez vos propres scripts de déploiement, PHP, shell ou les deux
  • Envoie des e-mails de confirmation
vanto
la source
1

Notez également qu'il existe des services gratuits / peu coûteux comme REPOMAN.IO qui automatisent presque tout cela pour vous.

Kirschbaum
la source