Crear parámetros dinámicos en un trabajo de Jenkins o cómo hacer que su tarea sea fácil de usar

Buen dia Habr!

Hoy me gustaría compartir una de las formas de utilizar Complemento de opciones activas hacer la tarea en Jenkins el más unificado y comprensible para el usuario.

introducción

Una abreviatura como DevOps no es algo nuevo para la comunidad de TI desde hace mucho tiempo. Para muchas personas, la frase "hacer DevOps" está asociada con algún tipo de botón mágico; cuando se hace clic, el código de la aplicación se convierte automáticamente en una aplicación implementada y probada (en realidad es más complicado, pero nos abstraemos de todos los procesos).

Entonces, recibimos una orden para crear un botón mágico para que los administradores puedan implementar la aplicación con un solo clic. Hay varios tipos de implementación de esta tarea: desde escribir un bot para cualquiera de los mensajeros hasta desarrollar una aplicación separada. Sin embargo, el objetivo de todo esto es el mismo: hacer que el inicio del ensamblaje y la implementación de la aplicación sea lo más transparente y conveniente posible.

En nuestro caso usaremos Jenkins.


Crear parámetros dinámicos en un trabajo de Jenkins o cómo hacer que su tarea sea fácil de usar

Tarea

Cree un trabajo de Jenkins conveniente que ejecutará el ensamblaje y (o) la implementación del microservicio seleccionado de una determinada versión.

Crear parámetros dinámicos en un trabajo de Jenkins o cómo hacer que su tarea sea fácil de usar

Los datos de entrada

Disponemos de varios repositorios que contienen el código fuente de varios microservicios.

Definición de parámetros

La entrada de nuestro trabajo debe recibir los siguientes parámetros:

  1. La URL del repositorio con el código de microservicio que queremos construir e implementar al ejecutar el trabajo.
  2. El ID del compromiso desde el que construir.

COMO ES

La forma más sencilla de realizar esta tarea es crear dos parámetros de tipo String.

Crear parámetros dinámicos en un trabajo de Jenkins o cómo hacer que su tarea sea fácil de usar

En este caso, el usuario deberá ingresar manualmente la ruta al repositorio y la identificación de confirmación, lo cual, como ve, no es muy conveniente.

Crear parámetros dinámicos en un trabajo de Jenkins o cómo hacer que su tarea sea fácil de usar

COMO SER

Ahora probemos con otro tipo de parámetros para ver todas sus ventajas.
Creemos el primer parámetro con el tipo Parámetro de elección, el segundo: Parámetro de referencia reactiva de opciones activas. En el parámetro con el tipo Choice agregaremos manualmente los nombres de los repositorios en el campo Choices, donde se almacena el código de nuestros microservicios.

Crear parámetros dinámicos en un trabajo de Jenkins o cómo hacer que su tarea sea fácil de usar

Si a la audiencia le gusta este artículo, en el próximo artículo describiré el proceso de configuración de tareas en Jenkins usando la descripción a través del código (Configuración como código), 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 del SCM y creará un parámetro con esta lista).

Los valores del segundo parámetro se completarán dinámicamente, dependiendo del valor que tome el primer parámetro (prueba1 o prueba2), porque cada repositorio tiene su propia lista de confirmaciones.

Opciones activas Parámetro de referencia reactivo tiene los siguientes campos para completar:

  1. Nombre – nombre del parámetro.
  2. Guión - código que se ejecutará cada vez que se cambie el valor del parámetro del campo Parámetro referenciado (en nuestro caso, cuando elegimos entre prueba1 y prueba2).
  3. Descripción – breve descripción del parámetro.
  4. Tipo de elección - el tipo de objeto devuelto por el script (en nuestro caso, devolveremos el código html).
  5. parámetro referenciado – el nombre del parámetro, cuando su valor cambie, se ejecutará el código de la sección Script.

Crear parámetros dinámicos en un trabajo de Jenkins o cómo hacer que su tarea sea fácil de usar

Procedamos directamente a completar el campo más importante de este parámetro. Se nos ofrecen dos tipos de implementación para elegir: usar Guión maravilloso o Guión Guionista.
Elegimos el primero, ya que Scriptler es solo un complemento que guarda los scripts que ya has escrito y te permite usarlos en otras tareas sin tener que volver a copiar y pegar.

Código maravilloso para obtener todas las confirmaciones de un repositorio seleccionado:

AUTH = "логин и пароль в Base64"                           
GIT_URL = "url до вашей SCM (https://bitbucket.org/)"                       
PROJECT_NAME = "имя проектной области, где находятся репозитории"

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 el nombre del microservicio (MICROSERVICE_NAME) como entrada, envía una solicitud a bitbucket (método getCommitsForMicroservice) usando su API y obtiene la identificación y el mensaje de confirmación de todas las confirmaciones para el microservicio dado.
Como se mencionó anteriormente, este código debería devolver el html que se mostrará en la página. Construir con parámetros en Jenkins, entonces envolvemos todos los valores recibidos de Bitbucket en una lista y los agregamos a la selección.

Después de completar todos los pasos, deberíamos obtener una página tan hermosa. Construir con parámetros.

Si elige el microservicio test1:

Crear parámetros dinámicos en un trabajo de Jenkins o cómo hacer que su tarea sea fácil de usar

Si elige el microservicio test2:

Crear parámetros dinámicos en un trabajo de Jenkins o cómo hacer que su tarea sea fácil de usar

Acepte que será mucho más conveniente para el usuario interactuar con su tarea de esta manera que copiar la URL cada vez y buscar la identificación de confirmación requerida.

PS Este artículo es un ejemplo muy simplificado que puede no ser de uso práctico tal como es, ya que los ensamblajes tienen muchas más opciones diferentes, pero el propósito de este artículo era mostrar cómo funciona la herramienta, no proporcionar una solución funcional.

PSS Como escribí anteriormente, si este artículo es útil, el próximo tratará sobre configuración dinámica de tareas de Jenkins mediante código.

Fuente: habr.com

Añadir un comentario