¿Cómo obtener datos de Jira en Python?

Jira es una herramienta de gestión de proyectos ágil, desarrollada por Atlassian, utilizada principalmente para el seguimiento de errores y problemas de proyectos. Se ha convertido gradualmente en una poderosa herramienta de gestión del trabajo que puede manejar todas las etapas de la metodología ágil. En este artículo, aprenderemos cómo obtener datos de Jira usando Python.

Hay dos formas de obtener los datos:

  1. Uso de la biblioteca JIRA para Python.
  2. Usando la API Rest de JIRA.

La configuración, requerida, en la herramienta de software Jira, es la siguiente:

  1. Cree una cuenta de usuario de Jira .
  2. Cree un nombre de dominio, agregue un proyecto y registre algunos problemas o errores. Nuestra tarea es buscar, emitir datos, usando código Python.
  3. Necesitamos tener un token válido para la autenticación, que se puede obtener desde el enlace   https://id.atlassian.com/manage/api-tokens .

Problemas registrados en la herramienta JIRA para el proyecto «MedicineAppBugs»

JQL: JQL significa Jira Query Language. Es una forma eficiente de obtener datos relacionados con JIRA. Se puede utilizar, tanto en la biblioteca JIRA como en el enfoque API, para obtener datos. Esto implica formar consultas para filtrar información relacionada con errores, proyectos, problemas relevantes, etc. Se pueden usar combinaciones de diferentes operadores y palabras clave en la consulta.

Obtenga datos usando la biblioteca Jira para Python

JIRA, es una biblioteca de Python, para conectarse, con la herramienta JIRA. Esta biblioteca es fácil de usar, en comparación con el método API, para obtener datos relacionados con problemas, proyectos, registros de trabajo, etc. La biblioteca requiere una versión de Python superior a 3.5.

Instale jira usando el comando:

pip install jira

Acercarse:

  • Importe el módulo Jira.
  • Construya una instancia de cliente de Jira utilizando lo siguiente:
    • La clave del servidor, que es su nombre de dominio, se crea en la cuenta de Atlassian.
    • Parámetros básicos de autenticación, su ID de correo electrónico registrado y el token único recibido.
  • Obtenga una instancia de cliente JIRA sin pasar por los parámetros de autenticación.
  • Busque todos los problemas mencionados con el nombre de un proyecto (muestre los detalles, como la clave del problema, el resumen, el nombre del informante, usando la declaración de impresión).

A continuación se muestra la implementación:

Python

# import the installed Jira library
from jira import JIRA
  
# Specify a server key. It should be your
# domain name link. yourdomainname.atlassian.net
jiraOptions = {'server': "https://txxxxxxpython.atlassian.net"}
  
# Get a JIRA client instance, pass,
# Authentication parameters
# and the Server name.
# emailID = your emailID
# token = token you receive after registration
jira = JIRA(options=jiraOptions, basic_auth=(
    "prxxxxxxh@gmail.com", "bj9xxxxxxxxxxxxxxxxxxx5A"))
  
# Search all issues mentioned against a project name.
for singleIssue in jira.search_issues(jql_str='project = MedicineAppBugs'):
    print('{}: {}:{}'.format(singleIssue.key, singleIssue.fields.summary,
                             singleIssue.fields.reporter.displayName))

Producción:

Emite la salida de datos utilizando la biblioteca JIRA.

Con la biblioteca de Jira, también podemos obtener detalles de un solo problema.

 La clave es una identificación única del problema, cuyos detalles requerimos. Se obtiene, después de agregar un Problema, para un proyecto, en la plataforma, mientras se obtienen los detalles de un solo problema, pasa su UniqueID o Key.

Python

# import the installed Jira library
from jira import JIRA
  
# Specify a server key. It is your  domain 
# name link.
jiraOptions = {'server': "https://txxxxxxpython.atlassian.net"}
  
# Get a JIRA client instance, Pass 
# Authentication parameters
# and  Server name.
# emailID = your emailID
# token = token you receive after registration
jira = JIRA(options = jiraOptions, 
            basic_auth = ("prxxxxxxh@gmail.com",
                          "bj9xxxxxxxxxxxxxxxxxxx5A"))
  
# While fetching details of a single issue,
# pass its UniqueID or Key.
singleIssue = jira.issue('MED-1')
print('{}: {}:{}'.format(singleIssue.key,
                         singleIssue.fields.summary,
                         singleIssue.fields.reporter.displayName))

Producción:

Detalles de un problema usando la biblioteca JIRA

 Obtener datos mediante la API REST de Jira

La plataforma del servidor JIRA proporciona la API REST para problemas y flujos de trabajo. Nos permite realizar operaciones CRUD en incidencias, grupos, paneles, etc. La plataforma de desarrollo, para Jira Rest API, está bien documentada y se puede consultar en https://developer.atlassian.com/cloud/ jira/plataforma/rest/v2/intro/ . Según nuestro requisito, debemos buscar el URI específico en la plataforma. En el fragmento de código a continuación, estamos recuperando, todos los problemas, presentes, en contra de nuestro proyecto mencionado ‘MedicineAppBugs’. 

Se requieren bibliotecas de Python:

  1. Library JSON está disponible en el paquete de distribución de python.
  2. Requests de instalación mediante el comando: requests de instalación de pip.
  3. Instale pandas usando el comando – pip install pandas.

Obtener enlace API

  • Visite la API para desarrolladores.
  • Uno puede encontrar una amplia gama de opciones de API disponibles para desarrolladores en el panel izquierdo. Por ejemplo, hay API, para realizar operaciones CRUD, en «Usuarios», «Proyectos», además de Problemas.
  • En este artículo, estamos buscando todos los problemas, por lo tanto, seleccionaremos la opción «Búsqueda de problemas». Seleccionaremos, sub-opción, “Buscar problemas usando el método JQL(GET)”.
  • Al seleccionar esta opción, se muestra la URI “GET /rest/api/2/search” y el formato de los parámetros de solicitud permitidos.
  • Agregue el enlace anterior, con su nombre de dominio como: «https://your-domain.atlassian.net/rest/api/2/search». Esta URL final ayudará a recuperar todos los problemas relacionados con nuestro proyecto.

Acercarse:

  • Importe los módulos requeridos.
  • Preparar URL, para buscar, todos los temas.
  • Cree un objeto de autenticación, utilizando el ID de correo electrónico registrado y el token recibido.
  • Pase el nombre del proyecto, en, consulta JQL. Si omite la consulta JQL, se obtienen los problemas presentes en todos los proyectos de su dominio.
  • Cree y envíe un objeto de solicitud mediante autenticación, objetos de encabezado y consulta JQL.
  • Utilice el método de carga de JSON para convertir la respuesta de JSON en un objeto de diccionario de Python.
  • Todos los problemas están presentes, como elementos de lista, frente a los ‘problemas’ clave, en la salida principal de la API. Por lo tanto, recorra cada elemento.
  • Como un solo problema, individualmente, es un objeto de diccionario anidado adicional, use la función «iterateDictIssues» para obtener las claves requeridas.
  • Finalmente, agregue la lista de salida a un marco de datos de Pandas y muéstrela.

Nota: estudie la salida de la API detenidamente para verificar la ubicación y el tipo de campos que necesita. Pueden ser diccionarios anidados u objetos de lista y, uno debe decidir, la lógica de la función, en consecuencia.

A continuación se muestra la implementación:

Python

# Import the required libraries
import requests
from requests.auth import HTTPBasicAuth
import json
import pandas as pd
  
# URL to Search all issues.
url = "https://txxxxxxpython.atlassian.net/rest/api/2/search"
  
# Create an authentication object,using
# registered emailID, and, token received.
auth = HTTPBasicAuth("prxxxxxxh@gmail.com",
                     "bj9xxxxxxxxxxxxxxxxxxx5A")
  
# The Header parameter, should mention, the
# desired format of data.
headers = {
    "Accept": "application/json"
}
# Mention the JQL query.
# Here, all issues, of a project, are
# fetched,as,no criteria is mentioned.
query = {
    'jql': 'project =MedicineAppBugs '
}
  
# Create a request object with above parameters.
response = requests.request(
    "GET",
    url,
    headers=headers,
    auth=auth,
    params=query
)
  
# Get all project issues,by using the
# json loads method.
projectIssues = json.dumps(json.loads(response.text),
                           sort_keys=True,
                           indent=4,
                           separators=(",", ": "))
  
# The JSON response received, using
# the requests object,
# is an intricate nested object.
# Convert the output to a dictionary object.
dictProjectIssues = json.loads(projectIssues)
  
# We will append,all issues,in a list object.
listAllIssues = []
  
# The Issue details, we are interested in,
# are "Key" , "Summary" and "Reporter Name"
keyIssue, keySummary, keyReporter = "", "", ""
  
  
def iterateDictIssues(oIssues, listInner):
  
    # Now,the details for each Issue, maybe
    # directly accessible, or present further,
    # in nested dictionary objects.
    for key, values in oIssues.items():
  
        # If key is 'fields', get its value,
        # to fetch the 'summary' of issue.
        if(key == "fields"):
  
            # Since type of object is Json str,
            # convert to dictionary object.
            fieldsDict = dict(values)
  
            # The 'summary' field, we want, is 
            # present in, further,nested dictionary
            # object. Hence,recursive call to 
            # function 'iterateDictIssues'.
            iterateDictIssues(fieldsDict, listInner)
  
        # If key is 'reporter',get its value,
        # to fetch the 'reporter name' of issue.
        elif (key == "reporter"):
  
            # Since type of object is Json str 
            # convert to dictionary object.
            reporterDict = dict(values)
  
            # The 'displayName', we want,is present
            # in,further, nested dictionary object.
            # Hence,recursive call to function 'iterateDictIssues'.
            iterateDictIssues(reporterDict, listInner)
  
        # Issue keyID 'key' is directly accessible.
        # Get the value of key "key" and append
        # to temporary list object.
        elif(key == 'key'):
            keyIssue = values
            listInner.append(keyIssue)
  
        # Get the value of key "summary",and,
        # append to temporary list object, once matched.
        elif(key == 'summary'):
            keySummary = values
            listInner.append(keySummary)
  
        # Get the value of key "displayName",and,
        # append to temporary list object,once matched.
        elif(key == "displayName"):
            keyReporter = values
            listInner.append(keyReporter)
  
  
# Iterate through the API output and look
# for key 'issues'.
for key, value in dictProjectIssues.items():
  
    # Issues fetched, are present as list elements,
    # against the key "issues".
    if(key == "issues"):
  
        # Get the total number of issues present
        # for our project.
        totalIssues = len(value)
  
        # Iterate through each issue,and,
        # extract needed details-Key, Summary,
        # Reporter Name.
        for eachIssue in range(totalIssues):
            listInner = []
  
            # Issues related data,is nested 
            # dictionary object.
            iterateDictIssues(value[eachIssue], listInner)
  
            # We append, the temporary list fields,
            # to a final list.
            listAllIssues.append(listInner)
  
# Prepare a dataframe object,with the final 
# list of values fetched.
dfIssues = pd.DataFrame(listAllIssues, columns=["Reporter",
                                                "Summary",
                                                "Key"])
  
# Reframing the columns to get proper 
# sequence in output.
columnTiles = ["Key", "Summary", "Reporter"]
dfIssues = dfIssues.reindex(columns=columnTiles)
print(dfIssues)

Producción:

Problemas recibidos de la herramienta JIRA usando la API REST de JIRA en código python

Publicación traducida automáticamente

Artículo escrito por phadnispradnya y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *