mirror of
				https://github.com/lubuntu-team/metrics.git
				synced 2025-10-30 05:24:23 +00:00 
			
		
		
		
	Add Jenkins module.
This commit is contained in:
		
							parent
							
								
									3df8d10285
								
							
						
					
					
						commit
						5393848598
					
				
							
								
								
									
										6
									
								
								metrics
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								metrics
									
									
									
									
									
								
							| @ -15,5 +15,9 @@ | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
| 
 | ||||
| from modules.jenkins import JenkinsModule | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
|     print("Coming soon.") | ||||
|     jenkins = JenkinsModule() | ||||
|     print(jenkins.sqlite_setup()) | ||||
|     print(jenkins.sqlite_add()) | ||||
|  | ||||
							
								
								
									
										0
									
								
								modules/__init__.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										0
									
								
								modules/__init__.py
									
									
									
									
									
										Executable file
									
								
							
							
								
								
									
										111
									
								
								modules/jenkins.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										111
									
								
								modules/jenkins.py
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,111 @@ | ||||
| #!/usr/bin/env python3 | ||||
| 
 | ||||
| # Copyright (C) 2020 Simon Quigley <tsimonq2@lubuntu.me> | ||||
| # | ||||
| # This program is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # This program is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
| 
 | ||||
| from jenkinsapi.custom_exceptions import NoBuildData | ||||
| from jenkinsapi.jenkins import Jenkins | ||||
| from os import getenv | ||||
| 
 | ||||
| class JenkinsModule: | ||||
|     """Jenkins module for the Metrics program""" | ||||
| 
 | ||||
|     def _auth_jenkins_server(self): | ||||
|         """Authenticate to the Jenkins server | ||||
| 
 | ||||
|         This uses the API_SITE, API_USER, and API_KEY env vars. | ||||
|         """ | ||||
|         # Load the API values from the environment variables | ||||
|         api_site = getenv("API_SITE") | ||||
|         api_user = getenv("API_USER") | ||||
|         api_key = getenv("API_KEY") | ||||
|         for envvar in [api_site, api_user, api_key]: | ||||
|             if not envvar: | ||||
|                 raise ValueError("API_SITE, API_USER, and API_KEY must be", | ||||
|                                  "defined") | ||||
|         # Authenticate to the server | ||||
|         server = Jenkins(api_site, username=api_user, password=api_key) | ||||
| 
 | ||||
|         return server | ||||
| 
 | ||||
|     def _get_data(self): | ||||
|         """Get the data from the Jenkins server | ||||
| 
 | ||||
|         This function returns three distinct values as one list: | ||||
| 
 | ||||
|         [nonpassing, failing, total] | ||||
|         """ | ||||
| 
 | ||||
|         # Authenticate to the server | ||||
|         server = self._auth_jenkins_server() | ||||
| 
 | ||||
|         # Initialize the data, and get the total jobs on the server | ||||
|         data = [0, 0, len(server.jobs.keys())] | ||||
| 
 | ||||
|         # jenkinsapi has a built-in method for iterating on jobs | ||||
|         # val will always be a jenkins Job class | ||||
|         for val in server.jobs.itervalues(): | ||||
|             # If we come across a job that has no build, make it a SUCCESS | ||||
|             # The goal of this is to identify problematic jobs, and jobs with | ||||
|             # no existing builds aren't necessarily problematic (yet) | ||||
|             try: | ||||
|                 status = val.get_last_build().get_status() | ||||
|             except NoBuildData: | ||||
|                 status = "SUCCESS" | ||||
| 
 | ||||
|             # If it's not successful, add it to nonpassing, since failing is | ||||
|             # reserved for jobs with the specific status of FAILURE | ||||
|             if status != "SUCCESS": | ||||
|                 data[0] += 1 | ||||
| 
 | ||||
|                 if status == "FAILURE": | ||||
|                     data[1] += 1 | ||||
| 
 | ||||
|         return data | ||||
| 
 | ||||
|     def sqlite_setup(self): | ||||
|         """Initially set up the table for usage in SQLite | ||||
| 
 | ||||
|         This returns a str which will then be executed in our SQLite db | ||||
| 
 | ||||
|         Here is the "jenkins" table layout: | ||||
|          - date is the primary key, and it is the Unix timestamp as an int | ||||
|          - nonpassing is the number of !(SUCCESS) jobs as an int | ||||
|          - failing is the number of FAILURE jobs as an int | ||||
|          - total is the total number of jobs on the Jenkins server as an int | ||||
|         """ | ||||
| 
 | ||||
|         command = "CREATE TABLE IF NOT EXISTS jenkins (date INTEGER PRIMARY " | ||||
|         command += "KEY, nonpassing INTEGER, failing INTEGER, total INTEGER);" | ||||
| 
 | ||||
|         return command | ||||
| 
 | ||||
|     def sqlite_add(self): | ||||
|         """Add data to the SQLite db | ||||
| 
 | ||||
|         This retrieves the current data from the Jenkins server, and returns a | ||||
|         str which will then be executed in our SQLite db | ||||
|         """ | ||||
| 
 | ||||
|         # Match the variable names with the column names in the db | ||||
|         nonpassing, failing, total = self._get_data() | ||||
|         date = "strftime('%s', 'now')" | ||||
| 
 | ||||
| 
 | ||||
|         # Craft the str | ||||
|         command = "INSERT INTO jenkins VALUES ({}, {}, {}, {});".format( | ||||
|                 date, nonpassing, failing, total) | ||||
| 
 | ||||
|         return command | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user