blob: daf82ece62347108fb124d63d6ed9571ada13a39 [file] [log] [blame]
#!/usr/bin/env python
import logging
import os
from os import path
import sys
sys.path.append(path.join(path.dirname(__file__), "../../lib/python"))
logging.basicConfig(
stream=sys.stdout, level=logging.INFO, format="%(message)s")
log = logging.getLogger(__name__)
from release.info import readReleaseConfig, readBranchConfig
from util.hg import update, mercurial, make_hg_url
from util.commands import run_remote_cmd
from release.download import rsyncFilesByPattern, rsyncFiles
from release.signing import generateChecksums, signFiles
from release.paths import makeCandidatesDir
DEFAULT_BUILDBOT_CONFIGS_REPO = make_hg_url('hg.mozilla.org',
'build/buildbot-configs')
REQUIRED_BRANCH_CONFIG = ("stage_server", "stage_username", "stage_ssh_key")
REQUIRED_RELEASE_CONFIG = ("productName", "version", "buildNumber")
def validate(options, args):
if not options.configfile:
log.info("Must pass --configfile")
sys.exit(1)
releaseConfigFile = path.join("buildbot-configs", options.releaseConfig)
branchConfigFile = path.join("buildbot-configs", options.configfile)
branchConfigDir = path.dirname(branchConfigFile)
if not path.exists(branchConfigFile):
log.info("%s does not exist!" % branchConfigFile)
sys.exit(1)
releaseConfig = readReleaseConfig(releaseConfigFile,
required=REQUIRED_RELEASE_CONFIG)
sourceRepoName = releaseConfig['sourceRepositories'][
options.sourceRepoKey]['name']
branchConfig = readBranchConfig(branchConfigDir, branchConfigFile,
sourceRepoName,
required=REQUIRED_BRANCH_CONFIG)
return branchConfig, releaseConfig
if __name__ == '__main__':
from optparse import OptionParser
parser = OptionParser("")
parser.set_defaults(
buildbotConfigs=os.environ.get("BUILDBOT_CONFIGS",
DEFAULT_BUILDBOT_CONFIGS_REPO),
sourceRepoKey="mozilla",
)
parser.add_option("-c", "--configfile", dest="configfile")
parser.add_option("-r", "--release-config", dest="releaseConfig")
parser.add_option("-b", "--buildbot-configs", dest="buildbotConfigs")
parser.add_option("-t", "--release-tag", dest="releaseTag")
parser.add_option("--source-repo-key", dest="sourceRepoKey")
parser.add_option("--product", dest="product")
parser.add_option("--ssh-user", dest="ssh_username")
parser.add_option("--ssh-key", dest="ssh_key")
parser.add_option("--create-contrib-dirs", dest="create_contrib_dirs",
action="store_true")
options, args = parser.parse_args()
mercurial(options.buildbotConfigs, "buildbot-configs")
update("buildbot-configs", revision=options.releaseTag)
branchConfig, releaseConfig = validate(options, args)
productName = options.product or releaseConfig['productName']
version = releaseConfig['version']
buildNumber = releaseConfig['buildNumber']
stageServer = branchConfig['stage_server']
stageUsername = options.ssh_username or branchConfig['stage_username']
stageSshKey = options.ssh_key or branchConfig["stage_ssh_key"]
stageSshKey = path.join(os.path.expanduser("~"), ".ssh", stageSshKey)
candidatesDir = makeCandidatesDir(productName, version, buildNumber)
rsyncFilesByPattern(server=stageServer, userName=stageUsername,
sshKey=stageSshKey, source_dir=candidatesDir,
target_dir='temp/', pattern='*.checksums')
types = {'sha1': 'SHA1SUMS', 'md5': 'MD5SUMS', 'sha512': 'SHA512SUMS'}
generateChecksums('temp', types)
files = types.values()
signFiles(files)
upload_files = files + ['%s.asc' % x for x in files] + \
[path.join(path.dirname(__file__), 'KEY')]
log.info("Fixing permissions...")
for f in upload_files:
log.info("chmod 644 %s" % f)
os.chmod(f, 0644)
rsyncFiles(files=upload_files, server=stageServer, userName=stageUsername,
sshKey=stageSshKey, target_dir=candidatesDir)
if options.create_contrib_dirs:
cmd = 'mkdir -v -m 2775 %s/contrib %s/contrib-localized' % \
(candidatesDir, candidatesDir)
run_remote_cmd(cmd, server=stageServer, username=stageUsername,
sshKey=stageSshKey)