toaster.do/jenkins_backend/sync_jobs.py

109 lines
2.8 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
"""
Module for backend talk with Jenkins executed by the web/CGI
"""
from argparse import ArgumentParser
from subprocess import run
import html
from config import (jarargs, jobpath)
def add_job(jobname):
"""
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])
jarargs.append('create-job')
jarargs.append(jobname.replace('@', 'AT'))
return run(jarargs, input=sdk_job.encode())
def del_job(jobname):
"""
Function for deleting a Jenkins job.
"""
jarargs.append('delete-job')
jarargs.append(jobname.replace('@', 'AT'))
return run(jarargs)
def run_job(jobname):
"""
Function for running a Jenkins job.
"""
jarargs.append('build')
jarargs.append(jobname.replace('@', 'AT'))
return run(jarargs)
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')
parser.add_argument('-r', '--run', action='store_true')
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)
add_job(args.jobname)
elif args.delete:
if args.dryrun:
print('Would remove:', args.jobname)
return
print('Removing job:', args.jobname)
del_job(args.jobname)
elif args.run:
if args.dryrun:
print('Would build:', args.jobname)
return
print('Building job:', args.jobname)
run_job(args.jobname)
if __name__ == '__main__':
main()