Despliegue automático a Heroku en Jenkins

Despliegue automático a Heroku en Jenkins

En estos días estuve configurando una tarea en Jenkins para realizar despliegue automático a una aplicación en Heroku, comparto a nivel general mis anotaciones.

¿Cómo crear una tarea en Jenkins?

  • Dependiendo de los permisos del usuario, en el dashboard inicial aparecerá la opción “New Item
  • Nombrar la tarea acorde con la actividad
  • Escoger “Freestyle project
  • Ir a “configure

¿Cómo configurar una tarea de Jenkins?

Una tarea en Jenkins de tipo “Freestyle project” se ejecuta teniendo en cuenta el siguiente flujo:

  • General: Define aspectos generales del proyecto
  • Source Code Management: Define dónde se encuentra el proyecto (CVS, Git, etc)
  • Build Triggers: Define qué acción va a hacer que el proyecto que estamos creando se ejecute
  • Build Environment: Define el entorno en el que se ejecutará la tarea
  • Build: Define qué acciones realizar al momento de realizar la ejecución de la tarea, por ejemplo, ejecutar un comando en una linea de comandos
  • Post-build Actions: Define acciones posteriores a la ejecución de la tarea

Para el ejemplo crearemos un flujo configurando algunos aspectos a manera de ejemplo.

General

En esta pestaña añadiremos la opción “discard old builds“, esto nos permitirá eliminar antiguas ejecuciones. Los parámetos para la configuración son:

  • Strategy: Log Rotation
  • Days to keep builds: 30
  • Max # of builds to keep: 10

Source Code Management

En esta pestaña configuraremos Git como el repositorio donde se encuentra el código a desplegar:

  • Repositorio 1:
    • Repository URL: url donde se encuentra el código (github, bitbucket, gitlab, etc)
    • Credentials: Credenciales para el ingreso a este repositorio
  • Repositorio 2:
    • Repository URL: url del repositorio en heroku
    • Credentials: Credenciales para el ingreso a este repositorio

Notas:

  • En nuestro caso tendremos que agregar otro repositorio ya que descargaremos el código de un origen y lo subieremos a otro (heroku), no olvidar añadir el nombre de este nuevo origen.
  • No olvidar que si queremos que las pruebas se ejecuten en una rama en particular, debemos configurar la rama en el parámetro “branches to build”, en nuestro caso, develop

Build Triggers

Queremos que la tarea de Jenkins se ejecute cada vez que existe un cambio en la rama develop de nuestro repositorio, para esto seleccionamos la opción “Build when a change is pushed to BitBucket

Build Environment

Debido a que no tenemos alguna restricción respecto al entorno en el que se ejecutará la tarea de Jenkins, no configuraremos nada en particular en esta sección.

Build

Debido a que en este proyecto necesitamos ejecutar ciertas operaciones particulares en bash, hemos creado un archivo “jenkins.sh” el cual contiene los comandos a ejecutar en la ejecución. Para ejecutar este archivo debemos:

  • Agregar un nuevo paso dando click en el botón “Add build step
  • Adicionar la siguiente para que ejecute el archivo que hemos creado:
bash ./jenkins.sh

Acá un ejemplo de este archivo:

set -e # detiene ejecución al encontrar un error
set -x # imprime los comandos
# Python/Django Stuff
pip install -r requirements.txt
# Environment Variables
export SUPER_SECRET_KEY="i-am-your-father"
# Run the tests
python manage.py test

Post-build Actions

En este paso realizaremos dos acciones:

Despliegue en Heroku

Después de ejecutar las pruebas queremos que se realice el despliegue automático de nuestra aplicación en Heroku, ya que para hacer el despliegue en Heroku tan solo es necesario realizar push a la rama master del proyecto, debemos:

  • Añadir la acción “Git Publisher” en la opción “Add post-build action
  • Habilitar las siguientes opciones:
    • Push Only If Build Succeeds: Esto permitirá que se realice el push siempre y cuando las acciones anteriores hayan sido exitosas
    • Añadiremos un branch con el botón “Add Branch
    • En “branch to push” configuraremos el nombre de la rama donde queremos hacer el push, master
    • En “target remote name” configuraremos el nombre del repositorio remoto, heroku

Notificación a Slack

Por último, queremos que Jenkins nos avise el estado de los builds en slack, para esto:

  • Añadimos la acción “Slack Notifications” en la opción “Add post-build action
  • Y habilitamos:
    • Notify Failure
    • Notify Success

Cualquier duda o comentario es bienvenido!