def jenkin_server_instance(url, username, password): print("Connecting to jenkin instance \n") try: server = Jenkins(url, username, password) user = server.get_whoami() version = server.get_version() print("Hello %s from Jenkins %s \n" % (user["fullName"], version)) return server except JenkinsException: print("Authentication Error: Invalid Password/Token for user \n") return
from jenkins import Jenkins job_settings = { 'DEPLOY_TO': 'feature1.dev.roundme.com', 'FRONTEND_BRANCH': '1.6.1', 'BACKEND_BRANCH': '1.6.1', 'RUN_TEST': False, 'DEPLOY_REPO_BRANCH': 'master', 'NPM_ARGS': 'production', 'GRUNT_ARGS': 'testing', 'DEPLOY_TO_S3': False, 'MIGRATE': False, 'ENV': 'feature' } server = Jenkins('http://234234', username='******', password='******') # serverstring print(server) user = server.get_whoami() print(user) job = server.get_job_config('Roundme.Full.Build') print(job) server.build_job('Roundme.Full.Build', job_settings) last_build_number = server.get_job_info( 'Roundme.Full.Build')['lastCompletedBuild']['number'] build_info = server.get_build_info('Roundme.Full.Build', last_build_number) print(build_info)
import sys from jenkins import Jenkins j = Jenkins(url='http://sola.local:8080', username='******', password='******') w = j.get_whoami() print(w) jobs = j.get_all_jobs() for j in jobs: # print(j['name'] + ' --> ' + j['fullname']) print(j['fullname'])
def main_process(self): print("Jenkins Version Extractor") uname = self.entry_username.get() pword = self.entry_password.get() server = Jenkins('https://jenkins_url', username=uname, password=pword) user = server.get_whoami() version = server.get_version() #Environments list environmentReArrange = ['-DeployToEnvList'] #to traverse package names list pkgTraverse = 0 version_list = [] #Append the new list of version values to version_list versionsAll = [] #To keep track of the values in the list count = 0 def firstVersionExtractor(server, environmentReArrange, count): firstAllInfo = server.get_job_info("folder_1", depth=2) firstAllJobs = firstAllInfo['jobs'] #To fetch number of jobs under folder 1 with folder depth of 2 levels numOfJobs = len(firstAllJobs) for j in range(0, numOfJobs): try: version_list.append([]) firstSpecficJob = firstAllJobs[j]['jobs'] firstSpecificName = firstSpecficJob[0]['name'] cutPosition = firstSpecificName.find('-') firstSpecificName = firstSpecificName[cutPosition + 1:] versionsAll.append(firstSpecificName) for everyJob in firstSpecficJob: for envValue in environmentReArrange: try: if re.search(envValue, everyJob['name']): last_successful_build = everyJob[ 'lastSuccessfulBuild'] #Checking if the env has any successful builds if last_successful_build == None: versionsAll.append('N/A') continue #If it has, then take the number last_successful_build_number = last_successful_build[ 'number'] print(everyJob['fullName']) build_info = server.get_build_info( everyJob['fullName'], last_successful_build_number) display_info = build_info['displayName'] cutPosition = display_info.find('-') display_info = display_info[cutPosition + 1:] versionsAll.append(display_info) except IndexError: continue #Assign the list to the main and clear the values in it here. print(versionsAll) for k in versionsAll: version_list[count].append(k) versionsAll.clear() count += 1 except KeyError: continue return count #For cleaning up the single build objects. def listCleaner(version_list, s): while s == "clean": true_list = [] for vclean in version_list: # notApplicableCleaner(vclean) if (vclean == []): version_list.remove(vclean) countNotApp = Counter(vclean) if ((countNotApp['N/A']) > 7): version_list.remove(vclean) if (len(vclean) == 1): version_list.remove(vclean) true_list.append(0) else: true_list.append(1) cleanCounter = Counter(true_list) if (cleanCounter[0] == 0): s = "noCleaning" #Function Calls print("Starting First Job") nxtCount = firstVersionExtractor(server, environmentReArrange, count) print("First Job DONE") print("Clean-Up of the Elements") listCleaner(version_list, s="clean") print(version_list) df = DataFrame(version_list, columns=['Application Name', 'EnvironmentList']) print(df) writer = ExcelWriter('Version.xlsx') df.to_excel(writer, 'Versions', index=False) writer.save() tm.showinfo("Jenkins Version", "Excel Ready")
class JC: def __init__(self): self.JCDirectoryLoc = '' self.JCBuiltFileLoc = '' self.JCServerConfFileLoc = '' self.JenkinsServerAddress = 'none' self.JenkinsServerPort = 'none' self.ServerHandler = None self.IpRegex = '''^(25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)\.( 25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)\.( 25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)\.( 25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)''' self.JCSelectedJobCommands = { '(enable)': ' - Enable the specified job on Jenkins Server', '(disable)': ' - Disable the specified job on Jenkins Server', '(build)': ' - Build the specified job on Jenkins Server', '(stat [*])': ' - Displays status and general information about the specified job', '(?)': ' - Displays list of available commands', '(??)': ' - Displays list of available commands verbosely', '(quit/exit)': ' - Quit Job configuration mode' } self.JigGlobalCommands = { '(show local jobs [*])': ' - Displays all jobs saved and waiting in your local machine to be created on server', '(show server jobs)': ' - Displays all jobs currently on your jenkins server', '(show build queue)': ' - Displays all jobs in build queue', '(delete local job)': ' - Deletes jobs on your local machine', '(delete server job)': ' - Deletes jobs on your jenkins server', '(reconfig server job)': ' - Reconfigures an existing job', '(select server job)': ' - Selects job and enter job configuration mode', '(connect)': ' - Connects to jenkins server', '(disconnect)': ' - Disconnects from jenkins server', '(create server job)': ' - Creates a new job on server ', '(?)': ' - Displays list of available commands', '(??)': ' - Displays list of available commands verbosely', '(exit / quit)': ' - Quit JC program' } def initialize(self): fh=open("C:\\Users\{0}\JC\controls".format(getuser())) for line in fh: if line.startswith('server.conf'): self.JCServerConfFileLoc=(line.split("=")[1]).strip() elif line.startswith('jobdir'): self.JCDirectoryLoc=(line.split("=")[1]).strip() elif line.startswith('built'): self.JCBuiltFileLoc=(line.split("=")[1]).strip() elif line.startswith('address'): self.JenkinsServerAddress=(line.split("=")[1]).strip() elif line.startswith('port'): self.JenkinsServerPort=(line.split("=")[1]).strip() fh.close() def display_introduction(self): ''' Display an introduction message for the program containing the version and status of development ''' print(" Welcome to JC 1.4") print("JC is a project which creates an interface to manage your Jenkins Server for your projects") print("This project is still under development ") def display_list_of_global_mode_commands(self, verbos=False, search_key=None): ''' Display list of available commands in global mode :param verbos: display description of command(s) if true :param search_key: display all commands starts with the 'key' param . default is None meaning all available commands ''' print("---------------Commands---------------") if search_key is None: for command, description in self.JigGlobalCommands.items(): print(command, description if verbos else '') else: for command, description in self.JigGlobalCommands.items(): if command.startswith('({0}'.format(search_key)): print(command, description if verbos else '') print("---------------------------------------") def display_list_of_selected_job_mode_commands(self, verbos=False, search_key=None): ''' Display list of available commands in selected job mode :param verbos: display description of command(s) if true :param search_key: display all commands starts with the 'key' param . default is None meaning all available commands ''' print("---------------Commands---------------") if search_key is None: for command, description in self.JCSelectedJobCommands.items(): print(command, description if verbos else '') else: for command, description in self.JCSelectedJobCommands.items(): if command.startswith('({0}'.format(search_key)): print(command, description if verbos else '') print("---------------------------------------") def show_local_jobs(self, Detail=False): ''' Display list of local jobs :param Detail: If True , Displays more detail about local jobs :return: ''' # TODO display format if len(listdir(self.JCDirectoryLoc)) == 0: print("No local job") else: if Detail: print("Status".ljust(8), "CRL".ljust(23), "CRS".ljust(23), "RCFG".ljust(23), "Name") print("-----".ljust(8), "--------".ljust(23), "--------".ljust(23), "--------".ljust(23), "-----") else: print("Status".ljust(8),"Name".ljust(20)) print("-----".ljust(8), "-----".ljust(33)) fhandle = open(self.JCBuiltFileLoc) for line in fhandle: line = line.strip() if line.startswith("#"): pass else: if Detail: Status=(line.split("@")[0]).ljust(8) CRL = ((line.split("@")[1]).split(".")[0]).ljust(23) CRS = ((line.split("@")[2]).split(".")[0] if line.split("@")[2]!='None' else 'None').ljust(23) RCFG = ((line.split("@")[3]).split(".")[0] if line.split("@")[3]!='None' else 'None').ljust(23) Name= (line.split("@")[4]) print(Status,CRL,CRS,RCFG,Name) else: Status = (line.split("@")[0]).ljust(8) Name= (line.split("@")[4]) print(Status,Name) fhandle.close() def connect_to_jenkins_server(self): # Because if there is a problem in reading server.conf file # both IP address and Port number becomes none # so we just check server address to be none or not fh=open("C:\\Users\{0}\JC\controls".format(getuser())) for line in fh: if line.startswith('address'): self.JenkinsServerAddress=(line.split("=")[1]).strip() elif line.startswith('port'): self.JenkinsServerPort=(line.split("=")[1]).strip() fh.close() if self.JenkinsServerAddress !='none': print("Connecting {0}:{1}".format(self.JenkinsServerAddress, self.JenkinsServerPort)) UserName = input("Username : "******"Password : "******"Connected successfully as {2}".format(self.JenkinsServerAddress, self.JenkinsServerPort, UserName)) except: self.ServerHandler = None print("Connection to server Failed") else: print("-Server configuration parameters are not defined properly") print("-Check server.conf for parameters and then use jcr.exe to set them") def is_connected(self): ''' Check whether we are connected to server or not ''' return True if self.ServerHandler else False def disconnect_from_jenkins_server(self, place=None): ''' Disconnect from the server :param place: Defines the place we are disconnecting . Displayed message can be different based on this parameter ''' # TODO Close the TCP PORT if self.ServerHandler == None: # Disconnect and Stay in the program if place is None: print("You are already disconnected") return self.ServerHandler = None # Disconnect while exiting the program print("You are disconnected successfully") def create_server_job(self, JobName): ''' Create a server job based on a config.xml file existing on the local machine :param JobName: job's name to be created ''' if self.ServerHandler is None: print("Your are not connected to server") print("First connect by 'connect' command") return if not path.exists('{0}{1}{2}'.format(self.JCDirectoryLoc, JobName, '.config.xml')): print("-Job '{0}' config.xml file does not exist on your local machine".format(JobName)) print("First create a config.xml file for job {0} by jigjr command".format(JobName)) else: ListServerJobs = [server_job["name"] for server_job in self.ServerHandler.get_jobs()] if JobName in ListServerJobs: print("-Job '{0}' already exists on the server".format(JobName)) AskingResult = self.asking_user_decision("Do you want to recreate job {0}?[y/n] : ".format(JobName)) if AskingResult: self.ServerHandler.delete_job(JobName) print("-Deleting job '{0}' from server ..".format(JobName)) fhandle = open(self.JCDirectoryLoc + JobName + ".config.xml") SelectedJobXml = fhandle.read() fhandle.close() self.ServerHandler.create_job(JobName, SelectedJobXml) print("-Job '{0}' recreated successfully".format(JobName)) # Recreate a job is similar to reconfigure that job update_built_file(self.JCBuiltFileLoc, 'update-reconfigure-date', JobName, reconfig_date=datetime.now()) else: AskingResult = self.asking_user_decision("Sure creating job {0}?[y/n] : ".format(JobName)) if AskingResult: fhandle = open(self.JCDirectoryLoc + JobName + ".config.xml") SelectedJobXml = fhandle.read() fhandle.close() self.ServerHandler.create_job(JobName, SelectedJobXml) print("-Job '{0}' created successfully".format(JobName)) update_built_file(self.JCBuiltFileLoc, 'update-server-create-date', JobName, server_creation_date=datetime.now()) def reconfigure_server_job(self, JobName, LocalConfigJobName=None): ''' Reconfigure a server job :param JobName: Server job to be configured :param LocalConfigJobName: If None , JobName.config.xml file is searched in local machine , else, LocalConfigJobName.config.xml is searched ''' if self.ServerHandler is None: print("Your are not connected to server") print("First connect by 'connect' command") return ListServerJobs = [server_job["name"] for server_job in self.ServerHandler.get_jobs()] if JobName not in ListServerJobs: print("-Job '{0}' does not exist on the server".format(JobName)) else: ListLocalJobs = [job.split(".")[0] for job in listdir(self.JCDirectoryLoc)] # If the LocalConfigJobName is not specified use the JobName as defualt LocalConfigJobName = JobName if LocalConfigJobName is None else LocalConfigJobName if LocalConfigJobName not in ListLocalJobs: print("-Job {0} config.xml file does not exist in your local machine".format(LocalConfigJobName)) else: print("{0}.config.xml found".format(LocalConfigJobName)) AskingResult = self.asking_user_decision("Sure reconfiguring job {0}?[y/n] : ".format(JobName)) if AskingResult: fhandle = open(self.JCDirectoryLoc + LocalConfigJobName + ".config.xml") SelectedJobXml = fhandle.read() fhandle.close() self.ServerHandler.reconfig_job(LocalConfigJobName, SelectedJobXml) print("-Job '{0}' reconfigured successfully".format(LocalConfigJobName)) update_built_file(self.JCBuiltFileLoc, 'update-reconfigure-date', LocalConfigJobName, reconfig_date=datetime.now()) def show_build_queue(self): ''' Display list of jobs which are currently under building process ''' if self.ServerHandler is None: print("Your are not connected to server") print("First connect by 'connect' command") return else: BuildQueue = self.ServerHandler.get_queue_info() if len(BuildQueue) == 0: print("No job in build queue") return else: BuildQueueCounter = 1 for job in BuildQueue: jobInfo = self.ServerHandler.get_job_info(job['task']['name']) print("{0}: {1}\tBuilding No: {2}".format(BuildQueueCounter, job["task"]["name"], jobInfo['nextBuildNumber'])) BuildQueueCounter += 1 def show_server_jobs(self): ''' Display list of jobs currently configured on the server ''' if self.ServerHandler is None: print("Your are not connected to server") print("First connect by 'connect' command") return else: if len(self.ServerHandler.get_jobs()) == 0: print("No job currently on the server") else: ListServerJobs = [server_job["name"] for server_job in self.ServerHandler.get_jobs()] # This list is to reduce the latency of display of all jobs # First collect information of all jobs then display ReadyList = [] for job in ListServerJobs: JobInfo = self.ServerHandler.get_job_info(job) JobStatus = 'Disabled' if JobInfo['disabled'] else 'Enabled' JobTotalBuilds = "0" if JobInfo['lastBuild'] is None else JobInfo['lastBuild']['number'] JobLastBuild = "None" if JobInfo['lastBuild'] is None else datetime.fromtimestamp( self.ServerHandler.get_build_info(job, JobInfo['lastBuild']['number'])['timestamp'] / 1000) ReadyList.append([JobStatus, JobTotalBuilds, JobLastBuild, job]) print("Status".ljust(8), "Build".ljust(7), "Timestamp".ljust(22), "Name".ljust(20)) print("-----".ljust(8), "-----".ljust(7), "------".ljust(22), "----".ljust(20)) for j in ReadyList: print(j[0].ljust(9), str(j[1]).ljust(6),('None' if str(j[2]) == 'None' else str(j[2]).split(".")[0]).ljust(22), j[3].ljust(20)) def delete_local_job(self, JobName): ''' Delete local jobs ''' LocalJobs = [job.split(".")[0] for job in listdir(self.JCDirectoryLoc)] if JobName not in LocalJobs: print("-Job '{0}' does not exist in your local machine".format(JobName)) return else: AskingResult = self.asking_user_decision("Sure deleting job '{0}'?[y/n] : ".format(JobName)) if AskingResult: remove(self.JCDirectoryLoc + JobName + ".config.xml") print("-Job '{0}' removed successfully from your local machine".format(JobName)) update_built_file(self.JCBuiltFileLoc, 'delete', JobName) def delete_server_job(self, JobName): ''' Delete Specified server job ''' if self.ServerHandler is None: print("Your are not connected to server") print("First connect by 'connect' command") return else: ListServerJobs = [server_job["name"] for server_job in self.ServerHandler.get_jobs()] if JobName not in ListServerJobs: print("-Job '{0}' does not exist in Jenkins Server".format(JobName)) return else: AskingResult = self.asking_user_decision("Sure deleting job '{0}'?[y/n]: ".format(JobName)) if AskingResult: self.ServerHandler.delete_job(JobName) print("-Job '{0}' removed successfully from server".format(JobName)) update_built_file(self.JCBuiltFileLoc, 'update-deploy-status-ND', JobName) def disable_server_job(self, JobName): ''' Disable specified server job ''' JobState = self.ServerHandler.get_job_info(JobName)['disabled'] if JobState: print("-Job '{0}' is already disabled".format(JobName)) return self.ServerHandler.disable_job(JobName) print("-Job '{0}' successfully disabled".format(JobName)) def enable_server_job(self, JobName): ''' Enable specified server job ''' JobState = self.ServerHandler.get_job_info(JobName)['disabled'] if not JobState: print("-Job '{0}' is already enabled".format(JobName)) return self.ServerHandler.enable_job(JobName) print("-Job '{0}' successfully enabled".format(JobName)) def build_server_job(self, JobName): ''' Build specified server job ''' JobState = self.ServerHandler.get_job_info(JobName)['disabled'] if JobState: print("-Job '{0}' is disabled and cannot built".format(JobName)) else: self.ServerHandler.build_job(JobName) print("-Job '{0}' successfully built".format(JobName)) def stat_server_job(self, JobName, Detail=False): ''' Display status of the selected job :param Detail: If * specified , more detail about job is displayed ''' # Because building a job can take long time we do not display the status # until the building process gets done BuildQueue = self.ServerHandler.get_queue_info() for job in BuildQueue: if JobName == job["task"]["name"]: print("-Job '{0}' is under building process".format(JobName)) return JobInfo = self.ServerHandler.get_job_info(JobName) JobName_Sta = "Name: {0}".format(JobName) JobStatus_Sta = "Status: {0}".format('Disabled' if JobInfo['disabled'] else 'Enabled') JobTotalBuilds_Sta = "TotalBuilds: {0}".format( "0" if JobInfo['lastBuild'] is None else JobInfo['lastBuild']['number']) JobLastBuild_Sta = "LastBuild: {0}".format("None" if JobInfo['lastBuild'] is None else datetime.fromtimestamp( self.ServerHandler.get_build_info(JobName, JobInfo['lastBuild']['number'])['timestamp'] / 1000)) JobFirstBuild_Sta = "FirstBuild: {0}".format("None" if JobInfo['lastBuild'] is None else datetime.fromtimestamp( self.ServerHandler.get_build_info(JobName, JobInfo['lastBuild']['number'])['timestamp'] / 1000)) JobLastCompletedBuild_Sta = "LastCompletedBuild: {0}".format( "None" if JobInfo['lastCompletedBuild'] is None else str(datetime.fromtimestamp( self.ServerHandler.get_build_info(JobName, JobInfo['lastCompletedBuild']['number'])[ 'timestamp'] / 1000)).split(".")[0]) JobLastFailedBuild_Sta = "LastFailedBuild: {0}".format( "None" if JobInfo['lastFailedBuild'] is None else str(datetime.fromtimestamp( self.ServerHandler.get_build_info(JobName, JobInfo['lastFailedBuild']['number'])['timestamp'] / 1000)).split(".")[0]) JobLastStableBuild_Sta = "LastStableBuild: {0}".format( "None" if JobInfo['lastStableBuild'] is None else str(datetime.fromtimestamp( self.ServerHandler.get_build_info(JobName, JobInfo['lastStableBuild']['number'])['timestamp'] / 1000)).split(".")[0]) JobLastSuccessfulBuild_Sta = "LastSuccessfulBuild: {0}".format( "None" if JobInfo['lastSuccessfulBuild'] is None else str(datetime.fromtimestamp( self.ServerHandler.get_build_info(JobName, JobInfo['lastSuccessfulBuild']['number'])[ 'timestamp'] / 1000)).split(".")[0]) JobLastUnstableBuild_Sta = "LastUnstableBuild: {0}".format( "None" if JobInfo['lastUnstableBuild'] is None else str(datetime.fromtimestamp( self.ServerHandler.get_build_info(JobName, JobInfo['lastUnstableBuild']['number'])['timestamp'] / 1000)).split(".")[0]) JobLastUnsuccessfulBuild_Sta = "LastUnsuccessfulBuild: {0}".format( "None" if JobInfo['lastUnsuccessfulBuild'] is None else str(datetime.fromtimestamp( self.ServerHandler.get_build_info(JobName, JobInfo['lastUnsuccessfulBuild']['number'])[ 'timestamp'] / 1000)).split(".")[0]) print(JobName_Sta) print(JobStatus_Sta) print(JobTotalBuilds_Sta) print(JobLastBuild_Sta) print(JobLastStableBuild_Sta) print(JobLastCompletedBuild_Sta) if Detail: print(JobFirstBuild_Sta) print(JobLastFailedBuild_Sta) print(JobLastSuccessfulBuild_Sta) print(JobLastUnstableBuild_Sta) print(JobLastUnsuccessfulBuild_Sta) def select_server_job(self, JobName): ''' Select a server job and enter selected job mode ''' if self.ServerHandler is None: print("Your are not connected to server") print("First connect by 'connect' command") return else: ListServerJobs = [server_job["name"] for server_job in self.ServerHandler.get_jobs()] if JobName not in ListServerJobs: print("-Job '{0}' not exist in Jenkins Server".format(JobName)) return else: SelectedJobSession = PromptSession( lexer=PygmentsLexer(SqlLexer), completer=selected_job_command_completer) while True: try: UserCommand = SelectedJobSession.prompt("(" + JobName + ')## ') UserCommand = (sub(' +', ' ', UserCommand)).strip() if UserCommand.startswith("??"): keyValue = (UserCommand.split("??")[1].strip()) if keyValue == '': jc.display_list_of_selected_job_mode_commands(verbos=True) else: jc.display_list_of_selected_job_mode_commands(search_key=keyValue, verbos=True) elif UserCommand.startswith("?"): keyValue = (UserCommand.split("?")[1].strip()) if keyValue == '': jc.display_list_of_selected_job_mode_commands() else: jc.display_list_of_selected_job_mode_commands(search_key=keyValue) elif UserCommand == "quit" or UserCommand == "exit": return elif UserCommand == "enable": self.enable_server_job(JobName) elif UserCommand == "disable": self.disable_server_job(JobName) elif UserCommand == "build": self.build_server_job(JobName) elif UserCommand == 'stat *': self.stat_server_job(JobName, Detail=True) elif UserCommand == 'stat': self.stat_server_job(JobName) elif UserCommand == "": pass else: print("%Invalid Command") except KeyboardInterrupt: break except EOFError: break except: print("There was a problem in program") return def get_whoami(self): ''' Display who is connected to server ''' if self.ServerHandler is None: print("Your are not connected to server") print("First connect by 'connect' command") return else: UserInfo = self.ServerHandler.get_whoami() print("Full Name : ", UserInfo["fullName"]) print("Id : ", UserInfo["id"]) def asking_user_decision(self, displayMessage): ''' This process is repeated many times in the code asking the user for yes/no answer so this process is turned into a function for simplicity :param displayMessage: Message to be displayed for asking user his/her decision ''' while True: UserDecision = input(displayMessage) if UserDecision.lower() in "y yes ye": return True elif UserDecision.lower() in "n no": return False def get_job_directory(self): return self.JCDirectoryLoc