2018-09-26 18:11:53 +02:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
"""
|
|
|
|
Module for backend talk with Jenkins executed by the web/CGI
|
|
|
|
"""
|
|
|
|
|
|
|
|
from argparse import ArgumentParser
|
2018-09-26 18:40:52 +02:00
|
|
|
from subprocess import run
|
2018-09-26 18:11:53 +02:00
|
|
|
|
2018-09-26 19:13:49 +02:00
|
|
|
from config import (jarargs, jobpath)
|
2018-09-26 18:11:53 +02:00
|
|
|
|
|
|
|
|
|
|
|
def html_escape(string):
|
|
|
|
"""
|
|
|
|
Function for escaping certain symbols to XML-compatible sequences.
|
|
|
|
"""
|
|
|
|
html_codes = [("'", '''), ('"', '"'), ('&', '&'),
|
|
|
|
('<', '<'), ('>', '>')]
|
|
|
|
for i in html_codes:
|
|
|
|
string = string.replace(i[0], i[1])
|
|
|
|
|
|
|
|
return string
|
|
|
|
|
|
|
|
|
2018-09-26 18:40:52 +02:00
|
|
|
def add_job(jobname):
|
2018-09-26 18:11:53 +02:00
|
|
|
"""
|
|
|
|
Function for adding a job to Jenkins.
|
|
|
|
"""
|
|
|
|
info = jobname.split('-')
|
|
|
|
desc = 'WebSDK build for: %s\nStarted: %s' % (info[0], info[2])
|
|
|
|
sdk = info[1].split('_')[0]
|
|
|
|
arch = info[1].split('_')[1]
|
|
|
|
blendfile = '%s/%s/Dockerfile' % (jobpath, jobname)
|
|
|
|
|
|
|
|
if sdk == 'arm':
|
|
|
|
board = info[1].split('_')[2]
|
|
|
|
zshcmd = 'load devuan %s %s' % (board, blendfile)
|
|
|
|
elif sdk == 'live':
|
|
|
|
zshcmd = 'load devuan %s %s' % (arch, blendfile)
|
|
|
|
elif sdk == 'vm':
|
|
|
|
zshcmd = 'load devuan %s' % (blendfile)
|
|
|
|
|
|
|
|
command = "zsh -f -c 'source sdk && %s && build_image_dist'" % zshcmd
|
|
|
|
command = html_escape(command)
|
|
|
|
|
|
|
|
replacements = [('DESC', desc),
|
|
|
|
('SDK', sdk),
|
|
|
|
('ARCH', arch),
|
|
|
|
('COMMAND', command)]
|
|
|
|
|
|
|
|
sdk_job = open('toasterbuild.xml', encoding='utf-8').read()
|
|
|
|
|
|
|
|
for i in replacements:
|
|
|
|
sdk_job = sdk_job.replace('{{{%s}}}' % i[0], i[1])
|
|
|
|
|
2018-09-26 19:13:49 +02:00
|
|
|
jarargs.append('create-job')
|
|
|
|
jarargs.append(jobname.replace('@', 'AT'))
|
2018-09-26 18:11:53 +02:00
|
|
|
|
2018-09-26 19:13:49 +02:00
|
|
|
return run(jarargs, input=sdk_job.encode())
|
2018-09-26 18:11:53 +02:00
|
|
|
|
2018-09-26 18:40:52 +02:00
|
|
|
|
|
|
|
def del_job(jobname):
|
2018-09-26 18:11:53 +02:00
|
|
|
"""
|
|
|
|
Function for deleting a Jenkins job.
|
|
|
|
"""
|
2018-09-26 19:13:49 +02:00
|
|
|
jarargs.append('delete-job')
|
|
|
|
jarargs.append(jobname.replace('@', 'AT'))
|
2018-09-26 18:40:52 +02:00
|
|
|
|
2018-09-26 19:13:49 +02:00
|
|
|
return run(jarargs)
|
2018-09-26 18:11:53 +02:00
|
|
|
|
|
|
|
|
2018-09-26 19:17:29 +02:00
|
|
|
def run_job(jobname):
|
|
|
|
"""
|
|
|
|
Function for running a Jenkins job.
|
|
|
|
"""
|
|
|
|
jarargs.append('build')
|
|
|
|
jarargs.append(jobname.replace('@', 'AT'))
|
|
|
|
|
|
|
|
return run(jarargs)
|
|
|
|
|
|
|
|
|
2018-09-26 18:11:53 +02:00
|
|
|
def main():
|
|
|
|
"""
|
|
|
|
Main routine.
|
|
|
|
"""
|
|
|
|
parser = ArgumentParser()
|
|
|
|
parser.add_argument('-a', '--add', action='store_true')
|
|
|
|
parser.add_argument('-d', '--delete', action='store_true')
|
|
|
|
parser.add_argument('-n', '--dryrun', action='store_true')
|
2018-09-26 19:17:29 +02:00
|
|
|
parser.add_argument('-r', '--run', action='store_true')
|
2018-09-26 18:11:53 +02:00
|
|
|
parser.add_argument('jobname')
|
|
|
|
# NOTE: jobname should be email-arch-date, and a predefined directory
|
|
|
|
# somewhere on the filesystem. e.g.:
|
|
|
|
# - parazyd@dyne.org-vm_amd64-198374198
|
|
|
|
# - parazyd@dyne.org-arm_armhf_raspi2-2198361991
|
|
|
|
|
|
|
|
args = parser.parse_args()
|
|
|
|
|
|
|
|
if args.add:
|
|
|
|
if args.dryrun:
|
|
|
|
print('Would add:', args.jobname)
|
|
|
|
return
|
|
|
|
print('Adding job:', args.jobname)
|
2018-09-26 18:40:52 +02:00
|
|
|
add_job(args.jobname)
|
2018-09-26 18:11:53 +02:00
|
|
|
elif args.delete:
|
|
|
|
if args.dryrun:
|
|
|
|
print('Would remove:', args.jobname)
|
|
|
|
return
|
|
|
|
print('Removing job:', args.jobname)
|
2018-09-26 18:40:52 +02:00
|
|
|
del_job(args.jobname)
|
2018-09-26 19:17:29 +02:00
|
|
|
elif args.run:
|
|
|
|
if args.dryrun:
|
|
|
|
print('Would build:', args.jobname)
|
|
|
|
return
|
|
|
|
print('Building job:', args.jobname)
|
|
|
|
run_job(args.jobname)
|
2018-09-26 18:11:53 +02:00
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
main()
|