Skip to main content

JIRA AUTO CLOSE

JRPY

import pandas

import subprocess

import time

import logging

import sys

#Logging Initialization

logging.basicConfig(filename=’/data/jira_closure.log’,

                                       format='[%(asctime)s {%(pathname)s:%(lineno)d} :%(levelname)s ] \n %(message)s',

               datefmt='%m-%d-%Y %H:%M:%S',

               level=logging.INFO,

               filemode='w')

 

logger=logging.getLogger(__name__)

from datetime import datetime,timedelta

import json

from jira import JIRA,JIRAError

from master_key import GETPWD

 

statTM= datetime.now()

pwd=GETPWD()

if len(sys.argv) > 1:

    dry-run=sys.argv[1]

    logger.info(f"DEFAULT EXECUTION of {sys.argv[1]} in DRY RUN (FLAG {dry-run})")

else:

    dry-run="Y"

    logger.info(f"DEFAULT EXECUTION of {sys.argv[1]} in DRY RUN (FLAG {dry-run})")

 

def close_jira(jiraTKT,data):

    print(f"Going to Close JIRA {jiraTKT}")

    try:

        issue=jira.issue(jiraTKT)

        if issue.fields.status.name== 'Production':

            logger.info(f"JIRA {jiraTKT} already in Production Status - No Action to take")

        else:

            fixVersions=[]

            fixVersions.append({'name':'<fix version to use>'})

            issue.update(fields=('fixVersions':fixVersions})

            jira.add_comment(issue,f"JIRA BOT CLOSED \n {data}")

            jira.transition_issue(issue,u'Production')

            logger.info(f"JIRA BOT CLOSED {jiraTKT}")

    except JIRAError as e:

        logger.info(f"Failed to Close JIRA {jiraTKT} with ERROR {e.status_code} MESSAGE {e.text} ")

        sys.exit(1)

    return None

   

URL='https:jira.com'

#Hive Beeline Connection URL

hCon="jdbc:hive2://host:10000/db;principal=hive/_HOST@FQDN"

 

#Intantiate JIRA Connection

jira=JIRA(server=URL,basic_auth=('user',pwd))

 

toDAY=time.strftime('%Y%m%d_%H%M%S',time.localtime())

 

logger.info(f"STARTING SCRIPT {sys.argv[0]} - DATE OF RUN {toDAY}")

 

opLOC='/data/jira/out'

opFL=f"{opLOC}/hiveOP.csv"

 

hiveQRY="""WITH JIRCUR as (SELECT JIRA_TKT_NO,split(summary,'')[1] as tbl_name from tbl1

WHERE status = 'Open' and issue_type='Bug' and summary rlike('^Table [A-Z]\[a-z]|[0-9]* Not Current'))

SELECT JIRA_TKT_NO,tbl_name,b.run_date,b.table_name,b.log_table,b.last_received_date,b.source_system,b.load_status from JIRCUR a

INNER JOIN

tbl2 b

ON (trim(a.tbl_name)=trim(b.table_name))

WHERE b.load_status = 'PASS' and b.run_date = current_date

;"""

 

cmd=f'''beeline -u "{hCon}" --silent=true --outputformat=csv2 -e "{hiveQRY}" > {opLOC}/hive_tickets.txt '''

 

status,output=subprocess.getstatusoutput(cmd)

 

if status == 0:

    logger.info(f"BEELINE COMMAND COMPLETED SUCESSFULLY {cmd} ")

else:

    logger.info(f"BEELINE COMMAND {cmd} FAILED WITH STATUS {status}")

  

  

#Load Hive Output file to DF using pandas

df=pd.read_csv(f"{opLOC}/hive_tickets.txt",header=0)

df.columns=['jira_key','jira_tbl','run_date','table_name','log_table','last_received_date','source_system','load_status']

 

print(len(df))

 

if df.empty:

    logger.info(f"NO JIRA TICKET CANDIDATES FROM HIVE TABLE FOR {toDAY}")

    sys.exit(0)

   

#ITERATE over each row in dataframe and close jira ticket

 

for index,row in df.iterrows():

    if dry-run == 'Y':

        logger.info(f''' READY TO CLOSE \n JIRA ISSYE {row['jira_key']} \n DATA {df.iloc[[index]].to_markdown(index=False,tablefmt="jira")}''')

    else:

        logger.info(f"NOW GOING TO CLOSE JIRA {row['jira_key']}")

        close_jira(row['jira_key'],df.iloc[[index]].to_markdown(index=False,tablefmt="jira"))

 

 

logger.info(f"BOT SCRIPT {sys.argv[0]} COMPLETED EXECUTION IN (HH:MM:SS.ssss) :- {datetime.now() - statTM} ")

print(f"SCRIPT {sys.argv[0]} COMPLETED EXECUTION IN (HH:MM:SS.ssss) :- {datetime.now() - statTM} ")

print("BOT SCRIPT COMPLETED ")

  

 

 

Comments