-
Lukas Köhler authoredLukas Köhler authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
validate.py 4.24 KiB
import os
import time
from urllib import parse, request
import urllib3
from jenkins import Jenkins
from jenkins import JenkinsException
DEBUG = False
PIPELINE_CONFIG_URL = 'https://code.fbi.h-da.de/DB-Airport/Config/raw/master/pipelines/PipelineConfig.xml'
PIPELINE_REPO = 'https://code.fbi.h-da.de/DB-Airport/Config.git'
PIPELINE_BASE = 'pipelines'
JENKINSFILE_NAME = 'jenkinsfile.groovy'
JENKINS_URL = 'https://jenkins-18-ws-db1-airport.apps.ocp.fbi.h-da.de'
JENKINS_USERNAME = 'api'
JENKINS_SECRET = os.environ['JENKINS_API_TOKEN']
# Parameter that will be filled when debug is off
USERNAME = 'istlukoeh'
COURSE = 'PAD1'
ASSIGNMENT = 'Praktikum 1'
COURSE_AND_ASSIGNMENT = COURSE + '-' + ASSIGNMENT
JOB_NAME = COURSE + '-' + ASSIGNMENT + '-' + USERNAME
FOLDER = '/tmp/1_3wrqhvuj/'
def validate(job):
global FOLDER
my_init(job)
if not DEBUG:
for fname in os.listdir('.'):
if fname.endswith('Makefile'):
job.run_make(mandatory=True)
server = Jenkins(JENKINS_URL, JENKINS_USERNAME, JENKINS_SECRET)
create_pipeline(server)
paramFolder = FOLDER.split('/')[-1]
if paramFolder == "":
paramFolder = FOLDER.split('/')[-2]
if paramFolder == "":
paramFolder = FOLDER.split('/')[-3]
queue_number = server.build_job(JOB_NAME, {'folder': '/opensubmit/' + paramFolder, 'username': USERNAME})
queue_item = server.get_queue_item(queue_number)
while 'executable' not in queue_item or not queue_item['executable']:
print('Waiting for queue item . . .')
time.sleep(2)
queue_item = server.get_queue_item(queue_number)
while 'number' not in queue_item['executable'] or not queue_item['executable']['number']:
print('Waiting for queue item . . .')
time.sleep(2)
queue_item = server.get_queue_item(queue_number)
build_number = queue_item['executable']['number']
build_output = server.get_build_console_output(JOB_NAME, build_number)
while 'Finished:' not in build_output:
print('Waiting for complete pipeline output . . .')
time.sleep(2)
build_output = server.get_build_console_output(JOB_NAME, build_number)
print('Finished!')
job_url = JENKINS_URL + '/job/' + parse.quote(JOB_NAME) + '/' + str(build_number)
result = '<a href="' + job_url + '" target="_blank">Jenkins results</a>'
success = 'Finished: SUCCESS' in build_output
if success:
print('Failed!')
else:
print('Success')
print(result)
if not DEBUG:
if success:
job.send_pass_result(result)
else:
job.send_fail_result(result)
def my_init(job):
global USERNAME
global COURSE
global ASSIGNMENT
global FOLDER
global COURSE_AND_ASSIGNMENT
global JOB_NAME
if not DEBUG:
USERNAME = job.submitter_student_id
COURSE = job.course
ASSIGNMENT = job.assignment
FOLDER = job.working_dir
COURSE_AND_ASSIGNMENT = COURSE + '-' + ASSIGNMENT
JOB_NAME = COURSE + '-' + ASSIGNMENT + '-' + USERNAME
fileNameList = [name for name in os.listdir(FOLDER) if
'__pycache__' not in name and '.py' not in name and '.zip' not in name]
while len(fileNameList) == 1 and os.path.isdir(os.path.join(FOLDER, fileNameList[0])):
FOLDER = os.path.join(FOLDER, fileNameList[0])
job.working_dir = FOLDER
os.system('scp -i /ssh/key -r ' + FOLDER + ' jenkins-ssh@jenkins-ssh:/opensubmit')
os.system('chmod -R 777 ' + FOLDER)
os.environ['PYTHONHTTPSVERIFY'] = '0'
urllib3.disable_warnings()
def create_pipeline(jenkins_server):
# data = request.urlopen(
# PIPELINE_BASE_URL + parse.quote(COURSE) + '/' + parse.quote(ASSIGNMENT) + '.xml')
data = request.urlopen(PIPELINE_CONFIG_URL)
xml_file = data.read().decode("utf-8")
xml_file = xml_file.replace('{USERNAME}', USERNAME)
xml_file = xml_file.replace('{GIT_REPO}', PIPELINE_REPO)
xml_file = xml_file.replace('{GIT_JENKINSFILE_PATH}',
PIPELINE_BASE + '/' + COURSE + '/' + ASSIGNMENT + '/' + JENKINSFILE_NAME)
try:
jenkins_server.create_job(JOB_NAME, xml_file)
except JenkinsException:
print('Pipeline already exists')
if DEBUG:
validate(None)