Bug 1118798 - Downstream job to create partner repacks, r=bhearsum
authorNick Thomas <nthomas@mozilla.com>
Thu, 02 Apr 2015 15:03:26 +1300 (2015-04-02)
changeset 4170 a4247fb4c8343fe3560aed6200766255a3b6d36d
parent 4167 adf6052198a4c248c8a7b05bf4e64a57df8ee48d
child 4171 d315c92d5ce335ffb577f6dc86eac9860fe77ce3
push id3474
push usernthomas@mozilla.com
push dateThu, 02 Apr 2015 02:03:40 +0000 (2015-04-02)
reviewersbhearsum
bugs1118798
Bug 1118798 - Downstream job to create partner repacks, r=bhearsum
misc.py
process/factory.py
--- a/misc.py
+++ b/misc.py
@@ -44,17 +44,18 @@ reload(buildbotcustom.status.generators)
 reload(buildbotcustom.misc_scheduler)
 reload(build.paths)
 reload(mozilla_buildtools.queuedir)
 
 from buildbotcustom.common import normalizeName
 from buildbotcustom.changes.hgpoller import HgPoller, HgAllLocalesPoller
 from buildbotcustom.process.factory import NightlyBuildFactory, \
     NightlyRepackFactory, UnittestPackagedBuildFactory, \
-    TryBuildFactory, ScriptFactory, SigningScriptFactory, rc_eval_func
+    TryBuildFactory, ScriptFactory, SigningScriptFactory, rc_eval_func, \
+    PartnerRepackFactory
 from buildbotcustom.scheduler import BuilderChooserScheduler, \
     PersistentScheduler, makePropertiesScheduler, SpecificNightly, EveryNthScheduler
 from buildbotcustom.l10n import TriggerableL10n
 from buildbotcustom.status.mail import MercurialEmailLookup, ChangeNotifier
 from buildbotcustom.status.generators import buildTryChangeMessage
 from buildbotcustom.env import MozillaEnvironments
 from buildbotcustom.misc_scheduler import tryChooser, buildIDSchedFunc, \
     buildUIDSchedFunc, lastGoodFunc, lastRevFunc
@@ -3402,49 +3403,88 @@ def generateReleasePromotionObjects(conf
         'builders': builders,
         'schedulers': schedulers,
         'status': status,
         'change_source': change_sources,
     }
 
     topLevelBuilders = []
     pf_linux64 = config['platforms']['linux64']
+    pf_macosx64 = config['platforms']['macosx64']
     signing_servers = secrets.get(pf_linux64.get('dep_signing_servers'))
 
     # source builder
     source_buildername = '%s_source' % name
     source_factory = makeMHFactory(config, pf_linux64,
             mh_cfg=pf_linux64['mozharness_desktop_build'],
             extra_args=pf_linux64['mozharness_desktop_build'].get('extra_args', []) + \
                        ['--custom-build-variant-cfg', 'source'],
             signingServers=signing_servers)
 
     source_builder = {
         'name': source_buildername,
         'factory': source_factory,
         'builddir': source_buildername,
+        'slavebuilddir': normalizeName(source_buildername, config['product_name']),
         'slavenames': pf_linux64['slaves'],
         'category': name,
         'properties': {
             'branch': name,
             'platform': 'source',
-            'product': pf_linux64['stage_product'],
+            'product': config['product_name'],
             'repo_path': config['repo_path'],
             'script_repo_revision': config["mozharness_tag"],
         },
     }
     topLevelBuilders.append(source_buildername)
     builders.append(source_builder)
 
-    # To add short-term: partner-repack
-    # Longer-term: l10n repacks, funsize partials, antivirus, checksums etc
+    # partner repacks
+    base_partner_repack_params = dict(
+        hgHost=config['hghost'],
+        repoPath=config['repo_path'],
+        buildToolsRepoPath=config['build_tools_repo_path'],
+        productName=config['product_name'],
+        partnersRepoPath=config['partners_repo_path'],
+        partnersRepoRevision='default',
+        stagingServer=config['stage_server'],
+        stageUsername=config['stage_username'],
+        stageSshKey=config['stage_ssh_key'],
+        signingServers=signing_servers,
+        env=pf_macosx64['env'],
+        nightlyDir=None,
+        releasePromotion=True,
+    )
+    for platform in config['partner_repack_platforms']:
+        partner_repack_params = base_partner_repack_params.copy()
+        partner_repack_params['platformList'] = [platform]
+        partner_repack_factory = PartnerRepackFactory(**partner_repack_params)
+
+        partner_buildername = '%s_%s_partner_repack' % (name, platform)
+        builders.append({
+           'name': partner_buildername,
+           'slavenames': pf_macosx64['slaves'],
+           'category': name,
+           'builddir': partner_buildername,
+           'slavebuilddir': normalizeName(partner_buildername, config['product_name']),
+           'factory': partner_repack_factory,
+           'properties': {
+               'slavebuilddir': normalizeName(partner_buildername, config['product_name']),
+               'branch': name,
+               'platform': platform,
+               'product': config['product_name'],
+            }
+        })
+        topLevelBuilders.append(partner_buildername)
+
+    # To add longer-term: l10n repacks, funsize partials, antivirus, checksums etc
 
     # sendchange listener
     starting_scheduler = Scheduler(
         name='%s_start_promotion' % name,
-        branch='%s-build-promotion' % name,
+        branch='%s-release-promotion' % name,
         treeStableTimer=None,
         builderNames=topLevelBuilders,
     )
     schedulers.append(starting_scheduler)
 
     return buildObjects
 
--- a/process/factory.py
+++ b/process/factory.py
@@ -1,8 +1,9 @@
+
 from __future__ import absolute_import
 
 import os.path
 import re
 import random
 from distutils.version import LooseVersion
 
 from twisted.python import log
@@ -4625,41 +4626,46 @@ class UnittestPackagedBuildFactory(Mozil
 
 
 class PartnerRepackFactory(ReleaseFactory):
     def getReleaseTag(self, product, version):
         return product.upper() + '_' + \
             str(version).replace('.', '_') + '_' + \
             'RELEASE'
 
-    def __init__(self, productName, version, partnersRepoPath,
+    def __init__(self, productName, partnersRepoPath,
                  stagingServer, stageUsername, stageSshKey,
-                 buildNumber=1, partnersRepoRevision='default',
+                 version=None, buildNumber=1, partnersRepoRevision='default',
                  nightlyDir="nightly", platformList=None, packageDmg=True,
                  partnerUploadDir='unsigned/partner-repacks',
-                 baseWorkDir='.', python='python', **kwargs):
+                 baseWorkDir='.', python='python', releasePromotion=False,
+                 **kwargs):
         ReleaseFactory.__init__(self, baseWorkDir=baseWorkDir, **kwargs)
         self.productName = productName
         self.version = version
         self.buildNumber = buildNumber
         self.partnersRepoPath = partnersRepoPath
         self.partnersRepoRevision = partnersRepoRevision
         self.stagingServer = stagingServer
         self.stageUsername = stageUsername
         self.stageSshKey = stageSshKey
         self.partnersRepackDir = '%s/partner-repacks' % self.baseWorkDir
         self.partnerUploadDir = partnerUploadDir
         self.packageDmg = packageDmg
         self.python = python
         self.platformList = platformList
-        self.candidatesDir = self.getCandidatesDir(productName,
-                                                   version,
-                                                   buildNumber,
-                                                   nightlyDir=nightlyDir)
-        self.releaseTag = self.getReleaseTag(productName, version)
+        self.releasePromotion = releasePromotion
+
+        if not self.releasePromotion:
+            self.candidatesDir = self.getCandidatesDir(productName,
+                                                       version,
+                                                       buildNumber,
+                                                       nightlyDir=nightlyDir)
+            self.releaseTag = self.getReleaseTag(productName, version)
+
         self.extraRepackArgs = []
         if nightlyDir:
             self.extraRepackArgs.extend(['--nightly-dir', '%s/%s' %
                                         (productName, nightlyDir)])
         if self.packageDmg:
             self.extraRepackArgs.extend(['--pkg-dmg',
                                         WithProperties('%(scriptsdir)s/pkg-dmg')])
         if platformList:
@@ -4683,20 +4689,26 @@ class PartnerRepackFactory(ReleaseFactor
             repo_url='https://%s/%s' % (self.hgHost, self.partnersRepoPath),
             wc=self.partnersRepackDir,
             workdir=self.baseWorkDir,
             rev=self.partnersRepoRevision,
             env=self.env,
             use_properties=False,
         ))
         if self.packageDmg:
+            if self.releasePromotion:
+                command=['bash', '-c',
+                         WithProperties('wget https://hg.mozilla.org/' + self.repoPath +
+                                        '/raw-file/%(revision)s/build/package/mac_osx/pkg-dmg')]
+            else:
+                command=['bash', '-c',
+                         'wget https://hg.mozilla.org/%s/raw-file/%s/build/package/mac_osx/pkg-dmg' % (self.repoPath, self.releaseTag)]
             self.addStep(ShellCommand(
                 name='download_pkg-dmg',
-                command=['bash', '-c',
-                         'wget https://hg.mozilla.org/%s/raw-file/%s/build/package/mac_osx/pkg-dmg' % (self.repoPath, self.releaseTag)],
+                command=command,
                 description=['download', 'pkg-dmg'],
                 workdir='%s/scripts' % self.partnersRepackDir,
                 haltOnFailure=True
             ))
             self.addStep(ShellCommand(
                 name='chmod_pkg-dmg',
                 command=['chmod', '755', 'pkg-dmg'],
                 description=['chmod', 'pkg-dmg'],
@@ -4704,85 +4716,88 @@ class PartnerRepackFactory(ReleaseFactor
                 haltOnFailure=True
             ))
             self.addStep(SetProperty(
                 name='set_scriptsdir',
                 command=['bash', '-c', 'pwd'],
                 property='scriptsdir',
                 workdir='%s/scripts' % self.partnersRepackDir,
             ))
+            if self.releasePromotion:
+                self.addStep(SetProperty(
+                    name='set_version',
+                    command=['wget', '-q', '-O-',
+                              WithProperties('https://hg.mozilla.org/' + self.repoPath +
+                                             '/raw-file/%(revision)s/browser/' +
+                                             'config/version.txt')],
+                    property='version',
+                    workdir='%s/scripts' % self.partnersRepackDir,
+                ))
 
     def doPartnerRepacks(self):
         if self.enableSigning and self.signingServers:
-            self.extraRepackArgs.append('--signed')
             self.addGetTokenSteps()
         pr_env = self.env.copy()
         pr_env['PYTHONPATH'] = WithProperties('%(toolsdir)s/lib/python')
+        command=[self.python, './partner-repacks.py',
+                 '--repo', self.repoPath,
+                 '--hgroot', 'https://%s' % self.hgHost,
+                 '--dmg-extract-script',
+                 WithProperties(
+                     '%(toolsdir)s/release/common/unpack-diskimage.sh'),
+                ]
+        if self.releasePromotion:
+            command.extend(['--use-tinderbox-builds',
+                            '--revision', WithProperties('%(revision)s')])
+        else:
+            command.extend(['--version', str(self.version),
+                            '--build-number', str(self.buildNumber),
+                            '--staging-server', self.stagingServer])
+
         self.addStep(RepackPartners(
             name='repack_partner_builds',
-            command=[self.python, './partner-repacks.py',
-                     '--version', str(self.version),
-                     '--build-number', str(self.buildNumber),
-                     '--repo', self.repoPath,
-                     '--hgroot', 'https://%s' % self.hgHost,
-                     '--staging-server', self.stagingServer,
-                     '--dmg-extract-script',
-                     WithProperties(
-                         '%(toolsdir)s/release/common/unpack-diskimage.sh'),
-                     ] + self.extraRepackArgs,
+            command=command + self.extraRepackArgs,
             env=pr_env,
             description=['repacking', 'partner', 'builds'],
             descriptionDone=['repacked', 'partner', 'builds'],
             workdir='%s/scripts' % self.partnersRepackDir,
             haltOnFailure=True
         ))
 
     def uploadPartnerRepacks(self):
-        self.addStep(ShellCommand(
-                     name='upload_partner_builds',
-                     command=['rsync', '-av',
-                              '-e', 'ssh -oIdentityFile=~/.ssh/%s' % self.stageSshKey,
-                              'build%s/' % str(self.buildNumber),
-                              '%s@%s:%s/' % (self.stageUsername,
-                                             self.stagingServer,
-                                             self.candidatesDir)
-                              ],
-                     workdir='%s/scripts/repacked_builds/%s' % (self.partnersRepackDir,
-                                                                self.version),
-                     description=['upload', 'partner', 'builds'],
-                     haltOnFailure=True
-                     ))
-
-        if not self.enableSigning or not self.signingServers:
-            for platform in self.platformList:
-                self.addStep(ShellCommand(
-                             name='create_partner_build_directory',
-                             description=['create', 'partner', 'directory'],
-                             command=['bash', '-c',
-                                      'ssh -oIdentityFile=~/.ssh/%s %s@%s mkdir -p %s/%s/'
-                                      % (self.stageSshKey, self.stageUsername,
-                                         self.stagingServer, self.candidatesDir,
-                                         self.partnerUploadDir),
-                                      ],
-                             workdir='.',
-                             ))
-                self.addStep(ShellCommand(
-                             name='upload_partner_build_status',
-                             command=['bash', '-c',
-                                      'ssh -oIdentityFile=~/.ssh/%s %s@%s touch %s/%s/%s'
-                                      % (self.stageSshKey, self.stageUsername,
-                                         self.stagingServer, self.candidatesDir,
-                                         self.partnerUploadDir, 'partner_build_%s' % platform),
-                                      ],
-                             workdir='%s/scripts/repacked_builds/%s/build%s' % (self.partnersRepackDir,
-                                                                                self.version,
-                                                                                str(self.buildNumber)),
-                             description=['upload', 'partner', 'status'],
-                             haltOnFailure=True
-                             ))
+        if self.releasePromotion:
+            self.addStep(ShellCommand(
+                 name='upload_partner_builds',
+                 command=['rsync', '-av',
+                          '-e', 'ssh -oIdentityFile=~/.ssh/%s' % self.stageSshKey,
+                          'build%s/partner-repacks/' % str(self.buildNumber),
+                          WithProperties(self.stageUsername + '@' + self.stagingServer +
+                                         ':/pub/mozilla.org/firefox/tinderbox-builds/' +
+                                         '%(branch)s-%(platform)s-partner_repack/'),
+                          ],
+                 workdir=WithProperties(self.partnersRepackDir +
+                                        '/scripts/repacked_builds/%(version)s'),
+                 description=['upload', 'partner', 'builds'],
+                 haltOnFailure=True
+            ))
+        else:
+            self.addStep(ShellCommand(
+                 name='upload_partner_builds',
+                 command=['rsync', '-av',
+                          '-e', 'ssh -oIdentityFile=~/.ssh/%s' % self.stageSshKey,
+                          'build%s/' % str(self.buildNumber),
+                          '%s@%s:%s/' % (self.stageUsername,
+                                         self.stagingServer,
+                                         self.candidatesDir)
+                          ],
+                 workdir='%s/scripts/repacked_builds/%s' % (self.partnersRepackDir,
+                                                            self.version),
+                 description=['upload', 'partner', 'builds'],
+                 haltOnFailure=True
+            ))
 
 
 def rc_eval_func(exit_statuses):
     def eval_func(cmd, step):
         rc = cmd.rc
         # Temporarily set the rc to 0 so that regex_log_evaluator won't say a
         # command has failed because of non-zero exit code.  We're handing exit
         # codes here.