En días recientes estuve viendo un poco de Continuous Integration / Continuous Deployment (CI/CD), con Jenkins.
La idea que he captado es que Jenkins corre en el servidor donde normalmente ejecutamos a mano los pasos para deployar un proyecto. Luego configuramos las cosas para que Jenkins las haga por nosotros.
Por ejemplo, puedo tener en mi hosting un site estático hello-jenkins, cuyo repositorio está en GitHub. Luego que hago push en el repo desde mi máquina local debo entrar a la consola de mi hosting y hacer pull. Quizás alguna cosa más, como bower o npm, dependiendo de la complejidad del proyecto.
Empezaré con un simple site estático llamado hello-jenkins.
- En mi local, creo el proyecto hello-jenkins
- En GitHub, creo el repositorio hello-jenkins
- En mi local, establezco al repo en GitHub como mi remoto y hago push
- En mi hosting, clono el repo de GitHub
- https://rulokoba.me/~rulo/demos/hello-jenkins/
Ahora, haré un cambio y un deploy manual.
- En mi local, agrego un title, commit y push
- En mi hosting, hago pull
- Lo pesado de esta tarea es cuando no estoy logueado a la consola. Es necesario hacer ssh, ubicar la carpeta y hacer pull.
- Si Jenkins vive en este servidor, podría hacerlo por mi ante una señal. Por ejemplo, cuando se hace un push en GitHub.
- https://rulokoba.me/~rulo/demos/hello-jenkins/
En el hosting, tengo instalado Jenkins siguiendo la guía de:
- How To Install Jenkins on Ubuntu 16.04
- Jenkins tiene una aplicación web que permite administrarlo a través del browser
- Además tiene instalado los plugins para Git y GitHub.
En mi Jenkins, creo el job hello-jenkins:
- Elijo create new jobs
- Enter an item name: hello-jenkins
- Elijo Freestyle project
- OK
- En la sección de consiguración:
- Source Code Management
- Git
- Repository URL: https://github.com/akobashikawa/hello-jenkins.git
- Credentials: none
- Additional Behaviours
- Check out to a sub-directory
- Local sub-directory for repo:
/home/rulo/public_html/demos/hello-jenkins/ - Para que jenkins pueda escribir en este directorio se le puede agregar al grupo del usuario y reiniciar jenkins:
- $ sudo usermod -a -G rulo jenkins
- $ sudo systemctl stop jenkins
- $ sudo systemctl start jenkins
- Build Triggers
- GitHub hook trigger for GITScm polling
- Build (opcional)
- Execute shell
- Command
- echo "hello-jenkins build"
En el repo de GitHub, Settings:
- Webhooks
- Add webhook
- Payload URL: http://myjenkins_url/github-webhook/
- Es importante el trailing / al final
- Content type: application/json
- Which events would you like to trigger this webhook?
- [x] Let me select individual events.
- [x] Pushes
- [x] Pull requests
- [x] Active
- Add webhook
- Es importante que GitHub pueda encontrar a Jenkins ya configurado
Para probar, manualmente:
- En mi Jenkins, en el projecto hello-jenkins, wlijo Build Now
- En Build History aparecerá un nuevo item numerado, y le hago click.
- Elijo Console Output para ver la salida
Para probar el build automático:
- En mi local, hago un cambio, commit y push al repo
- En Build History aparecerá un nuevo item numerado, y le hago click.
- Elijo Console Output para ver la salida