jueves, 17 de diciembre de 2020

Como obtener el contenido de un secreto de OpenShift desde Jenkins?

 


     Realizar pipelines de Integración Continua o de Despliegue Continuo en un cluster de OpenShift a día de hoy suele ser habitual realizarlos con Jenkins. A futuro se esta poniendo esfuerzo en reemplazar Jenkins por Tekton, sin embargo, hay desafíos con los que tendremos que lidiar si usamos Jenkins.

    En este articulo se hara enfasis en como obtener el contenido de un secreto de OpenShift desde un pipeline de Jenkins para ser usado en su flujo.


Poniendonos en Situación

    Al utilizar Jenkins desde OpenShift para implementar y ejecutar pipelines de CI/CD es normal o habitual encontrarse ante una situación donde utilicemos algunos plugins de Jenkins especiales. Por ejemplo, el mas comun es el plugin OpenShift Jenkins Pipeline (DSL) Plugin que nos proporciona una serie de funciones utilizables desde el codigo groovy de los pipelines de jenkins (a lo que se le denomina DSL: Domain Specific Language o en español "Lenguaje específico de dominio"). 

    Esas funciones o sentencias junto con desarrollos en groovy que podemos usar para reutilizar código en nuestros pipelines, harán que podamos llevar adelante el desarrollo de los pipelines mucho mas ameno.

 

 

¿Y como obtenemos el contenido de un secreto?

    Ahora bien, será de lo más normal tener que obtener el contenido de un secreto alojado en un cluster de OpenShift desde el codigo del pipeline. Estos secretos pueden albergar información sensible de distinta indole, ya sea credenciales de acceso, tokens de inicio de sesión, alguna clave publica, datos de conexión, entre otros.

    La información de un secreto, por defecto viene encriptada y a su vez algo que suele ser tambien muy facil de pasar por alto, es que si obtenemos y desciframos el contenido de un secreto. Si no se tiene cuidado, esta información ocasionalmente aparecerá por pantalla en el "Console Output" de Jenkins. Lo cual es muy grave.

    A continuación el siguiente codigo goorvy se encarga de solventar todos estos detalles:

#!/usr/bin/env groovy


def call(parameters) {
    openshift.withCluster(parameters.clusterUrl, parameters.credentialsId) {
        openshift.withProject(parameters.project) {
            def secret = openshift.selector("secrets", "${parameters.secret_name}");
            if (!secret.exists()) {
                error 'Secreto no encontrado en OCP'
            }
            def object_content = secret.object();
            return sh(script: "set +x; echo \$(echo ${object_content.data./${parameters.secret_key}/} | base64 -d); set -x", returnStdout: true).trim()
        }
    }
}


 

     Y luego para poder usar esta función desde el pipeline, tendremos que hacerlo de la siguiente manera:

stage("Gather Information") {
    steps {
        script {
            def valor = nombreDelGroovy(
                project: "openshift-project",
                secret_name: "nombre-del-secreto",
                secret_key: "nombre-de-la-llave"
            )
        }
    }
}


 

    Con esto lograremos superar tanto que la información y la salida de los comandos que ejecutemos desde el archivo groovy no se visualicen desde el Console Output de Jenkins y además la información que se obtiene viene ya desencriptada.

 

    Cualquier sugerencia o comentario puede hacerse libremente y con respeto en la caja de comentarios debajo de este articulo.

No hay comentarios:

Publicar un comentario