Creando parametros dinamicos en Jenkins con librerias groovy

Jenkins nos permite agregar librerias personalizadas con groovy y con ellas podemos crear pipelines que usan parametros dinamicos, en ese post veremos algunos de los casos de uso que me ha tocado trabajar.

Creando parametros dinamicos en Jenkins con librerias groovy

Los pipelines dinámicos en Jenkins usando Groovy suelen ser muy útiles para hacer implementaciones complejas, pero realmente todo empieza en con los parametros asi que unos buenos parametros pueden hacer tu implementación más sencilla, a continuación te mostraré algunos de los que más uso.

Como importar una librería dinámica en tu pipeline

En una ocasión, tuve que crear un repositorio personal para desarrollar librerías de Groovy, ya que no tenía acceso ni a la configuración de Jenkins ni al repositorio que contenía las librerías originales. Por eso, utilicé este script.

1library identifier: 'jenkins_poc@master', retriever: modernSCM(
2 [$class: 'GitSCMSource,'
3 remote: 'https://github.com/${user}/jenkins_poc.git'
4 credentialsId: ${credentialsId}
5 ]
6)

Una vez que hemos resuelto el tema de la librería, es hora de ponerla en acción en tu pipeline. Puedes invocar sus funciones de manera sencilla y práctica. Esto te permitirá aprovechar al máximo las capacidades de la librería para optimizar tus procesos.

1properties([
2 parameters([
3 choice (
4 name: 'name',
5 choices: [testName("Dynamic parameter")],
6 description: 'name'
7 ),
8 ])
9])

En este caso la función es muy simple.

1# vars/testName.groovy
2def call(String name) {
3 return name
4}

Y asi se veria nuestro nuevo parametro dinámico

Listar las ramas de un repositorio en github

Si requieres que las ramas de un proyecto vengan directamente del repositorio de github puedes integrar este código.

1import com.cloudbees.plugins.credentials.CredentialsProvider;
2importcom.cloudbees.plugins.credentials.common.StandardUsernamePasswordCredentials;
3import jenkins.model.Jenkins;
4
5def credentials = com.cloudbees.plugins.credentials.CredentialsProvider.lookupCredentials(
6 com.cloudbees.plugins.credentials.Credentials.class,
7 Jenkins.instance,
8 null,
9 null
10);
11def user = credentials.findResult { it.id == credentials_id ? it : null }
12try{
13 def gettags = ("git ls-remote -t -h https://${user.username}:${user.password}@github.com/${user}/${project}.git").execute()
14 def branchesNoDefault = gettags.text.readLines().collect {
15 it.split()[1].replaceAll('refs/heads/', '').replaceAll('refs/tags/', '').replaceAll("\\\\^\\\\{\\\\}", '')
16 }
17 branches = branchesNoDefault.collect {
18 if (it == defaultBranch){
19 return "${defaultBranch}:selected"
20 }else {
21 return it
22 }
23 }
24 return branches
25} catch(all) {
26 return [all.getMessage()]
27}

Usar el último build number exitoso de otro pipeline

Si tus builds de Docker estan en un pipeline diferente puedes usar el parametro ‘RunParameterDefinition’ y agregarlo a tu pipeline con este código.

1properties([
2 parameters([
3 choice (
4 name: 'name',
5 choices: [testName("Dynamic parameter")],
6 description: 'name'
7 ),
8 [
9 $class: 'RunParameterDefinition',
10 filter: 'SUCCESSFUL',
11 name: 'RELEASE_BUILD',
12 projectName: build_job
13 ]
14 ])
15])

Así se veria nuestro pipeline

Logica y dependencias de otros parametros

Tambien podemos agregar logica que dependa de lo que sea seleccionado en otros parametros, por ejemplo si necesitas identificar que env es el que fue seleccionado y basado en ello tener cierto comportamiento.

Primero debemos agregar el parametro para seleccionar el environment.

1properties([
2 parameters([
3 choice (
4 name: 'name',
5 choices: [testName("Dynamic parameter")],
6 description: 'name'
7 ),
8 [
9 $class: 'RunParameterDefinition',
10 filter: 'SUCCESSFUL',
11 name: 'RELEASE_BUILD',
12 projectName: build_job
13 ],
14 [
15 $class: 'CascadeChoiceParameter',
16 choiceType: 'PT_SINGLE_SELECT',
17 description: 'Select the environment from the dropdown list',
18 filterLength: 1,
19 filterable: false,
20 name: 'environment',
21 script: [
22 $class: 'GroovyScript',
23 fallbackScript: [
24 classpath: [],
25 sandbox: false,
26 script:
27 "return['Cloud not get the envs']"
28 ],
29 script: [
30 classpath: [],
31 sandbox: false,
32 script:
33 '''return["dev", "stag", "prod"]'''
34 ]
35 ]
36 ],
37 ])
38])

En resumen, los pipelines dinámicos en Jenkins con Groovy son una herramienta poderosa que puede revolucionar tus implementaciones. Al comprender la importancia de los parámetros y cómo pueden influir en la eficiencia de tus pipelines, estás en camino de lograr implementaciones más sencillas y efectivas.

Comentarios