Despliegue Continuo con Gitlab y Google Cloud

A día de hoy no podemos trabajar sin integración y despliegue continuos, no es ningún secreto. Hace tiempo que los desarrolladores y los Ingenieros de QA utilizamos herramientas que nos permiten ahorrar tiempo y evitar errores gracias a la automatización de tareas y despliegues.

En Solid GEAR desarrollamos sistemas software a medida utilizando metodologías Agiles, nuestros clientes ven de forma temprana e iterativa el producto que estamos construyendo juntos, conseguimos así su feedback y lo incorporamos al producto.

Supongamos que cada vez que acabamos una iteración de desarrollo queremos desplegar una aplicación web para que el cliente la vea, tendríamos que dar varios pasos:

  • Compilar la aplicación
  • Configurar la conexión con servicios externos si fuera necesario
  • Desplegar la aplicación en un entorno de Staging

Como vemos, estas son tareas repetitivas que pueden ejecutarse sin supervisión, de forma automática. Además de ahorrar tiempo al automatizarlas también minimizamos la probabilidad de error humano al realizar tareas manuales.

Si además queremos que nuestro sistema sea robusto, no pueden faltar los test automáticos, por lo que se añadiría un paso más en cada despliegue.
En Solid GEAR apostamos por la integración y despliegue continuos para poder ser más ágiles y eficientes a la hora de mostrar el producto al cliente.

En este post vamos a configurar un despliegue continuo en La Nube.

Desplegaremos una aplicación en Google App Engine automatizando el despliegue continuo. Con esto conseguiremos, por ejemplo, acelerar el despliegue de MVPs o lanzar entornos para pasar pruebas de manera muy rápida y lo más importante: sin tener que tocar código lo que nos evita el errores de origen humano. 

Lo primero que vamos a hacer es configurar Google Cloud para poder utilizar sus servicios.

Configuración de Google Cloud

El siguiente paso es crear un proyecto en Google Cloud, si no tenéis cuenta os podéis dar de alta gratuitamente, recibiréis $ 300 para probar los servicios de Google Cloud, podéis leer más sobre ello aquí.

Crear un nuevo proyecto en Google Cloud

  • Si nunca has entrado en Google Cloud Platform te pedirá que aceptes las condiciones del servicio.
  • En la barra superior aparecerá un desplegable en el que pone “Selecciona un proyecto” en caso de que nunca hayas creado un proyecto, si hubieras creado algún proyecto aparecerá su nombre.
  • Hacemos click en “Nuevo Proyecto”, introducimos el nombre y hacemos click en crear.
  • Una vez haya terminado de crearse, aparecerá el nombre del proyecto en el desplegable donde ponía “Selecciona Un Proyecto”, si no es así, selecciónalo desde el desplegable.

Crear una cuenta de servicio en Google Cloud

Para poder usar Google Cloud desde Gitlab necesitamos un usuario que esté registrado en nuestro proyecto de Google Cloud como editor, para ello vamos a crear una cuenta de servicio en Google Cloud siguiendo los siguientes pasos:

  • En el menú lateral hacemos click en “IAM y Administración” y dentro de este, en “Cuentas de Servicio”
  • Hacemos click en “Crear Cuenta de Servicio”
  • Introducimos nombre y descripción y hacemos click en crear
  • Seleccionamos el rol “Editor” y hacemos click en continuar
  • Creamos una clave en formato JSON (se descargará un fichero) y hacemos click en listo

Activar la API de administración de App Engine

Para que la cuenta de servicio pueda utilizar cualquiera de los servicios que ofrece Google Cloud hay que habilitar dicha API, por lo que vamos a habilitar la API de administración de Google App Engine.

  • En el menú lateral buscamos API y Servicios
  • Dentro de esta sección hacemos click en Biblioteca
  • Buscamos App Engine Admin API y hacemos click en habilitar

Con esto tendríamos configurado todo lo requerido por la parte de Google Cloud para poder desplegar una aplicación en Google App Engine.

Configuración de Gitlab

Ahora que tenemos lista la parte de Google Cloud vamos con la parte de Gitlab.

He creado un repositorio con una aplicación sencilla para poder desplegarla podéis clonarla o hacer un fork aquí

Para crear un proyecto nuevo (omitid esta sección si habéis hecho un fork)

  • Hacemos click en el “+” de la barra de navegación y hacemos click en “Nuevo Proyecto”
  • Elegimos nombre y nivel de privacidad y hacemos click a crear.

Clonamos el repositorio previamente creado

git clone https://gitlab.com/luis.revilla.zan/avengers-app.git

Ahora lo vamos a subir al repositorio del proyecto que se ha creado con en el paso anterior.

git remote rename origin old-origin
git remote add origin [URL de clonado de vuestro repositorio de Gitlab]
git push -u origin --all
git push -u origin --tags

Con esto ya tenemos el código subido a vuestro repositorio.

Despliegue Continuo

Estamos a un paso de desplegar esta aplicación en Google Cloud, sólo falta configurar las claves de la cuenta de servicio creada previamente para poder usarlas en Gitlab y crear dos ficheros de configuración:

  • app.yaml: Fichero que especifica la configuración de Google App Engine
  • .gitlab-ci.yml: Fichero que configura la integración continua de Gitlab

Para configurar las claves de la cuenta de servicio:

  • Dentro del proyecto, nos dirigimos a los ajustes y dentro de estos, vamos a la sección “CI/CD”
  • Desplegamos la sección variables
  • Cambiamos el tipo de variable a “File”, en la clave ponemos GOOGLE_SERVICE_ACCOUNT_FILE y en el valor el contenido del fichero que se ha descargado previamente (cuando se ha creado la cuenta de servicio)
  • Creamos otra variable, en esta la clave será GOOGLE_PROJECT_ID y el valor será el Id del proyecto que hemos creado en Google Cloud.

app.yaml

Vamos a desplegar una aplicación Angular, queremos exponer los ficheros que el comando ng build --prod ha generado y no el resto, por lo que vamos a configurar este fichero de la siguiente forma.

runtime: python27
threadsafe: yes
service: avengers-app
handlers:
  - url: /(.+)
    static_files: dist/\1
    upload: dist/(.*)
  - url: /
    static_files: dist/index.html
    upload: dist/index.html
skip_files:
  - ^(?!dist)
  • threadsafe indica si se quieren usar peticiones de subida de ficheros concurrentes o no (en este caso no queremos que haya peticiones concurrentes)
  • service indica el nombre del servicio que se va a crear
  • handlers indica que ficheros se ejecutan en cada url
  • skip_files indica los ficheros que no se tienen que subir

.gitlab-ci.yml

Para poder utilizar el SDK de Google Cloud en Gitlab CD necesitamos la imagen del cloud-sdk de Google que está publicada en Docker Hub, en este caso usaremos la versión slim ya que trae la funcionalidad que necesitamos. El fichero queda de la siguiente forma:

image: google/cloud-sdk:slim

stages: deploy

deploy app engine:
  stage: deploy
  script:
    - gcloud auth activate-service-account --key-file $GOOGLE_SERVICE_ACCOUNT_FILE
    - gcloud app deploy app.yaml --quiet --project $GOOGLE_PROJECT_ID --version 1

only:
  - develop

Esto crea una etapa “Deploy” en Gitlab CD con un trabajo “deploy app engine” que se ejecuta cuando hay commits a la rama develop. Este trabajo se autentica con los datos de la cuenta de servicio que hemos creado antes y despliega en Google App Engine el servicio indicado en el app.yaml

Como veis es sencillo tener algo que pueda mostrarse, y no solo eso, sino que a medida que el proyecto avance, las iteraciones del producto van a tener un coste casi nulo en cuanto a despliegue, por lo que podemos ahorrar muchas horas a lo largo del proyecto que podemos dedicar a crear más test para tener una aplicación robusta y sin bugs, por ejemplo.

¡Espero que os sirva de ayuda y que lo pongáis en práctica en cuanto podáis!

1 comentario en «Despliegue Continuo con Gitlab y Google Cloud»

  1. Hola, Luis.

    Excelente tutorial, realice los pasos que mencionas e incluso con un app en Java y funcionó perfecto en App Engine, pero como es el proceso para poder correrlo en el una instancia de Compute Engine? Tendrás alguna documentación sobre eso, ya que, he buscado la forma de hacerlo pero no logro a realizar el proceso de despliegue.
    Gracias

    Responder

Deja un comentario

¿Necesitas una estimación?

Calcula ahora