#!/usr/bin/env python2.7 # This script provides an interface for sandboxed code to trigger buildbot # using plain HTTP from bottle import post, request, run, HTTPResponse LOGFILE = '../orch.log' DEFINITIONS = 'ssh://git@cu010-trove.codethink.com/baserock/baserock/definitions' TEST_REPO = 'ssh://git@cu010-trove.codethink.com/cu010-trove/br6/ciat-tester' trigger_names = [ 'repo_update', 'definitions_update', 'build_complete', 'deploy_complete'] log_file = open(LOGFILE,'a') def log(msg): ''' write message to log file with timestamp and script name ''' import datetime global log_file dt = str(datetime.datetime.now()).split('.')[0] to_log = "[%s] Bottlerock: %s" % (dt, msg) print to_log log_file.write('%s\n' % to_log) def call_trigger(trigger_name,*args): global trigger_names assert trigger_name in trigger_names import subprocess log('%s trigger' % trigger_name) trigger_cmd = ['sh','../source/%s.sh' % trigger_name] for arg in args: trigger_cmd.append(arg) if subprocess.call(trigger_cmd): return HTTPResponse(status=500) else: return 0 @post('/repo_update') def repo_update(): repo_name = request.forms.get("repo_name") if not repo_name: return HTTPResponse( status=400, body="400: A repo_name is required") elif repo_name == DEFINITIONS: return call_trigger('definitions_update') elif repo_name == TEST_REPO: return call_trigger('definitions_update',"force") else: return call_trigger('repo_update',repo_name) @post('/force_build') def force_build(): return call_trigger('definitions_update',"force") @post('/build_complete') def build_complete(): system = request.forms.get("system") if not system: return HTTPResponse( status=400, body="400: A system name is required") buildslave_scripts_sha = request.forms.get("buildslave_scripts_sha") if not buildslave_scripts_sha: return HTTPResponse( status=400, body="400: A buildslave_scripts_sha is required") definitions_sha = request.forms.get("definitions_sha") if not definitions_sha: return HTTPResponse( status=400, body="400: A definitions_sha is required") testing_sha = request.forms.get("testing_sha") if not testing_sha: return HTTPResponse( status=400, body="400: A testing_sha is required") return call_trigger('build_complete',system,buildslave_scripts_sha,definitions_sha,testing_sha) @post('/deploy_complete') def deploy_complete(): artefact = request.forms.get("artefact") if not artefact: return HTTPResponse( status=400, body="400: An artefact name is required") return call_trigger('deploy_complete',artefact) if __name__ == '__main__': run(host='0.0.0.0', port=8080, debug=True)