blob: f0d6ad727dc36d469bc36b2d36afed44cd4c74d6 [file] [log] [blame]
#!/usr/bin/env python
try:
import simplejson as json
except ImportError:
import json
import os
from os import path
import re
import logging
import sys
# Use explicit version of python-requests
sys.path.insert(0, path.join(path.dirname(__file__),
"../../lib/python/vendor/requests-2.7.0"))
sys.path.insert(0, path.join(path.dirname(__file__), "../../lib/python"))
from balrog.submitter.cli import ReleaseCreatorV3, ReleaseCreatorV4, \
ReleasePusher
from release.info import readReleaseConfig
from util.retry import retry
from util.hg import mercurial, make_hg_url
HG = "hg.mozilla.org"
DEFAULT_BUILDBOT_CONFIGS_REPO = make_hg_url(HG, 'build/buildbot-configs')
REQUIRED_CONFIG = ('appVersion', 'productName', 'version', 'enUSPlatforms',
'baseTag', 'updateChannels', 'buildNumber', 'partialUpdates',
'stagingServer', 'bouncerServer')
def validate(options):
err = False
config = {}
if not path.exists(path.join('buildbot-configs', options.release_config)):
print "%s does not exist!" % options.release_config
sys.exit(1)
config = readReleaseConfig(path.join('buildbot-configs',
options.release_config))
for key in REQUIRED_CONFIG:
if key not in config:
err = True
print "Required item missing in config: %s" % key
if err:
sys.exit(1)
return config
if __name__ == '__main__':
from optparse import OptionParser
parser = OptionParser()
parser.add_option("-p", "--build-properties", dest="build_properties")
parser.add_option("-b", "--buildbot-configs", dest="buildbot_configs",
help="The place to clone buildbot-configs from",
default=os.environ.get('BUILDBOT_CONFIGS_REPO',
DEFAULT_BUILDBOT_CONFIGS_REPO))
parser.add_option("-r", "--release-config", dest="release_config")
parser.add_option("-a", "--api-root", dest="api_root")
parser.add_option("-c", "--credentials-file", dest="credentials_file")
parser.add_option("-s", "--schema", dest="schema_version",
help="blob schema version", type="int", default=4)
parser.add_option("-u", "--username", dest="username")
parser.add_option("-C", "--release-channel", dest="release_channel")
parser.add_option("-v", "--verbose", dest="verbose", action="store_true")
options, args = parser.parse_args()
logging_level = logging.INFO
if options.verbose:
logging_level = logging.DEBUG
logging.basicConfig(stream=sys.stdout, level=logging_level,
format="%(message)s")
for opt in ('build_properties', 'release_config', 'api_root', 'credentials_file', 'buildbot_configs', 'username', 'release_channel'):
if not getattr(options, opt):
print >>sys.stderr, "Required option %s not present" % opt
sys.exit(1)
if options.schema_version not in (3,4):
parser.error("Only schema_versions 3 & 4 supported.")
release_channel = options.release_channel
properties = json.load(open(options.build_properties))['properties']
releaseTag = properties['script_repo_revision']
hashType = properties['hashType']
retry(mercurial, args=(options.buildbot_configs, 'buildbot-configs'), kwargs=dict(revision=releaseTag))
release_config = validate(options)
channelInfo = release_config["updateChannels"][release_channel]
credentials = {}
execfile(options.credentials_file, credentials)
auth = (options.username, credentials['balrog_credentials'][options.username])
updateChannels = [
release_channel,
channelInfo['localTestChannel'],
channelInfo['cdnTestChannel']
]
if options.schema_version == 3:
creator = ReleaseCreatorV3(options.api_root, auth)
else:
creator= ReleaseCreatorV4(options.api_root, auth)
partials = {}
for v in release_config['partialUpdates']:
if re.match(channelInfo.get("versionRegex", "^.*$"), v):
partials[v] = release_config["partialUpdates"][v]
creator.run(release_config['appVersion'], release_config['productName'].capitalize(),
release_config['version'], release_config['buildNumber'],
updateChannels, release_config['stagingServer'],
release_config['bouncerServer'], release_config['enUSPlatforms'],
hashType, openURL=release_config.get('openURL'),
partialUpdates=partials,
requiresMirrors=channelInfo.get("requiresMirrors", True))
testChannelRuleIds = []
for c in channelInfo["testChannels"].values():
testChannelRuleIds.append(c["ruleId"])
pusher = ReleasePusher(options.api_root, auth)
pusher.run(release_config['productName'].capitalize(), release_config['version'],
release_config['buildNumber'], testChannelRuleIds)