Creación de parámetros dinámicos en Jenkins job, o cómo hacer que su tarea sea amigable para el usuario

Buenas tardes, Habr!

Hoy me gustaría compartir una de las formas en que, mediante Active Choices Plugin podemos realizar la tarea en Jenkins la forma más unificada y comprensible para el usuario.

Introducción

La abreviatura DevOps ya no es algo nuevo para la comunidad IT. Muchas personas asocian la frase «hacer DevOps» con un botón mágico, al presionar el cual el código de la aplicación se convierte automáticamente en una aplicación implementada y probada (la realidad es más compleja, pero nos abstraemos de todos los procesos).

Así que hemos recibido un pedido para crear ese botón mágico, para que los administradores puedan desplegar la aplicación con un solo clic. Hay diferentes maneras de implementar esta tarea: desde escribir un bot para alguna de las mensajerías hasta desarrollar una aplicación separada. Sin embargo, el objetivo de todo esto es único: hacer que el lanzamiento de la construcción y el despliegue de la aplicación sea lo más transparente y cómodo posible.

En nuestro caso, vamos a usar Jenkins.


Creación de parámetros dinámicos en Jenkins job, o cómo hacer que su tarea sea amigable para el usuario

Tarea

Crear un trabajo cómodo en Jenkins que inicie la construcción y (o) el despliegue del microservicio seleccionado de una versión específica.

Creación de parámetros dinámicos en Jenkins job, o cómo hacer que su tarea sea amigable para el usuario

Datos de entrada

Tenemos varios repositorios donde se encuentra el código fuente de varios microservicios.

Definición de parámetros

A nuestro trabajo deben ingresarse los siguientes parámetros:

  1. URL del repositorio con el código del microservicio que queremos construir y desplegar al iniciar el trabajo.
  2. ID del commit desde el cual se realizará la construcción.

AS IS

La forma más sencilla de cumplir con la tarea planteada es crear dos parámetros de tipo String.

Creación de parámetros dinámicos en Jenkins job, o cómo hacer que su tarea sea amigable para el usuario

En este caso, el usuario tendría que ingresar manualmente la ruta al repositorio y el id del commit, lo cual, admitámoslo, no es muy conveniente.

Creación de parámetros dinámicos en Jenkins job, o cómo hacer que su tarea sea amigable para el usuario

AS TO BE

Ahora intentemos otro tipo de parámetros para considerar todas sus ventajas.
Crearemos el primer parámetro de tipo Choice Parameter, y el segundo — Active Choices Reactive Reference Parameter. En el parámetro de tipo Choice, añadiremos manualmente en el campo Choices los nombres de los repositorios donde se almacena el código de nuestros microservicios.

Creación de parámetros dinámicos en Jenkins job, o cómo hacer que su tarea sea amigable para el usuario

Si este artículo les gusta a la audiencia, en el siguiente artículo describiré el proceso de configuración de tareas en Jenkins, utilizando la descripción a través del código (Configuration as code), es decir, no necesitaremos ingresar manualmente los nombres de los repositorios y crear parámetros, todo sucederá automáticamente (nuestro código obtendrá la lista de repositorios de SCM y creará un parámetro con dicha lista).

Los valores del segundo parámetro se llenarán dinámicamente, dependiendo del valor que tome el primer parámetro (test1 o test2), ya que cada repositorio tiene su propia lista de commits.

Active Choices Reactive Reference Parameter tiene los siguientes campos para completar:

  1. Nombre – nombre del parámetro.
  2. Script – el código que se ejecutará cada vez que el valor del parámetro en el campo Referenced parameter cambie (en nuestro caso, cuando elijamos entre test1 y test2).
  3. Descripción – una breve descripción del parámetro.
  4. Choice Type – el tipo de objeto devuelto por el script (en nuestro caso, retornaremos código html).
  5. Referenced parameter – el nombre del parámetro, cuyo cambio de valor ejecutará el código de la sección Script.

Creación de parámetros dinámicos en Jenkins job, o cómo hacer que su tarea sea amigable para el usuario

Pasemos directamente a completar el campo más importante de este parámetro. Se nos ofrecen dos tipos de implementación: uso de Groovy Script o Scriptler Script.
Elegimos el primero, ya que Scriptler es solo un plugin que guarda los scripts que ya han sido escritos por usted y permite usarlos en otras tareas sin necesidad de copiar y pegar nuevamente.

Código Groovy para obtener todos los commits del repositorio seleccionado:

AUTH = "usuario y contraseña en Base64"                           
GIT_URL = "url a tu SCM (https://bitbucket.org/)"                       
PROJECT_NAME = "nombre del área de proyecto donde se encuentran los repositorios"

def htmlBuild() {
    html = """
            <html>
            <head>
            <meta charset="windows-1251">
            <style type="text/css">
            div.grayTable {
            text-align: left;
            border-collapse: collapse;
            }
            .divTable.grayTable .divTableCell, .divTable.grayTable .divTableHead {
            padding: 0px 3px;
            }
            .divTable.grayTable .divTableBody .divTableCell {
            font-size: 13px;
            }
            </style>
            </head>
            <body>
        """

    def commitOptions = ""
    getCommitsForMicroservice(MICROSERVICE_NAME).each {
        commitOptions += "<option style='font-style: italic' value='COMMIT=${it.getKey()}'>${it}</option>"
    }
    html += """<p style="display: inline-block;">
        <select id="commit_id" size="1" name="value">
            ${commitOptions}
        </select></p></div>"""

    html += """
            </div>
            </div>
            </div>
            </body>
            </html>
         """
    return html
}

def getCommitsForMicroservice(microserviceRepo) {
    def commits = [:]
    def endpoint = GIT_URL + "\/rest\/api\/1.0\/projects\/${PROJECT_NAME}\/repos\/${microserviceRepo}\/commits"
    def conn = new URL(endpoint).openConnection()
    conn.setRequestProperty("Authorization", "Basic ${AUTH}")
    def response = new groovy.json.JsonSlurper().parseText(conn.content.text)
    response.values.each {
        commits.put(it.displayId, it.message)
    }
    return commits
}

return htmlBuild()

Sin entrar en detalles, este código recibe como entrada el nombre del microservicio (MICROSERVICE_NAME), envía una solicitud a Bitbucket (método getCommitsForMicroservice), utilizando su API, y obtiene el ID y el mensaje de commit de todos los commits para este microservicio.
Como se mencionó anteriormente, este código debe retornar html, que se mostrará en la página Build with Parameters en Jenkins, por lo que todos los valores obtenidos de Bitbucket se envuelven en una lista y se añaden al select.

Después de realizar todas las acciones, deberíamos obtener una página bonita como esta. Build with Parameters.

Si elegimos el microservicio test1:

Creación de parámetros dinámicos en Jenkins job, o cómo hacer que su tarea sea amigable para el usuario

Si elegimos el microservicio test2:

Creación de parámetros dinámicos en Jenkins job, o cómo hacer que su tarea sea amigable para el usuario

Coincidirás en que sería mucho más conveniente para el usuario interactuar con su tarea de esta manera, en lugar de copiar cada vez la URL y buscar el ID de commit correspondiente.

P.D. En este artículo se presenta un ejemplo muy simplificado que, posiblemente, no tenga aplicación práctica en su forma actual, ya que las construcciones tienen muchos más parámetros diferentes. Sin embargo, el objetivo de este artículo era mostrar el funcionamiento de la herramienta, y no ofrecer una solución lista para usar.

P.S.S. Como mencioné anteriormente, si este artículo resulta útil, el siguiente tratará sobre la configuración dinámica de tareas de Jenkins mediante código.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster