Python – Exportando datos de Jira, Confluence y Bitbucket con atlassian-exporter

Muchas empresas utilizan la suite de Atlassian, para la gestión de su ticketing (Jira Service Management), gestión de sus productos Software (Jira Software), documentación tipo Wiki (Confluence), y gestión de los repos Git (Bitbucket), entre otros motivos, porque la integración de todos ellos ayuda mucho a la gestión ágil de proyectos y de productos. En este Post os comparto una utilidad Python de línea de comandos para la exportación a CSV de datos de Jira, Confluence, y Bitbucket (en todos los casos, de las versiones Cloud), de utilidad para obtener datos estadísticos, poder ver su evolución en el tiempo, o incluso repartir costes entre departamentos. Open Source, totalmente free (repo en GitHub), y preparada para correr en Docker y Kubernetes.

Continuando con la serie de Posts sobre Python, 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 Jira, Confluence, y Bitbucket (en todos los casos, de las versiones Cloud), atacando a las APIs de Jira, Confluence y Bitbucket.

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

Actualmente se puede exportar a CSV la siguiente información:

  • Usuarios, grupos, y pertenencia de usuarios a grupos de Jira/Confluence (de aquí se puede obtener la asignación de Licencias)
  • Proyectos de Jira
  • Espacios de Confluence
  • Usuarios, grupos, y pertenencia de usuarios a grupos de Bitbucket Cloud
  • Proyectos, repos, y pertenencia de repos a proyectos de Bitbucket Cloud
  • Commits de los repos de Bitbucket Cloud
  • Ramas y Tags de los repos de Bitbucket Cloud

Además, también permite hacer git clone de todos los repos de Bitbucket.

La mayoría de las API están paginadas, pero no todas, y de las que están paginadas, no todas paginan de la misma forma (es decir, utilizan diferentes parámetros para poder paginar, como start ó startAt, aunque en el fondo son muy parecidas).

Atlassian protege sus APIs mediante Rate Limiting, por lo que tenemos que controlar el status code de la respuesta HTTP, de tal modo que si recibimos un HTTP-429 (Too many requests) deberemos gestionar esperas y reintentos.

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/, que dependerá de la acción (datos de conexión a Atlassian Cloud o a Bitbucket Cloud).

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, tanto 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 atlassian-exporter.py -c atlassian_conn_elwillie.json -a export_all_jira_groups_and_members
python atlassian-exporter.py -c atlassian_conn_elwillie.json -a export_all_jira_users
python atlassian-exporter.py -c atlassian_conn_elwillie.json -a export_all_jira_projects
python atlassian-exporter.py -c atlassian_conn_elwillie.json -a export_all_confluence_spaces

python atlassian-exporter.py --c bitbucket_conn_elwillie.json --a export_all_bitbucket_users
python atlassian-exporter.py --c bitbucket_conn_elwillie.json --a export_all_bitbucket_groups_and_members
python atlassian-exporter.py --c bitbucket_conn_elwillie.json --a export_all_bitbucket_projects
python atlassian-exporter.py --c bitbucket_conn_elwillie.json --a export_all_bitbucket_repos
python atlassian-exporter.py --c bitbucket_conn_elwillie.json --a export_all_bitbucket_repos_commits
python atlassian-exporter.py --c bitbucket_conn_elwillie.json --a export_all_bitbucket_repos_branches

Esta sería una salida de ejecución a modo de ejemplo.

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 atlassian-exporter .
docker images

docker run -v d:/code/elwillie/atlassian-exporter/app/export:/usr/src/app/export --rm atlassian-exporter python atlassian-exporter.py -c atlassian_conn_elwillie.json -a export_all_jira_users
docker run -v d:/code/elwillie/atlassian-exporter/app/export:/usr/src/app/export --rm atlassian-exporter python atlassian-exporter.py -c atlassian_conn_elwillie.json -a export_all_jira_groups_and_members
docker run -v d:/code/elwillie/atlassian-exporter/app/export:/usr/src/app/export --rm atlassian-exporter python atlassian-exporter.py -c atlassian_conn_elwillie.json -a export_all_jira_projects
docker run -v d:/code/elwillie/atlassian-exporter/app/export:/usr/src/app/export --rm atlassian-exporter python atlassian-exporter.py -c atlassian_conn_elwillie.json -a export_all_confluence_spaces

docker run -v d:/code/elwillie/atlassian-exporter/app/export:/usr/src/app/export --rm atlassian-exporter python atlassian-exporter.py --configfile=bitbucket_conn_elwillie.json --action=export_all_bitbucket_users
docker run -v d:/code/elwillie/atlassian-exporter/app/export:/usr/src/app/export --rm atlassian-exporter python atlassian-exporter.py --configfile=bitbucket_conn_elwillie.json --action=export_all_bitbucket_groups_and_members
docker run -v d:/code/elwillie/atlassian-exporter/app/export:/usr/src/app/export --rm atlassian-exporter python atlassian-exporter.py --configfile=bitbucket_conn_elwillie.json --action=export_all_bitbucket_projects
docker run -v d:/code/elwillie/atlassian-exporter/app/export:/usr/src/app/export --rm atlassian-exporter python atlassian-exporter.py --configfile=bitbucket_conn_elwillie.json --action=export_all_bitbucket_repos
docker run -v d:/code/elwillie/atlassian-exporter/app/export:/usr/src/app/export --rm atlassian-exporter python atlassian-exporter.py --configfile=bitbucket_conn_elwillie.json --action=export_all_bitbucket_repos_commits
docker run -v d:/code/elwillie/atlassian-exporter/app/export:/usr/src/app/export --rm atlassian-exporter python atlassian-exporter.py --configfile=bitbucket_conn_elwillie.json --action=export_all_bitbucket_repos_branches

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