¿Cómo puedo implementar automáticamente mi aplicación después de un git push (GitHub y node.js)?

92

Tengo mi aplicación (node.js) implementada en un VPS (linux). Estoy usando git hub como repositorio. ¿Cómo puedo implementar la aplicación automáticamente en git push?

Avanzado
fuente
4
¿Ha revisado git hooks progit.org/book/ch7-3.html , y también revisa github help.github.com/test-webhooks?
Pawel Dubiel
1
Actualización para el enlace progit anterior: git-scm.com/book/en/Customizing-Git-Git-Hooks
Code
Git 2.10 agregará una característica interesante: opciones de inserción stackoverflow.com/a/38770670/6309
VonC

Respuestas:

63

Ejemplo en PHP:

Navegue a github en su repositorio de github agregue haga clic en "Admin"

haga clic en la pestaña 'Ganchos de servicio' => 'URL de WebHook'

y añadir

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

luego crea 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');
}

En build.sh, deberá poner los comandos habituales para recuperar su sitio de github

Pawel Dubiel
fuente
6
Hola muchas gracias ¿Qué impide que Bob ejecute mi script de implementación?
Avanzado
16
@Advanced 1 tal vez permisos de script, bandera de ejecución ... 2 agregar una etiqueta de cierre en PHP es una mala práctica.
Pawel Dubiel
3
@Advanced Una técnica para asegurarse de que Bob no ejecute su script es asegurarse de que la solicitud POST provenga de los servidores de Github. Consulte los encabezados HTTP que envían al realizar la solicitud. También puede crear una URL "secreta" que no se pueda adivinar.
jyap
5
@Purefan No es una broma :) stackoverflow.com/questions/3219383/…
Pawel Dubiel
1
@ Arius2038 ¿Has oído hablar de "aprendes algo nuevo todos los días"? Bueno, este es mi "algo nuevo" hoy. ¡Gracias por compartir!
Purefan
23

Hubo algunas menciones de ganchos de Git como respuestas / comentarios, lo que me ha funcionado en el pasado ... así que aquí está mi receta en caso de que alguien más requiera más detalles.

Utilizo una combinación del gancho posterior a la recepción de git y el supervisor de nodo para lograr una implementación automática simple (asumiendo que estás usando un repositorio remoto de git en esa máquina).


Configure su gancho posterior a la recepción

En tu repositorio: sudo vi hooks/post-receive

Y debería verse algo como:

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

Establecer permisos de archivo: chmod +x hooks/post-receive

Git actualizará los archivos en el directorio de su aplicación después de un empujón al repositorio.


Ejecute Node con Node-Supervisor

Deberá instalar Node-Supervisor en su máquina como un módulo de nodo global: sudo npm install supervisor -g

Ahora simplemente ejecute su aplicación de nodo con node-supervisor y observará los cambios en los archivos en su directorio de trabajo:

supervisor /home/path/to/your/www/server.js(nota en supervisorlugar de node).

Wes Johnson
fuente
Esto está bien, sin embargo, una cosa a tener en cuenta es que si agrega un nuevo npm a su aplicación local, también deberá realizar una instalación de npm para ese módulo en el servidor. Si no lo hace, probablemente tendrá una aplicación que se bloqueará.
k00k
2
No. Todos los módulos de nodo de los que depende mi aplicación local están instalados en el subdirectorio node_modules de mi proyecto, que es mi repositorio GIT local, por lo tanto, cuando agrego, confirmo y luego envío al servidor remoto, también se copian.
Wes Johnson
8
Correcto, pero lo que eso significa es que si alguno de esos módulos tiene código compilado (como mhash, por ejemplo), es posible que no se ejecute en otro servidor que tenga un sistema operativo y / o arquitectura diferente. Usar package.json para realizar un seguimiento de sus dependencias y luego una estrategia de implementación que lo haga npm install -len el servidor remoto es inteligente. Por supuesto, esto se puede combinar con su método mediante ganchos posteriores a la recepción.
k00k
1
y puede agregar el árbol de trabajo de Git directamente en el comando git checkout: git --work-tree = / var / www / tree --git-dir = / var / repo / deploy.git checkout -f (en lugar de crear la variable y exportarla en su secuencia de comandos.
JasonB
Sin embargo, la pregunta es sobre Github.
Noah
18

Probablemente sea muy tarde para responder aquí. Pero encontré este proyecto en github y parece hacer lo que quieres pero de una manera mucho más limpia.

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

Echale un vistazo. También estaría interesado en saber qué piensan los demás de esto en términos de comentarios y votos a favor.

Saludos,
S

Saurabh Kumar
fuente
15
"Probablemente sea muy tarde para responder aquí". Nunca demasiado tarde. :) En realidad, estás contribuyendo a toda la comunidad (la mayoría de los usuarios de Google; ¡guau, solo mirando esas 20.000 visitas!), Ni el único chico hizo la pregunta "hace algún tiempo". El tiempo, en sí mismo, es irrelevante: mientras la tecnología en cuestión sea relevante, su respuesta también lo será. (Gracias por la sugerencia, por cierto, compruébalo ...)
Sz.
1
gracias por tu cabeza! ;) Funcionó muy bien para mí en ese momento. Ahora prefiero usar travis (travis-ci.org), ( siempre que pueda ) para implementaciones automatizadas. @lunakid
Saurabh Kumar
8

En un proyecto que estoy desarrollando actualmente sigo las pautas cubiertas en el brillante libro de Jez Humble "Continuous Delivery" (vale la pena leerlo).

Esto significa crear una canalización de implementación utilizando algún tipo de servidor de integración continua (yo uso la edición comunitaria gratuita de Thoughtworks de Go ), que es responsable de verificar primero la calidad, complejidad y ejecución de pruebas unitarias de su código. Luego, puede seguir una canalización de implementación que resulte en un impulso a sus servidores de producción.

Esto suena muy complicado, pero no tiene por qué serlo, y hace que todo el proceso de escritura de código y su entrada en producción sea segura y sin preocupaciones (¡sin días de lanzamiento de miedo!).

Utilizo una canalización de implementación completa para sistemas en vivo y una versión reducida para los módulos npm que escribo, y ambos comparten la misma técnica de implementación con 1 clic.

Roy
fuente
y otro +1 por la recomendación del libro. Estoy descubriendo que CI no debe abordarse de manera casual.
Merrick
bueno, la gente hace una pregunta simple, le das una solución completa :). Tengo que decir que esto es una exageración. Pero si ya está utilizando la entrega continua, tal vez esta sea la ruta a seguir.
windmaomao
8

Acabo de publicar una solución basada en nodos para su problema: node-cd

Consiste en una aplicación de nodo simple que se ejecuta en su VPS que recibirá los Hooks posteriores a la recepción de Github y ejecutará el script que desee (por ejemplo, un script de shell que matará su aplicación, git pull y la reiniciará).

A21z
fuente
+1 porque es node.js puro, por lo que el cartel no tiene que agregar nada a su pila o usar un lenguaje con el que no se sienta cómodo. Además, código muy bien diseñado
code_monk
3

Aquí hay otra implementación simple de nodeJS.

Es un servidor de nodo muy simple que se ejecuta en un nombre de host y un puerto que configura y puede configurarse para manejar los enlaces web de recepción de publicaciones de GitHub. Y las acciones reales de pul / prueba / implementación se pueden personalizar para hacer lo que desee. En la implementación actual, es un comando de shell que se especifica en línea en el script del servidor nodeJS. Y también existe un esquema de seguridad basado en claves secretas muy simple.

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

Mi servidor de ensayo ya tenía un nodo instalado y en ejecución, por lo que escribir esto fue rápido y fácil.

Shyam Habarakada
fuente
" tudominio.com:8088/… " - ¡¿DE VERDAD ?! clave "secreta" pasada en claro en la URL !!!! Nadie debería usar eso.
Julian Knight
1
Tómate una aspirina y cálmate, Julian. Los parámetros de obtención se cifran cuando se usa https.
Gavin
3

Encontré que el proyecto para una implementación fácil usa git.

git-play

Creo que es la forma adecuada para ti.

Echale un vistazo.

Oh Seung Kwon
fuente
2

Si desea una solución basada en python / tornado, escribí un script para manejar las solicitudes POST de los servicios Webhook de Github . Puede encontrarlo en https://github.com/Akobi/ops/tree/master/autodeploy

Básicamente, usa un archivo de configuración JSON para enumerar los repositorios de los que espera que se envíen, los comandos que desea ejecutar en la implementación y en qué directorio deben ejecutarse los comandos. Todo lo que tendría que hacer es modificar el archivo de configuración a su gusto y ejecutar ¡la secuencia de comandos!

Además, uso Nginx como proxy inverso para reenviar estos POST a mi script. Puede encontrar la configuración de Nginx en el mismo repositorio de Github en la carpeta 'nginx'.

¡Feliz empuje!

Divij Rajkumar
fuente
1

Creé mi propia herramienta de implementación rudimentaria que automáticamente extraería nuevas actualizaciones del repositorio - https://github.com/jesalg/SlimJim - Básicamente escucha el post-receive-hook de github y usa un proxy para activar un actualizar el script.

jesal
fuente
1

Soy el fundador de https://commando.io y recientemente anunciamos una integración con GitHub a través de un servicio. La integración le permite ejecutar ejecuciones en servidores cuando empuja a un repositorio de GitHub. Esta es una oportunidad perfecta para ejecutar scripts de implementación automáticamente cuando inserta código.

Una ejecución es un script que escribe dentro de Commando.io que se puede escribir en bash, perl, python, ruby, go o node.js. Para leer más y ver un script de ejecución de ejemplo de ejecución git pull, consulte el anuncio de nuestra publicación en el blog: http://blog.commando.io/run-executions-via-github-push/

Justin
fuente
1

Deepl.io parece ser un competidor nuevo y prometedor en este espacio.

Características (tomadas de su sitio web):

  • Captura webhooks de GitLab y GitHub
  • Configurar múltiples repositorios
  • Configurar múltiples ramas por repositorio
  • Utilice sus propios scripts de implementación, ya sea PHP, shell o ambos
  • Envía correos electrónicos de confirmación
vanto
fuente
1

También tenga en cuenta que existen servicios gratuitos / económicos como REPOMAN.IO que automatizan casi todo esto por usted.

Kirschbaum
fuente