Saltar contenido

Cómo Configurar Jenkins con Google Cloud Platform (GCP)

Configuración de Jenkins en Google Cloud

Os guiamos a través de este post sobre cómo configurar Jenkins con Google Cloud Platform (GCP). En este artículo cubriremos lo básico de como configurar Jenkins para usar GCP en la creación de agentes bajo demanda. 

Comenzamos por los requisitos que uno necesita para utilizar esta setup, después hablaremos de cómo configurar una service account en GCP y pasaremos a la configuración de Jenkins, que incluye la instalación del plugin, la creación de las credenciales y la configuración de la cloud.

Al final expondremos una pequeña prueba para verificar que la configuración funciona.

Requisitos para configurar Jenkins con Google Cloud Platform

Los recursos necesarios para configurar Jenkins con GCP son:

  1. Cuenta en una instancia de Jenkins*: Con permisos del administrador.
  2. Cuenta en Google Cloud Platform: Con permisos para usar Compute Engine y crear service accounts.
  3. Opcional: Herramienta gcloud command-line.

*Esta instancia puede estar en otra nube, on-premise o en el proprio Google Cloud. Para lectores con menos experiencia recomendamos este artículo que describe los pasos para levantar una instancia de Jenkins desde cero.

Crear la Google Cloud Platform service account

Lo primero que debemos hacer es crear una service account en GCP.

Esta cuenta va a ser utilizada por Jenkins en las comunicaciones con GCP cuando sea necesario crear agentes. Esta cuenta necesita los siguientes roles:

  • instanceAdmin
  • networkAdmin
  • ServiceAccountUser

La creación de la cuenta se puede hacer utilizando la página web o la herramienta gcloud en un equipo local o con cloud shell. En este ejemplo vamos a utilizar cloud shell y los pasos son los siguientes:

Creamos la service account:

gcloud iam service-accounts create jenkins-gce

Asignamos los roles necesarios a la service account:

export PROJECT=$(gcloud info --format='value(config.project)')
export SA_EMAIL=$(gcloud iam service-accounts list --filter="name:jenkins-gce" \
 --format='value(email)')
gcloud projects add-iam-policy-binding --member serviceAccount:$SA_EMAIL \
 --role roles/compute.instanceAdmin $PROJECT
gcloud projects add-iam-policy-binding --member serviceAccount:$SA_EMAIL \
 --role roles/compute.networkAdmin $PROJECT
gcloud projects add-iam-policy-binding --member serviceAccount:$SA_EMAIL \
 --role roles/iam.serviceAccountUser $PROJECT
 gcloud projects get-iam-policy $PROJECT

El resultado deberia tener la seguiente información:

- members:
  - serviceAccount:jenkins-gce@$PROJECT.iam.gserviceaccount.com
  role: roles/compute.instanceAdmin
- members:
  - serviceAccount:jenkins-gce@$PROJECT.iam.gserviceaccount.com
  role: roles/compute.networkAdmin
- members:
  - serviceAccount:jenkins-gce@$PROJECT.iam.gserviceaccount.com
  - user:<user>
  role: roles/iam.serviceAccountUser

Crear y descargar el JSON service account key:

gcloud iam service-accounts keys create --iam-account $SA_EMAIL jenkins-gce.json

Para descargar el fichero:

cloudshell download jenkins-gce.json

Utilizando esta service account Jenkins será capaz de manejar todos los recursos necesarios para la creación de agentes bajo demanda.

Instalación del plugin Google Compute Engine (GCE)

El plugin necesario para esta setup se llama Google Compute Engine que es responsable de la comunicación con Google Cloud Platform para la creación y configuración de recursos para que sean utilizados como agentes.

Ve a Manage Jenkins > Manage Plugins > Available y busca por “Google Compute Engine” tal y como te mostramos en la siguiente imagen:

instalacion plugin google compute engine gce

Configurar credenciales de la service account

Jenkins necesita tener acceso a la service account key para poder comunicar con GCP. Para ello necesitamos subir esta key a la sección de credenciales en Jenkins.

Ve a Manage Jenkins > Manage Credentials > Global > Add Credentials y selecciona el tipo “Goolge Service Account from private key”.

Cubre el nombre del proyecto utilizado en GCP y sube el JSON con la key de la service account tal y como te mostramos a continuación.

Configurar credenciales de la service account para google cloud platform y jenkins

Configurar Jenkins Cloud

Este es el último paso a nivel de configuración y después Jenkins será capaz de crear agentes automáticamente en GCP.

Ve a Manage Jenkins > Manage Nodes and Clouds > Configure Clouds > Add a new cloud > Google Compute Engine y cubre el formulario con tu información.

Las credenciales de la service account que creamos previamente deben usarse en “Service Account Credentials”.

Nota: La instancia necesita java8 instalado y la mejor opción es crear una plantilla de instancia con una custom image. Para crear la custom image en tu proyecto – crear una VM, instalar java8 y crear la imagen. Más información aquí.

Este es un ejemplo de configuración de Jenkins Cloud:

Ejemplo de configuración utilizando Configuration as Code:

clouds:
- computeEngine:
    cloudName: "GCP"
    configurations:
    - bootDiskAutoDelete: true
      bootDiskSizeGb: 10
      bootDiskSizeGbStr: "10"
      bootDiskType: "https://www.googleapis.com/compute/v1/projects/$PROJECT/zones/$REGION/diskTypes/pd-balanced"
      description: "CICD"
      externalAddress: true
      javaExecPath: "java"
      labelSet:
      - name: "linux"
      labelString: "linux"
      labels: "linux"
      launchTimeoutSeconds: 300
      launchTimeoutSecondsStr: "300"
      mode: EXCLUSIVE
      namePrefix: "cicd"
      numExecutors: 1
      numExecutorsStr: "1"
      region: "https://www.googleapis.com/compute/v1/projects/$PROJECT/regions/europe-west1"
      retentionTimeMinutes: 6
      retentionTimeMinutesStr: "6"
      runAsUser: "jenkins"
      serviceAccountEmail: "jenkins-gce@$PROJECT.iam.gserviceaccount.com"
      template: "https://www.googleapis.com/compute/v1/projects/$PROJECT/global/instanceTemplates/jenkins-template-1"
      zone: "https://www.googleapis.com/compute/v1/projects/$PROJECT/zones/$REGION"
    credentialsId: "$PROJECT"
    instanceId: ""
    projectId: "$PROJECT"

Simulación: Job de prueba

Vamos a configurar una pequeña prueba para verificar que toda la configuración anterior está funcionando correctamente y que Jenkins es capaz de crear agentes bajo demanda.

Creamos un Freestyle Project llamado “Test GCP agents”, por ejemplo:

Restringimos donde se puede correr el job, utilizando la label de los GCP agents. En este ejemplo se trataría de gcp.

restringir donde se puede correr el job para configurar jenkins gcp

En la sección “Build” seleccionar “Execute shell” y añadir este pequeño script para verificar la IP del agente y su hostname.

#!/bin/bash
echo "This is my IP"
curl -s ifconfig.co
echo "This is my hostname"
hostname -f

Quedando tal y como te mostramos en la imagen:

Lanzar el job y verificar la salida.

La salida del job es la información relativa al agente y que podemos utilizar para verificar que esa misma instancia aparece en la consola de GCP.

Con esto verificamos que todo funciona correctamente.

Conclusión

Configurar Jenkins para que utilice agentes bajo demanda tiene muchas ventajas, tanto a nivel técnico como financiero.

Diferentes tipos de agentes pueden ser creados dependiendo de los requisitos de los jobs y, como los agentes son efímeros, el coste se reduce al mínimo necesario para ejecutar el job.

La configuración es muy sencilla, la compleja tarea de crear nueves agentes es abstraída y se puede conseguir con un simple click o trigger.