Python – Exportando datos de Jenkins con jenkins-exporter

Jenkins es quizás la principal herramienta para automatizar el CI/CD en muchas empresas, una herramienta abierta y extensible mediante Plugins y scriping, que permite integrarse cualquier otra tecnología que puedas necesitar. En este Post os comparto una utilidad Python de línea de comandos para la exportación a CSV de datos de Jenkins (ej: usuarios, jobs, builds, roles, etc.), de utilidad para obtener datos estadísticos, poder ver su evolución en el tiempo, o incluso repartir costes entre departamentos o cualquier tipo de análisis de uso. Open Source, totalmente free (repo en GitHub), y preparada para correr en Docker y Kubernetes.

Continuando con las series de Posts sobre Python y sobre Jenkins, en esta ocasión os comparto la primera versión de una utilidad Python de línea de comandos para la exportación a CSV de datos de Jenkins, atacando a las APIs de Jenkins y de alguno de sus Plugins (ej: Role-Based Authorization Strategy). Similar a atlassian-exporter, pero en este caso con foco en Jenkins.

Lo podéis encontrar en el siguiente repo de GitHub (el Readme es bastante autoexplicativo): GitHub – ElWillieES – jenkins-exporter

En esta primera versión, se puede exportar la siguiente información:

  • Usuarios
  • Jobs (Pipelines) e histórico de ejecuciones (Builds) con su resultado
  • Roles (Global Roles y Project Roles) y pertenencia de usuarios a Roles (Plugin Role-Based Authentication Strategy)

Se trata de un programa de línea de comandos, que espera recibir dos parámetros:

  • Acción que se desea realizar. Básicamente es indicar qué datos deseamos exportar, que se generarán en la carpeta ./export/
  • Fichero de configuración. Proporciona los datos de conexión en un fichero JSON con una formato determinado ubicado en la carpeta ./config/, básicamente los datos de conexión a Jenkins.

Las carpetas ./config/ y ./export/ están añadidas al fichero .gitignore, para evitar que se puedan subir tanto credenciales como datos a los repos remotos de Git, por privacidad como por intentar mantener el repo limpio (evitar subir exportaciones de diferentes pruebas, que no aportan valor en el repo remoto).

A continuación se muestra un ejemplo de uso.

python jenkins-exporter.py -c jenkins_conn_elwillie.json -a export_all_jenkins_users
python jenkins-exporter.py -c jenkins_conn_elwillie.json -a export_all_jenkins_plugins
python jenkins-exporter.py -c jenkins_conn_elwillie.json -a export_all_jenkins_jobs
python jenkins-exporter.py -c jenkins_conn_elwillie.json -a export_all_jenkins_rbas_global_roles
python jenkins-exporter.py -c jenkins_conn_elwillie.json -a export_all_jenkins_rbas_project_roles

En el caso de Docker, podemos utilizar un volumen para poder acceder a los datos exportados una vez que ha finalizado la ejecución del contenedor.

rm app/export/*

docker build -t jenkins-exporter .
docker images

docker run -v d:/code/elwillie/jenkins-exporter/app/export:/usr/src/app/export --rm jenkins-exporter python jenkins-exporter.py -c jenkins_conn_elwillie.json -a export_all_jenkins_users
docker run -v d:/code/elwillie/jenkins-exporter/app/export:/usr/src/app/export --rm jenkins-exporter python jenkins-exporter.py -c jenkins_conn_elwillie.json -a export_all_jenkins_plugins
docker run -v d:/code/elwillie/jenkins-exporter/app/export:/usr/src/app/export --rm jenkins-exporter python jenkins-exporter.py -c jenkins_conn_elwillie.json -a export_all_jenkins_jobs
docker run -v d:/code/elwillie/jenkins-exporter/app/export:/usr/src/app/export --rm jenkins-exporter python jenkins-exporter.py -c jenkins_conn_elwillie.json -a export_all_jenkins_rbas_global_roles
docker run -v d:/code/elwillie/jenkins-exporter/app/export:/usr/src/app/export --rm jenkins-exporter python jenkins-exporter.py -c jenkins_conn_elwillie.json -a export_all_jenkins_rbas_project_roles

Poco más por hoy, como siempre confío que la lectura resulte de interés.