2016-11-29 20:37:39 +00:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
|
|
|
|
|
|
|
|
###############################################################################
|
|
|
|
# OpenLP - Open Source Lyrics Projection #
|
|
|
|
# --------------------------------------------------------------------------- #
|
2017-12-29 09:15:48 +00:00
|
|
|
# Copyright (c) 2008-2018 OpenLP Developers #
|
2016-11-29 20:37:39 +00:00
|
|
|
# --------------------------------------------------------------------------- #
|
|
|
|
# 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; version 2 of the License. #
|
|
|
|
# #
|
|
|
|
# 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, write to the Free Software Foundation, Inc., 59 #
|
|
|
|
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
|
|
|
|
###############################################################################
|
|
|
|
|
2016-11-30 20:54:06 +00:00
|
|
|
"""
|
|
|
|
This script is used to trigger a build at appveyor. Since the code is not hosted
|
|
|
|
on github the normal triggering mechanisms can't be use. The project is
|
|
|
|
registered as subversion repository. A webhook is used to trigger new builds.
|
|
|
|
The appveyor.yml used for the build is send to appveyor when calling the hook.
|
|
|
|
"""
|
2016-11-29 20:37:39 +00:00
|
|
|
import datetime
|
2018-10-02 04:39:42 +00:00
|
|
|
import json
|
2016-11-29 20:37:39 +00:00
|
|
|
import sys
|
2016-11-30 20:54:06 +00:00
|
|
|
import time
|
2018-10-02 04:39:42 +00:00
|
|
|
import urllib
|
|
|
|
import urllib.request
|
|
|
|
from subprocess import PIPE, Popen
|
|
|
|
|
2016-11-29 20:37:39 +00:00
|
|
|
|
2017-03-22 21:35:55 +00:00
|
|
|
appveyor_build_url = 'https://ci.appveyor.com/project/OpenLP/{project}/build'
|
|
|
|
appveyor_api_url = 'https://ci.appveyor.com/api/projects/OpenLP/{project}'
|
2017-05-03 20:16:52 +00:00
|
|
|
appveyor_log_url = 'https://ci.appveyor.com/api/buildjobs/{buildid}/log'
|
2016-11-29 20:37:39 +00:00
|
|
|
|
|
|
|
webhook_element = \
|
2016-11-30 20:54:06 +00:00
|
|
|
{
|
|
|
|
'commit': {
|
|
|
|
'author': {
|
2016-12-15 16:33:03 +00:00
|
|
|
'email': 'contributer@openlp',
|
2016-11-30 20:54:06 +00:00
|
|
|
'name': 'OpenLP Contributor'
|
|
|
|
},
|
|
|
|
'id': None,
|
|
|
|
'message': None,
|
|
|
|
'timestamp': datetime.datetime.now().isoformat()
|
2016-11-29 20:37:39 +00:00
|
|
|
},
|
2016-11-30 20:54:06 +00:00
|
|
|
'config': None,
|
|
|
|
'repository': {
|
|
|
|
'name': 'repo_name',
|
|
|
|
'url': 'repo_url'
|
|
|
|
}
|
2016-11-29 20:37:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
def get_version():
|
|
|
|
"""
|
|
|
|
Get the version of the branch.
|
|
|
|
"""
|
|
|
|
bzr = Popen(('bzr', 'tags'), stdout=PIPE)
|
|
|
|
output = bzr.communicate()[0]
|
|
|
|
code = bzr.wait()
|
|
|
|
if code != 0:
|
|
|
|
raise Exception('Error running bzr tags')
|
|
|
|
lines = output.splitlines()
|
|
|
|
if len(lines) == 0:
|
|
|
|
tag = '0.0.0'
|
|
|
|
revision = '0'
|
|
|
|
else:
|
|
|
|
tag, revision = lines[-1].decode('utf-8').split()
|
|
|
|
bzr = Popen(('bzr', 'log', '--line', '-r', '-1'), stdout=PIPE)
|
|
|
|
output, error = bzr.communicate()
|
|
|
|
code = bzr.wait()
|
|
|
|
if code != 0:
|
|
|
|
raise Exception('Error running bzr log')
|
|
|
|
latest = output.decode('utf-8').split(':')[0]
|
2016-11-29 21:08:32 +00:00
|
|
|
version_string = latest == revision and tag or 'r%s' % latest
|
2016-11-29 20:37:39 +00:00
|
|
|
# Save decimal version in case we need to do a portable build.
|
2018-07-16 20:01:47 +00:00
|
|
|
version = latest == revision and tag or '%s-bzr%s' % (tag, latest)
|
2016-11-29 20:37:39 +00:00
|
|
|
return version_string, version
|
|
|
|
|
|
|
|
|
2017-05-03 20:16:52 +00:00
|
|
|
def get_yml(branch, build_type):
|
2016-11-30 20:54:06 +00:00
|
|
|
"""
|
|
|
|
Returns the content of appveyor.yml and inserts the branch to be build
|
|
|
|
"""
|
2016-11-29 20:37:39 +00:00
|
|
|
f = open('appveyor.yml')
|
|
|
|
yml_text = f.read()
|
|
|
|
f.close()
|
2018-07-14 19:56:11 +00:00
|
|
|
version_string, version = get_version()
|
2018-07-16 20:01:47 +00:00
|
|
|
yml_text = yml_text.replace('TAG', version)
|
2017-05-03 20:16:52 +00:00
|
|
|
if build_type in ['openlp', 'trunk']:
|
2018-07-14 19:56:11 +00:00
|
|
|
yml_text = yml_text.replace('BRANCHPATH', '~openlp-core/openlp/trunk')
|
2016-12-15 16:33:03 +00:00
|
|
|
yml_text = yml_text.replace('BUILD_DOCS', '$TRUE')
|
|
|
|
else:
|
2018-07-14 19:56:11 +00:00
|
|
|
yml_text = yml_text.replace('BRANCHPATH', branch.split(':')[1])
|
2016-12-15 16:33:03 +00:00
|
|
|
yml_text = yml_text.replace('BUILD_DOCS', '$FALSE')
|
2018-07-14 19:56:11 +00:00
|
|
|
return yml_text, version_string
|
2016-11-29 20:37:39 +00:00
|
|
|
|
|
|
|
|
2018-07-14 19:56:11 +00:00
|
|
|
def hook(webhook_url, branch, build_type):
|
2016-11-30 20:54:06 +00:00
|
|
|
"""
|
|
|
|
Activate the webhook to start the build
|
|
|
|
"""
|
2018-07-14 19:56:11 +00:00
|
|
|
yml, version_string = get_yml(branch, build_type)
|
2016-11-30 20:54:06 +00:00
|
|
|
webhook_element['config'] = yml
|
2016-11-29 20:37:39 +00:00
|
|
|
webhook_element['commit']['message'] = 'Building ' + branch
|
|
|
|
webhook_element['commit']['id'] = version_string
|
|
|
|
request = urllib.request.Request(webhook_url)
|
2016-11-29 21:08:32 +00:00
|
|
|
request.add_header('Content-Type', 'application/json;charset=utf-8')
|
2016-11-29 20:37:39 +00:00
|
|
|
responce = urllib.request.urlopen(request, json.dumps(webhook_element).encode('utf-8'))
|
2016-11-30 20:54:06 +00:00
|
|
|
if responce.getcode() != 204:
|
|
|
|
print('An error happened when calling the webhook! Return code: %d' % responce.getcode())
|
|
|
|
print(responce.read().decode('utf-8'))
|
|
|
|
|
|
|
|
|
2017-05-03 20:16:52 +00:00
|
|
|
def get_appveyor_build_url(build_type):
|
2016-11-30 20:54:06 +00:00
|
|
|
"""
|
|
|
|
Get the url of the build.
|
|
|
|
"""
|
2017-05-03 20:16:52 +00:00
|
|
|
responce = urllib.request.urlopen(appveyor_api_url.format(project=build_type))
|
2016-11-30 20:54:06 +00:00
|
|
|
json_str = responce.read().decode('utf-8')
|
|
|
|
build_json = json.loads(json_str)
|
2017-05-03 20:16:52 +00:00
|
|
|
build_url = '%s/%s' % (appveyor_build_url.format(project=build_type), build_json['build']['version'])
|
|
|
|
print(build_url.format(project=build_type))
|
|
|
|
print(appveyor_log_url.format(buildid=build_json['build']['jobs'][0]['jobId']))
|
2016-11-29 20:37:39 +00:00
|
|
|
|
|
|
|
|
2017-05-03 18:40:30 +00:00
|
|
|
if len(sys.argv) != 4:
|
2017-05-03 20:16:52 +00:00
|
|
|
print('Invalid number of arguments\nUsage: %s <webhook-url> <branch> <dev|trunk|openlp>' % sys.argv[0])
|
2016-11-30 20:54:06 +00:00
|
|
|
else:
|
|
|
|
webhook_url = sys.argv[1]
|
|
|
|
branch = sys.argv[2]
|
2017-05-03 20:16:52 +00:00
|
|
|
build_type = sys.argv[3]
|
|
|
|
if build_type not in ['dev', 'trunk', 'openlp']:
|
|
|
|
print('Invalid build type\nUsage: %s <webhook-url> <branch> <dev|trunk|openlp>' % sys.argv[0])
|
|
|
|
exit()
|
2018-07-14 19:56:11 +00:00
|
|
|
hook(webhook_url, branch, build_type)
|
2016-12-15 16:33:03 +00:00
|
|
|
# Wait 5 seconds to make sure the hook has been triggered
|
|
|
|
time.sleep(5)
|
2017-05-03 20:16:52 +00:00
|
|
|
get_appveyor_build_url(build_type)
|