Práctica: Despliegues en iaas y heroku
Objetivos
El objetivo de esta práctica es proporcionar un mecanismo de despliegue de un libro gitbook a otros sites.
Despliegue en Heroku: Sincronización Automática con las gh-pages
Se busca que un push
a github produzca la actualización
automática de Heroku](../recursos/heroku.md) de manera parecida a como ocurre con gitboook.com.
Para lograr este objetivo usaremos la técnica descrita en el artículo Colaboración: The Perfect Work-flow with Git, GitHub, and SSH.
En el tutorial Colaboración: The Perfect Work-flow with Git, GitHub, and SSH se usa PHP para el código del servidor (que en nuestro caso vamos a hacer que se ejecute en Heroku e iaas). Utilice NodeJS y Express para escribir el servidor.
Escribiremos un servidor en express que sirve en Heroku los ficheros HTML estáticos generados a partir del libro y que además dispone de una ruta de sincronización
app.post('/sync', (request, response) => { ...
- Este servidor se añade al directorio
gh-pages
así como elProcfile
y unpackage.json
adaptados a Heroku El directorio
gh-pages
se convierte así en un repo separado con dos remotos: uno en GitHub y otro en HerokuCAda vez que se hace un Es este segundo repositorio el que se sincroniza mediante un
webhook
que apunta a la ruta/sync
Despliegue en iaas.ull.es
- En iaas.ull.es, debido a que la IP de la máquina virtual es privada a la red de la ULL, la estrategia explicada en Colaboración: The Perfect Work-flow with Git, GitHub, and SSH no funciona.
Para sincronizar con iaas.ull.es disponga un script que utilice
ssh
y/oscp
para actualizar los ficheros necesarios al repositorio del libro en la máquina virtual.Este ejemplo usando el comando
ssh
sugiere una forma de hacerlo:
[~/apuntesgitbook(master)]$ ssh sytw 'cd src/express-start; git ls-files'
.gitignore
README.md
hello/hello.js
hello/package.json
hello/views/index.ejs
routes/Rakefile
routes/app.js
routes/birds.js
routes/gulpfile.js
routes/package.json
routes/public/images/kitten.jpg
usando este comando nos conectamos a la máquina virtual iaas sytw
(previamente hemos hecho un alias ide la IP a sytw
configurado en ~/.ssh/config
) y ejecutamos en la misma un comando que nos posiciona en el directorio adecuado y llama al comando git
- Si se tiene establecida una pareja de claves SSH privada-pública entre la máquina de desarrollo (que se supone en la red de la ULL) y la máquina virtual, es posible usar
ssh
para conectarse a la máquina virtual y hacer ungit pull
en el directorio adecuado. - Esta solución tampoco trabaja si se está desarrollando en c9, ya que las máquinas de c9 no están en la red de la ULL.
Parta de los códigos escritos en las prácticas anteriores.
Referencias
- Colaboración: The Perfect Work-flow with Git, GitHub, and SSH
- Express
- Procesos: Ejecutando comandos Unix
- Heroku
- iaas
- Webhooks
Además repase las secciones utilizadas en las prácticas anteriores:
- Creación de Paquetes y Módulos en NodeJS
- Gulp
- Estudie el paquete ejs para la creación de plantillas
- Estudie los paquetes - como
fs
- para el manejo de archivos en Node.JS - Como se usa el módulo gh-pages para automatizar el despliegue en
gh-pages
- Como se despliega un libro en www.gitbook.com,
- GitBook Plugins
Preguntas y Respuestas
No entendemos cómo debemos estructurar el directorio de nuestra app y cómo disponer el gitbook en él: ¿debemos poner dentro del directorio
public/
las carpetasscripts/
,txt/
,README.md
, etc?No. Lo que sirves son los HTML que están en el directorio
gh-pages
.Ejecutas el servidor sirviendo como directorio de estáticos el directorio
gh-pages
que has generado con elbuild
En el servidor escribes:
app.use(express.static('gh-pages'));
¿Que URL debo poner en
settings->webhooks
de mi repo de GitHub?Tu servidor sirve como directorio de estáticos el directorio
gh-pages
que has generado con elbuild
En el servidor escribes:
app.use(express.static('gh-pages'));
En tu servidor tienes una ruta que se encarga de la sincronización:
app.get('/synchronize', (request, response) => { // ... call a bash process that makes a pull // to the gh-pages branch of the github repository // This is executed in the heroku servers, therefore // be sure the github remote is defined });