5 We create slightly-modified Firefox releases for some extra audiences
7 * EME-free builds, which disable DRM plugins by default
8 * Funnelcake builds, which are used for Mozilla experiments
9 * partner builds, which customize Firefox for external partners
11 We use the phrase "partner repacks" to refer to all these builds because they
12 use the same process of repacking regular Firefox releases with additional files.
13 The specific differences depend on the type of build.
15 We produce partner repacks for some beta builds, and for release builds, as part of the release
16 automation. We don't produce any files to update these builds as they are handled automatically
19 We also produce :ref:`partner attribution` builds, which are Firefox Windows installers with a cohort identifier
22 Parameters & Scheduling
23 -----------------------
25 Partner repacks have a number of parameters which control how they work:
27 * ``release_enable_emefree``
28 * ``release_enable_partner_repack``
29 * ``release_partner_config``
30 * ``release_partner_build_number``
31 * ``release_partners``
33 We split the repacks into two 'paths', EME-free and everything else, to retain some
34 flexibility over enabling/disabling them separately. This costs us some duplication of the kinds
35 in the repacking stack. The two enable parameters are booleans to turn these two paths
36 on/off. We set them in shipit's `is_partner_enabled() <https://github.com/mozilla-releng/shipit/blob/main/api/src/shipit_api/admin/release.py#L93>`_ when starting a
37 release. They're both true for Firefox betas >= b8 and releases, but otherwise disabled.
39 ``release_partner_config`` is a dictionary of configuration data which drives the task generation
40 logic. It's usually looked up during the release promotion action task, using the Github
41 GraphQL API in the `get_partner_config_by_url()
42 <python/taskgraph.util.html#taskgraph.util.partners.get_partner_config_by_url>`_ function, with the
43 url defined in `taskcluster/ci/config.yml <https://searchfox
44 .org/mozilla-release/search?q=regexp%3A^partner+path%3Aconfig.yml&redirect=true>`_.
46 ``release_partner_build_number`` is an integer used to create unique upload paths in the firefox
47 candidates directory, while ``release_partners`` is a list of partners that should be
48 repacked (i.e. a subset of the whole config). Both are intended for use when respinning a few partners after
49 the regular Firefox has shipped. More information on that can be found in the
50 `RelEng Docs <https://moz-releng-docs.readthedocs.io/en/latest/procedures/misc-operations/off-cycle-partner-repacks-and-funnelcake.html>`_.
52 Most of the machine time for generating partner repacks takes place in the `promote` phase of the
53 automation, or `promote_rc` in the case of X.0 release candidates. The EME-free builds are copied into the
54 Firefox releases directory in the `push` phase, along with the regular bits.
60 We need some configuration to know *what* to repack, and *how* to do that. The *what* is defined by
61 default.xml manifests, as used with the `repo <https://gerrit.googlesource.com/git-repo>`_ tool
62 for git. The `default.xml for EME-free <https://github
63 .com/mozilla-partners/mozilla-EME-free-manifest/blob/master/default.xml>`_ illustrates this::
65 <?xml version="1.0" ?>
67 <remote fetch="git@github.com:mozilla-partners/" name="mozilla-partners"/>
68 <remote fetch="git@github.com:mozilla/" name="mozilla"/>
70 <project name="repack-scripts" path="scripts" remote="mozilla-partners" revision="master"/>
71 <project name="build-tools" path="scripts/tools" remote="mozilla" revision="master"/>
72 <project name="mozilla-EME-free" path="partners/mozilla-EME-free" remote="mozilla-partners" revision="master"/>
75 The repack-scripts and build-tools repos are found in all manifests, and then there is a list of
76 partner repositories which contain the *how* configuration. Some of these repos are not publicly
79 A partner repository may contain multiple configurations inside the ``desktop`` directory. Each
80 subdirectory must contain a ``repack.cfg`` and a ``distribution`` directory, the latter
81 containing the customizations needed. Here's `EME-free's repack.cfg <https://github.com/mozilla-partners/mozilla-EME-free/blob/master/desktop/mozilla-EME-free/repack.cfg>`_::
84 dist_id="mozilla-EMEfree"
88 locales="ach af an ar" # truncated for display here
92 output_dir="%(platform)s-EME-free/%(locale)s"
95 upload_to_candidates=true
97 Note the list of locales and boolean toggles for enabling platforms. The ``output_dir`` and
98 ``upload_to_candidates`` parameters are only present for repacks which are uploaded into the
99 `candidates directory <https://archive.mozilla.org/pub/firefox/candidates/>`_.
101 All customizations will be placed in the ``distribution`` directory at the root of the Firefox
102 install directory, or in the case of OS X in ``Firefox.app/Contents/Resources/distribution/``. A
103 ``distribution.ini`` file is the minimal requirement, here's an example from `EME-free
104 <https://github.com/mozilla-partners/mozilla-EME-free/blob/master/desktop/mozilla-EME-free/distribution
105 /distribution.ini>`_::
107 # Partner Distribution Configuration File
114 about=Mozilla Firefox EME-free
117 media.eme.enabled=false
118 app.partner.mozilla-EMEfree="mozilla-EMEfree"
120 Extensions and other customizations might also be included in repacks.
126 The stack of tasks to create partner repacks is broadly similar to localised nightlies and
127 regular releases. The basic form is
129 * partner repack - insert the customisations into the the regular builds
130 * signing - sign the internals which will become the installer (Mac only)
131 * repackage - create the "installer" (Mac and Windows)
132 * chunking dummy - a linux only bridge to ...
133 * repackage signing - sign the "installers" (mainly Windows)
134 * beetmover - move the files to a partner-specific destination
135 * beetmover checksums - possibly beetmove the checksums from previous step
137 Some key divergences are:
139 * all intermediate artifacts are uploaded with a ``releng/partner`` prefix
140 * we don't insert any binaries on Windows so no need for internal signing
141 * there's no need to create any complete mar files at the repackage step
142 * we support both public and private destinations in beetmover
143 * we only need beetmover checksums for EME-free builds
149 * kinds: ``release-partner-repack`` ``release-eme-free-repack``
150 * platforms: Typically all (but depends on what's enabled by partner configuration)
151 * upstreams: ``build-signing`` ``l10n-signing``
153 There is one task per platform in this step, calling out to `scripts/desktop_partner_repacks.py
154 <https://hg.mozilla.org/mozilla-central/file/default/testing/mozharness/scripts
155 /desktop_partner_repacks.py>`_ in mozharness to prepare an environment and then perform the repacks.
156 The actual repacking is done by `python/mozrelease/mozrelease/partner_repack.py
157 <https://hg.mozilla.org/mozilla-central/file/default/python/mozrelease/mozrelease/partner_repack.py>`_.
159 It takes as input the build-signing and l10n-signing artifacts, which are all zip/tar.gz/tar.bz2
160 archives, simplifying the repack process by avoiding dmg and exe. Windows produces ``target.zip``
161 & ``setup.exe``, Mac is ``target.tar.gz``, Linux is the final product ``target.tar.bz2``
162 (beetmover handles pretty naming as usual).
167 * kinds: ``release-partner-repack-notarization-part-1`` ``release-partner-repack-notarization-poller`` ``release-partner-repack-signing``
169 * upstreams: ``release-partner-repack`` ``release-eme-free-repack``
171 We chunk the single partner repack task out to a signing task with 5 artifacts each. For
172 example, EME-free will become 19 tasks. We collect the target.tar.gz from the
173 upstream, and return a signed target.tar.gz. We use a ``target.dmg`` artifact for
174 nightlies/regular releases, but this is converted to ``target.tar.gz`` by the signing
175 scriptworker before sending it to the signing server, so partners are equivalent. The ``part-1`` task
176 uploads the binaries to apple, while the ``poller`` task waits for their approval, then
177 ``release-partner-repack-signing`` staples on the notarization ticket.
182 * kinds: ``release-partner-repack-repackage`` ``release-eme-free-repack-repackage``
183 * platforms: Mac & Windows
186 * Mac: ``release-partner-signing`` ``release-eme-free-signing``
187 * Windows: ``release-partner-repack`` ``release-eme-free-repack``
189 Mac has a repackage job for each of the signing tasks. Windows repackages are chunked here to
190 the same granularity as mac. Takes ``target.zip`` & ``setup.exe`` to produce ``target.exe`` on
191 Windows, and ``target.tar.gz`` to produce ``target.dmg`` on Mac. There's no need to produce any
192 complete.mar files here like regular release bits do because we can reuse those.
197 * kinds: ``release-partner-repack-chunking-dummy``
199 * upstreams: ``release-partner-repack``
201 We're need Linux chunked at the next step so this dummy takes care of that for the relatively simple path
202 Linux follows. One task per sub config+locale combination, the same as Windows and Mac. This doesn't need to
203 exist for EME-free because we don't need to create Linux builds there.
208 * kinds: ``release-partner-repack-repackage-signing`` ``release-eme-free-repack-repackage-signing``
212 * Mac & Windows: ``release-partner-repackage`` ``release-eme-free-repackage``
213 * Linux: ``release-partner-repack-chunking-dummy``
215 This step GPG signs all platforms, and authenticode signs the Windows installer.
220 * kinds: ``release-partner-repack-beetmover`` ``release-eme-free-repack-beetmover``
222 * upstreams: ``release-partner-repack-repackage-signing`` ``release-eme-free-repack-repackage-signing``
224 Moves and renames the artifacts to their public location in the `candidates directory
225 <https://archive.mozilla.org/pub/firefox/candidates/>`_, or a private S3 bucket. Each task will
226 have the ``project:releng:beetmover:action:push-to-partner`` scope, with public uploads having
227 ``project:releng:beetmover:bucket:release`` and private uploads using
228 ``project:releng:beetmover:bucket:partner``. The ``upload_to_candidates`` key in the partner config
229 controls the second scope. There's a separate partner code path in `beetmoverscript <https://github.com/mozilla-releng/scriptworker-scripts/tree/master/beetmoverscript>`_.
234 * kinds: ``release-eme-free-repack-beetmover-checksums``
235 * platforms: Mac & Windows
236 * upstreams: ``release-eme-free-repack-repackage-beetmover``
238 The EME-free builds should be present in our SHA256SUMS file and friends (`e.g. <https://archive
239 .mozilla.org/pub/firefox/releases/61.0/SHA256SUMS>`_) so we beetmove the target.checksums from
240 the beetmover tasks into the candidates directory. They get picked up by the
241 ``release-generate-checksums`` kind.
248 It's very rare to need to update a partner repack differently from the original
249 release build but we retain that capability. A partner build with distribution name ``foo``,
250 based on a release Firefox build, will query for an update on the ``release-cck-foo`` channel. If
251 the update server `Balrog <http://mozilla-balrog.readthedocs.io/en/latest/>`_ finds no rule for
252 that channel it will fallback to the ``release`` channel. The update files for the regular releases do not
253 modify the ``distribution/`` directory, so the customizations are not modified.
255 `Bug 1430254 <https://bugzilla.mozilla.org/show_bug.cgi?id=1430254>`_ is an example of an exception to this