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:
- Cuenta en una instancia de Jenkins*: Con permisos del administrador.
- Cuenta en Google Cloud Platform: Con permisos para usar Compute Engine y crear service accounts.
- 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:
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 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.
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.