#!/usr/bin/env python # ***** BEGIN LICENSE BLOCK ***** # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this file, # You can obtain one at http://mozilla.org/MPL/2.0/. # ***** END LICENSE BLOCK ***** """desktop_partner_repacks.py This script manages Desktop partner repacks for beta/release builds. """ from __future__ import absolute_import import os import sys # load modules from parent dir sys.path.insert(1, os.path.dirname(sys.path[0])) from mozharness.base.script import BaseScript from mozharness.mozilla.automation import AutomationMixin from mozharness.mozilla.secrets import SecretsMixin from mozharness.base.python import VirtualenvMixin from mozharness.base.log import FATAL # DesktopPartnerRepacks {{{1 class DesktopPartnerRepacks(AutomationMixin, BaseScript, VirtualenvMixin, SecretsMixin): """Manages desktop partner repacks""" actions = [ "get-secrets", "setup", "repack", "summary", ] config_options = [ [ ["--version", "-v"], { "dest": "version", "help": "Version of Firefox to repack", }, ], [ ["--build-number", "-n"], { "dest": "build_number", "help": "Build number of Firefox to repack", }, ], [ ["--platform"], { "dest": "platform", "help": "Platform to repack (e.g. linux64, macosx64, ...)", }, ], [ ["--partner", "-p"], { "dest": "partner", "help": "Limit repackaging to partners matching this string", }, ], [ ["--taskid", "-t"], { "dest": "taskIds", "action": "extend", "help": "taskId(s) of upstream tasks for vanilla Firefox artifacts", }, ], [ ["--limit-locale", "-l"], { "dest": "limitLocales", "action": "append", }, ], ] def __init__(self): # fxbuild style: buildscript_kwargs = { "all_actions": DesktopPartnerRepacks.actions, "default_actions": DesktopPartnerRepacks.actions, "config": { "log_name": "partner-repacks", "hashType": "sha512", "workdir": "partner-repacks", }, } # BaseScript.__init__( self, config_options=self.config_options, **buildscript_kwargs ) def _pre_config_lock(self, rw_config): if os.getenv("REPACK_MANIFESTS_URL"): self.info( "Overriding repack_manifests_url to %s" % os.getenv("REPACK_MANIFESTS_URL") ) self.config["repack_manifests_url"] = os.getenv("REPACK_MANIFESTS_URL") if os.getenv("UPSTREAM_TASKIDS"): self.info("Overriding taskIds with %s" % os.getenv("UPSTREAM_TASKIDS")) self.config["taskIds"] = os.getenv("UPSTREAM_TASKIDS").split() if "version" not in self.config: self.fatal("Version (-v) not supplied.") if "build_number" not in self.config: self.fatal("Build number (-n) not supplied.") if "repo_file" not in self.config: self.fatal("repo_file not supplied.") if "repack_manifests_url" not in self.config: self.fatal( "repack_manifests_url not supplied in config or via REPACK_MANIFESTS_URL" ) if "taskIds" not in self.config: self.fatal("Need upstream taskIds from command line or in UPSTREAM_TASKIDS") def query_abs_dirs(self): if self.abs_dirs: return self.abs_dirs abs_dirs = super(DesktopPartnerRepacks, self).query_abs_dirs() for directory in abs_dirs: value = abs_dirs[directory] abs_dirs[directory] = value dirs = {} dirs["abs_repo_dir"] = os.path.join(abs_dirs["abs_work_dir"], ".repo") dirs["abs_partners_dir"] = os.path.join(abs_dirs["abs_work_dir"], "partners") for key in dirs.keys(): if key not in abs_dirs: abs_dirs[key] = dirs[key] self.abs_dirs = abs_dirs return self.abs_dirs # Actions {{{ def _repo_cleanup(self): self.rmtree(self.query_abs_dirs()["abs_repo_dir"]) self.rmtree(self.query_abs_dirs()["abs_partners_dir"]) def _repo_init(self, repo): partial_env = { "GIT_SSH_COMMAND": "ssh -oIdentityFile={}".format(self.config["ssh_key"]) } status = self.run_command( [ repo, "init", "--no-repo-verify", "-u", self.config["repack_manifests_url"], ], cwd=self.query_abs_dirs()["abs_work_dir"], partial_env=partial_env, ) if status: return status return self.run_command( [repo, "sync", "--current-branch", "--no-tags"], cwd=self.query_abs_dirs()["abs_work_dir"], partial_env=partial_env, ) def setup(self): """setup step""" repo = self.download_file( self.config["repo_file"], file_name="repo", parent_dir=self.query_abs_dirs()["abs_work_dir"], error_level=FATAL, ) if not os.path.exists(repo): self.fatal("Unable to download repo tool.") self.chmod(repo, 0o755) self.retry( self._repo_init, args=(repo,), error_level=FATAL, cleanup=self._repo_cleanup(), good_statuses=[0], sleeptime=5, ) def repack(self): """creates the repacks""" repack_cmd = [ "./mach", "python", "python/mozrelease/mozrelease/partner_repack.py", "-v", self.config["version"], "-n", str(self.config["build_number"]), ] if self.config.get("platform"): repack_cmd.extend(["--platform", self.config["platform"]]) if self.config.get("partner"): repack_cmd.extend(["--partner", self.config["partner"]]) if self.config.get("taskIds"): for taskId in self.config["taskIds"]: repack_cmd.extend(["--taskid", taskId]) if self.config.get("limitLocales"): for locale in self.config["limitLocales"]: repack_cmd.extend(["--limit-locale", locale]) self.run_command(repack_cmd, cwd=os.environ["GECKO_PATH"], halt_on_failure=True) # main {{{ if __name__ == "__main__": partner_repacks = DesktopPartnerRepacks() partner_repacks.run_and_exit()