es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Pase las credenciales de Jenkins al plugin Maven Surefire.

Caso de uso

Estoy desarrollando una solución de tubería de plantilla para que los equipos puedan construir, probar y escanear sus proyectos de manera consistente con cada ejecución de trabajo en Jenkins. Uno de estos proyectos utiliza Maven para la gestión de dependencias y requiere pasar credenciales de Jenkins para que se puedan ejecutar pruebas de integración.

Ejemplos

El paso de credenciales a través de argumentos de línea de comando funciona bien. Por ejemplo…

dsl
withCredentials([
[
$class: 'UsernamePasswordMultiBinding',
credentialsId: 'TEST',
usernameVariable: 'TEST_USERNAME',
passwordVariable: 'TEST_PASSWORD'
]
]) {
sh 'mvn clean install -D test_username=$TEST_USERNAME -D test_password=$TEST_PASSWORD'
}

Preferiría pasar estas variables a los complementos subyacentes a través de la configuración de cada complemento respectivo (a saber, el complemento Maven Surefire). La justificación para este enfoque preferido es utilizar un método estructurado para administrar las propiedades del sistema. He intentado varios métodos, incluido pasar argumentos configurando el elemento <argLines> de la configuración de Surefire y configurando el elemento <systemPropertyValues>, pero ninguno de los métodos funciona. Además, es preferible hacer referencia a estas propiedades a través de un archivo YAML para lograr una configuración externa, pero no me opongo a otros métodos para acceder a esta información si es imposible hacer referencia a las variables de credenciales en un archivo de configuración.

pom.xml

xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<!-- Agregar "env." al principio de cada nombre de variable no hace ninguna diferencia; las pruebas aún fallan. -->
<argLines>-D test_username=${TEST_USERNAME} -D test_password=${TEST_PASSWORD}</argLines>
<systemPropertyVariables>
<test_username>${TEST_USERNAME}</test_username>
<test_username>${TEST_PASSWORD}</test_username>
</systemPropertyVariables>
</configuration>
</plugin>

bootstrap-test.yaml

yaml
datasource:
jdbc_url: omitted
username: ${test_username}
password: ${test_password}

Resultados

Si intento ejecutar las pruebas en el entorno de Jenkins especificando las propiedades del sistema en la sección de configuración, entonces las pruebas fallan. Como comentario aparte, estoy pasando estas credenciales a Spring Boot, pero el entityManagerFactory (org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder) no puede inicializarse.


org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [com/acme/Config.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: Unable to resolve persistence unit root URL

Temo que el problema podría deberse a la incapacidad de Spring Boot para acceder a las credenciales ofuscadas, o intentando acceder a las propiedades del sistema dentro de un archivo de configuración demasiado tarde en el ciclo de vida de Maven.

Tampoco me opongo completamente a pasar propiedades del sistema a través de la línea de comando, pero la solución con plantillas deberá incluir una forma efectiva (segura) de reunir diferentes tipos de credenciales para pasar a la invocación de Maven.


ACTUALIZACIÓN 1:

Al ejecutar este proyecto localmente (en una máquina con Windows, por cierto) después de exportar las variables en realidad funciona, pero no funciona en Jenkins. El método que funcionó localmente implicó establecer variables de propiedad de entorno o de sistema en la sección de configuración del complemento Surefire. Prefijé las referencias a las variables de entorno creadas por Jenkins con env..


ACTUALIZACIÓN 2:

Usando el complemento Maven antrun pude imprimir las claves secretas enmascaradas exportadas por Jenkins.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Caso de uso: Desarrollo de un pipeline con plantillas para la construcción, prueba y análisis de proyectos a través de Jenkins

    Problema

    Como experto en informática especializado en Java, Maven, Jenkins y credenciales, me han asignado la tarea de desarrollar una solución con plantillas de pipeline para que los equipos construyan, prueben y analicen sus proyectos de manera consistente con cada ejecución del trabajo en Jenkins. Un proyecto en particular utiliza Maven para la gestión de dependencias y para ejecutar pruebas de integración en Jenkins, es necesario pasar credenciales.

    Ejemplos

    Una forma de pasar credenciales de Jenkins es a través de argumentos de línea de comandos. En el siguiente ejemplo, usamos el bloque withCredentials para pasar las credenciales al comando Maven a través de sh.

    withCredentials([
        [
            $class: 'UsernamePasswordMultiBinding', 
            credentialsId: 'TEST', 
            usernameVariable: 'TEST_USERNAME', 
            passwordVariable: 'TEST_PASSWORD'
        ]
    ]) {
        sh 'mvn clean install -D test_username=$TEST_USERNAME -D test_password=$TEST_PASSWORD'
    }
    

    Sin embargo, es preferible pasar estas variables a través de las configuraciones de los complementos subyacentes de cada herramienta. En particular, nos gustaría utilizar métodos estructurados para gestionar las propiedades del sistema al pasar credenciales al complemento Maven Surefire. Intentamos hacer esto pasando argumentos mediante el establecimiento del elemento de la configuración de Surefire y estableciendo el elemento . Sin embargo, ninguno de los métodos funcionó, y también es preferible hacer referencia a estas propiedades a través de un archivo YAML para lograr una configuración externalizada.

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.22.2</version>
        <configuration>
            <!-- Agregar 'env.' al principio de cada nombre de variable no hace ninguna diferencia, las pruebas aún fallan. -->
            <argLines>-D test_username=${TEST_USERNAME} -D test_password=${TEST_PASSWORD}</argLines>
            <systemPropertyVariables>
                <test_username>${TEST_USERNAME}</test_username>
                <test_username>${TEST_PASSWORD}</test_username>
            </systemPropertyVariables>
        </configuration>
    </plugin>
    
    datasource:
        jdbc_url: *omitted*
        username: ${test_username}
        password: ${test_password}
    

    Resultados

    Si intentamos ejecutar las pruebas en el entorno de Jenkins especificando las propiedades del sistema en la sección de configuración, entonces las pruebas fallan. La ‘entityManagerFactory’ (org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder) no se inicializa.

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [com/acme/Config.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: Unable to resolve persistence unit root URL
    

    Sospechamos que el problema podría deberse a la incapacidad de Spring Boot para acceder a las credenciales obfuscadas o para intentar acceder a las propiedades del sistema dentro de un archivo de configuración demasiado tarde en el ciclo de vida de Maven. Estamos abiertos a métodos de referencia externa para pasar credenciales si las propiedades del sistema dentro de los archivos de configuración no funcionan.

    Actualizaciones

    Actualización 1:

    Ejecutar el proyecto localmente (en una máquina con Windows) después de exportar las variables de hecho funciona. Sin embargo, el método no funciona en Jenkins. Pudimos configurar las variables de entorno o propiedades del sistema en la sección de configuración de Surefire. Prefijamos las referencias a variables de entorno creadas por Jenkins con env..

    Actualización 2:

    Utilizando el complemento de Maven AntRun, pudimos imprimir las contraseñas ocultas exportadas por Jenkins.

Comments are closed.