Bug 1548864 - part 4: Change promote_fennec to handle beta tasks only r=Callek a=release
authorJohan Lorenzo <jlorenzo@mozilla.com>
Wed, 15 May 2019 17:49:50 +0200
changeset 536418 d51fe28644b8b66c0b7dfc4a0504813aeef52640
parent 536417 f58c24f5f8543fde39d341ac43ed18ea5e87c7f2
child 536419 851a7d71d98070ecfdaf4be0b230f979b6d2283b
push id2082
push userffxbld-merge
push dateMon, 01 Jul 2019 08:34:18 +0000
treeherdermozilla-release@2fb19d0466d2 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersCallek, release
bugs1548864
milestone68.0
Bug 1548864 - part 4: Change promote_fennec to handle beta tasks only r=Callek a=release This means `-nightly` tasks don't end up in that promote graph. The push-apk loader also wires the expected dependencies. We also ensure geckoview Nightly is not shipped off mozilla-beta by not exposing the geckoview artifacts on the nightly build tasks Ship Nightly to the alpha track of Google Play Differential Revision: https://phabricator.services.mozilla.com/D29851
taskcluster/ci/beetmover/kind.yml
taskcluster/ci/google-play-strings/kind.yml
taskcluster/ci/push-apk-checks/kind.yml
taskcluster/ci/push-apk/kind.yml
taskcluster/taskgraph/loader/push_apk.py
taskcluster/taskgraph/manifests/fennec_candidates.yml
taskcluster/taskgraph/target_tasks.py
taskcluster/taskgraph/transforms/beetmover.py
taskcluster/taskgraph/transforms/beetmover_geckoview.py
taskcluster/taskgraph/transforms/google_play_strings.py
taskcluster/taskgraph/transforms/push_apk.py
taskcluster/taskgraph/transforms/push_apk_checks.py
taskcluster/taskgraph/transforms/release_deps.py
taskcluster/taskgraph/util/scriptworker.py
--- a/taskcluster/ci/beetmover/kind.yml
+++ b/taskcluster/ci/beetmover/kind.yml
@@ -36,13 +36,11 @@ not-for-build-platforms:
     - win64-aarch64-devedition-nightly/opt
     - linux64-asan-reporter-nightly/opt
     - win64-asan-reporter-nightly/opt
 
 job-template:
     shipping-phase: promote
     attributes:
         artifact_map:
-            by-release-type:
-                release: taskcluster/taskgraph/manifests/fennec_candidates.yml
-                beta: taskcluster/taskgraph/manifests/fennec_candidates.yml
-                nightly: taskcluster/taskgraph/manifests/fennec_nightly.yml
-                default: taskcluster/taskgraph/manifests/fennec_nightly.yml
+            by-platform:
+                android-(aarch64|api-16|x86|x86_64)-(beta|release): taskcluster/taskgraph/manifests/fennec_candidates.yml
+                android-(aarch64|api-16|x86|x86_64)-nightly: taskcluster/taskgraph/manifests/fennec_nightly.yml
--- a/taskcluster/ci/google-play-strings/kind.yml
+++ b/taskcluster/ci/google-play-strings/kind.yml
@@ -3,52 +3,60 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 ---
 loader: taskgraph.loader.transform:loader
 
 transforms:
     - taskgraph.transforms.google_play_strings:transforms
     - taskgraph.transforms.task:transforms
 
+job-defaults:
+    description: Download strings to display on Google Play from https://l10n.mozilla-community.org/stores_l10n/
+    attributes:
+        build_type: google_play_strings
+        nightly: true
+    shipping-phase: promote
+    shipping-product: fennec
+    worker-type: b-linux
+    worker:
+        implementation: docker-worker
+        os: linux
+        docker-image: {in-tree: mozapkpublisher}
+        chain-of-trust: true
+        max-run-time: 600
+        artifacts:
+            - name: 'public/google_play_strings.json'
+              # XXX The folder depends on the one defined in the Dockerfile
+              path: /builds/worker/google_play_strings.json
+              type: 'file'
+        env:
+            # XXX The folder depends on the one defined in the Dockerfile
+            GOOGLE_PLAY_STRING_FILE: /builds/worker/google_play_strings.json
+        command:
+            - bash
+            - -cx
+            - >
+              python3 ./mozapkpublisher/get_l10n_strings.py
+              --package-name "${PACKAGE_NAME}"
+              --output-file "${GOOGLE_PLAY_STRING_FILE}"
+    treeherder:
+        platform: Android/opt
+        tier: 2
+        kind: other
+    run-on-projects: ['try', 'mozilla-central', 'mozilla-beta', 'mozilla-release']
+
 jobs:
-    google-play-strings:
-        description: Download strings to display on Google Play from https://l10n.mozilla-community.org/stores_l10n/
+    google-play-strings-nightly:
         attributes:
-            build_type: google_play_strings
             build_platform: android-nightly
-            nightly: true
-        shipping-phase: promote
-        shipping-product: fennec
-        worker-type: b-linux
         worker:
-            implementation: docker-worker
-            os: linux
-            docker-image: {in-tree: mozapkpublisher}
-            chain-of-trust: true
-            max-run-time: 600
-            artifacts:
-                - name: 'public/google_play_strings.json'
-                  # XXX The folder depends on the one defined in the Dockerfile
-                  path: /builds/worker/google_play_strings.json
-                  type: 'file'
             env:
-                # TODO Use the branch name instead of the android package name
-                PACKAGE_NAME:
-                    by-project:
-                        mozilla-central: org.mozilla.fennec_aurora
-                        mozilla-beta: org.mozilla.firefox_beta
-                        mozilla-release: org.mozilla.firefox
-                        default: org.mozilla.fennec_aurora  # Fetches strings for mozilla-central
-                # XXX The folder depends on the one defined in the Dockerfile
-                GOOGLE_PLAY_STRING_FILE: /builds/worker/google_play_strings.json
-            command:
-                - bash
-                - -cx
-                - >
-                  python3 ./mozapkpublisher/get_l10n_strings.py
-                  --package-name "${PACKAGE_NAME}"
-                  --output-file "${GOOGLE_PLAY_STRING_FILE}"
+                PACKAGE_NAME: org.mozilla.fennec_aurora
         treeherder:
-            symbol: pub(gps)
-            platform: Android/opt
-            tier: 2
-            kind: other
-        run-on-projects: ['maple', 'mozilla-central', 'mozilla-beta', 'mozilla-release']
+            symbol: pub(gps-n)
+    google-play-strings-beta:
+        attributes:
+            build_platform: android-beta
+        worker:
+            env:
+                PACKAGE_NAME: org.mozilla.firefox_beta
+        treeherder:
+            symbol: pub(gps-b)
--- a/taskcluster/ci/push-apk-checks/kind.yml
+++ b/taskcluster/ci/push-apk-checks/kind.yml
@@ -6,35 +6,42 @@ loader: taskgraph.loader.push_apk:loader
 
 transforms:
     - taskgraph.transforms.push_apk_checks:transforms
     - taskgraph.transforms.task:transforms
 
 kind-dependencies:
     - build-signing
 
+job-defaults:
+    attributes:
+        nightly: true
+    shipping-phase: promote
+    shipping-product: fennec
+    worker-type: b-linux
+    worker:
+        implementation: docker-worker
+        os: linux
+        docker-image: {in-tree: mozapkpublisher}
+        chain-of-trust: true
+        max-run-time: 600
+    treeherder:
+        platform: Android/opt
+        tier: 1
+        kind: test
+    run-on-projects: ['try', 'mozilla-central', 'mozilla-beta', 'mozilla-release']
+
 jobs:
-    push-apk-checks/opt:
-        description: Verify APKs are sane before uploading them onto Google Play Store
+    push-apk-checks-nightly/opt:
+        description: Verify Nightly APKs are sane before uploading them onto Google Play Store
         attributes:
             build_platform: android-nightly
-            nightly: true
-        shipping-phase: promote
-        shipping-product: fennec
-        package-name:
-            by-project:
-                mozilla-central: org.mozilla.fennec_aurora
-                mozilla-beta: org.mozilla.firefox_beta
-                mozilla-release: org.mozilla.firefox
-                default: org.mozilla.fennec_aurora
-        worker-type: b-linux
-        worker:
-            implementation: docker-worker
-            os: linux
-            docker-image: {in-tree: mozapkpublisher}
-            chain-of-trust: true
-            max-run-time: 600
+        package-name: org.mozilla.fennec_aurora
         treeherder:
-            symbol: pub(gpc)
-            platform: Android/opt
-            tier: 1
-            kind: test
-        run-on-projects: ['mozilla-central', 'mozilla-beta', 'mozilla-release']
+            symbol: pub(gpc-n)
+
+    push-apk-checks-beta/opt:
+        description: Verify Beta APKs are sane before uploading them onto Google Play Store
+        attributes:
+            build_platform: android-beta
+        package-name: org.mozilla.firefox_beta
+        treeherder:
+            symbol: pub(gpc-b)
--- a/taskcluster/ci/push-apk/kind.yml
+++ b/taskcluster/ci/push-apk/kind.yml
@@ -8,51 +8,53 @@ transforms:
     - taskgraph.transforms.push_apk:transforms
     - taskgraph.transforms.task:transforms
 
 kind-dependencies:
     - build-signing
     - google-play-strings
     - push-apk-checks
 
+job-defaults:
+    description: Publishes APK onto Google Play Store
+    attributes:
+        nightly: true
+    shipping-phase: ship
+    shipping-product: fennec
+    worker-type:
+        by-release-level:
+            production: scriptworker-prov-v1/pushapk-v1
+            staging: scriptworker-prov-v1/dep-pushapk
+    worker:
+        upstream-artifacts:  # see transforms
+        implementation: push-apk
+        commit:
+            by-release-level:
+                production: true
+                staging: false
+    requires: all-resolved
+    scopes:  # see transforms
+    treeherder:
+        platform: Android/opt
+        tier: 2
+        kind: other
+    run-on-projects: ['try', 'mozilla-central', 'mozilla-beta', 'mozilla-release']
+
 jobs:
-    push-apk/opt:
-        label: 'push-apk/opt'
-        description: Publishes APK onto Google Play Store
+    push-apk-nightly/opt:
         attributes:
             build_platform: android-nightly
-            nightly: true
-        shipping-phase: ship
-        shipping-product: fennec
-        worker-type:
-            by-release-level:
-                production: scriptworker-prov-v1/pushapk-v1
-                staging: scriptworker-prov-v1/dep-pushapk
         worker:
-            upstream-artifacts:  # see transforms
-            google-play-track:
-                # See https://github.com/mozilla-releng/pushapkscript#aurora-beta-release-vs-alpha-beta-production
-                by-release-type:
-                    nightly: 'beta'
-                    beta: 'rollout'
-                    release(-rc)?: 'rollout'
-                    default: 'internal'
-            implementation: push-apk
-            commit:
-                by-release-level:
-                    production: true
-                    staging: false
-            rollout-percentage:
-                by-release-type:
-                    # XXX Please make sure to change google-play-track above to
-                    # 'rollout' if you add a new supported project
-                    release: 10
-                    release-rc: 5
-                    beta: 10
-                    default: null
-        requires: all-resolved
-        scopes:  # see transforms
+            # XXX Temporarily ship Nightly to the alpha track while we ensure it's
+            # correctly built of mozilla-beta
+            # See also https://github.com/mozilla-releng/pushapkscript#aurora-beta-release-vs-alpha-beta-production
+            google-play-track: alpha
         treeherder:
-            symbol: pub(gp)
-            platform: Android/opt
-            tier: 2
-            kind: other
-        run-on-projects: ['mozilla-central', 'mozilla-beta', 'mozilla-release']
+            symbol: pub(gp-n)
+
+    push-apk-beta/opt:
+        attributes:
+            build_platform: android-beta
+        worker:
+            google-play-track: rollout
+            rollout-percentage: 10
+        treeherder:
+            symbol: pub(gp-b)
--- a/taskcluster/taskgraph/loader/push_apk.py
+++ b/taskcluster/taskgraph/loader/push_apk.py
@@ -9,43 +9,56 @@ from .transform import loader as base_lo
 
 def loader(kind, path, config, params, loaded_tasks):
     """
     Generate inputs implementing PushApk jobs. These depend on signed multi-locales nightly builds.
     """
     jobs = base_loader(kind, path, config, params, loaded_tasks)
 
     for job in jobs:
-        dependent_tasks = get_dependent_loaded_tasks(config, params, loaded_tasks)
+        dependent_tasks = get_dependent_loaded_tasks(config, params, loaded_tasks, job)
         if not dependent_tasks:
             # PushApk must depend on signed APK. If no dependent task was found,
             # this means another plaform (like windows) is being processed
             continue
 
         job['dependent-tasks'] = dependent_tasks
         job['label'] = job['name']
 
         yield job
 
 
-def get_dependent_loaded_tasks(config, params, loaded_tasks):
+def get_dependent_loaded_tasks(config, params, loaded_tasks, job):
     nightly_tasks = (
         task for task in loaded_tasks if task.attributes.get('nightly')
     )
     tasks_with_matching_kind = (
         task for task in nightly_tasks if task.kind in config.get('kind-dependencies')
     )
     android_tasks = (
         task for task in tasks_with_matching_kind
         if task.attributes.get('build_platform', '').startswith('android')
     )
 
+    if job['attributes']['build_platform'].endswith('-beta'):
+        tasks_with_right_release_type = (
+            task for task in android_tasks
+            if task.attributes.get('build_platform', '').endswith('-beta')
+        )
+    elif job['attributes']['build_platform'].endswith('-nightly'):
+        tasks_with_right_release_type = (
+            task for task in android_tasks
+            if task.attributes.get('build_platform', '').endswith('-nightly')
+        )
+    else:
+        return []
+
     # XXX Bug 1368484: Aarch64 is not planned to ride the trains regularly. It stayed on central
     # for a couple of cycles, and is planned to stay on mozilla-beta until 68.
     if params['project'] in ('mozilla-central', 'mozilla-beta', 'try'):
-        shipping_tasks = list(android_tasks)
+        shipping_tasks = list(tasks_with_right_release_type)
     else:
         shipping_tasks = [
-            task for task in android_tasks
+            task for task in tasks_with_right_release_type
             if 'aarch64' not in task.attributes.get('build_platform', '')
         ]
 
     return shipping_tasks
--- a/taskcluster/taskgraph/manifests/fennec_candidates.yml
+++ b/taskcluster/taskgraph/manifests/fennec_candidates.yml
@@ -9,26 +9,26 @@ default_locales:  # if given an empty lo
     - multi
 tasktype_map:  # map task reference to task type.
     build: build
     build-signing: signing
     nightly-l10n-signing: signing
 platform_names:
     path_platform:
         by-platform:
-            android-x86-nightly: 'android-x86'
-            android-x86_64-nightly: 'android-x86_64'
-            android-api-16-nightly: 'android-api-16'
-            android-aarch64-nightly: 'android-aarch64'
+            android-x86-(nightly|beta): 'android-x86'
+            android-x86_64-(nightly|beta): 'android-x86_64'
+            android-api-16-(nightly|beta): 'android-api-16'
+            android-aarch64-(nightly|beta): 'android-aarch64'
     filename_platform:
         by-platform:
-            android-x86-nightly: 'android-i386'
-            android-x86_64-nightly: 'android-x86_64'
-            android-api-16-nightly: 'android-arm'
-            android-aarch64-nightly: 'android-aarch64'
+            android-x86-(nightly|beta): 'android-i386'
+            android-x86_64-(nightly|beta): 'android-x86_64'
+            android-api-16-(nightly|beta): 'android-arm'
+            android-aarch64-(nightly|beta): 'android-aarch64'
 
 # A default entry, which the mappings below extend and override.
 # Final 'destinations' will be the product of:
 # s3_bucket_paths + destinations + locale_prefix + pretty_name
 default: &default
     from:
         - build
     all_locales: false
--- a/taskcluster/taskgraph/target_tasks.py
+++ b/taskcluster/taskgraph/target_tasks.py
@@ -380,19 +380,22 @@ def target_tasks_promote_fennec(full_tas
     nightly build process involves a pipeline of builds, signing,
     and, eventually, uploading the tasks to balrog."""
 
     def filter(task):
         attr = task.attributes.get
         # Don't ship single locale fennec anymore - Bug 1408083
         if attr("locale") or attr("chunk_locales"):
             return False
+
         if task.attributes.get('shipping_product') == 'fennec' and \
-                task.attributes.get('shipping_phase') == 'promote':
+                task.attributes.get('shipping_phase') == 'promote' and \
+                '-nightly' not in task.label:
             return True
+        return False
 
     return [l for l, t in full_task_graph.tasks.iteritems() if filter(full_task_graph[l])]
 
 
 @_target_task('ship_fennec')
 def target_tasks_ship_fennec(full_task_graph, parameters, graph_config):
     """Select the set of tasks required to ship fennec.
     Previous build deps will be optimized out via action task."""
@@ -403,19 +406,20 @@ def target_tasks_ship_fennec(full_task_g
 
     def filter(task):
         # Include candidates build tasks; these will be optimized out
         if task.label in filtered_for_candidates:
             return True
         if task.attributes.get('shipping_product') != 'fennec' or \
                 task.attributes.get('shipping_phase') not in ('ship', 'push'):
             return False
-        # We always run push-apk during ship
-        if task.kind == 'push-apk':
-            return True
+
+        if task.attributes.get('build_platform', '').endswith('-nightly'):
+            return False
+
         # secondary-notify-ship is only for RC
         if task.kind in (
             'release-secondary-notify-ship',
         ):
             return is_rc
 
         # Everything else is only for non-RC
         return not is_rc
@@ -441,24 +445,38 @@ def target_tasks_pine(full_task_graph, p
 
 
 @_target_task('nightly_fennec')
 def target_tasks_nightly_fennec(full_task_graph, parameters, graph_config):
     """Select the set of tasks required for a nightly build of fennec. The
     nightly build process involves a pipeline of builds, signing,
     and, eventually, uploading the tasks to balrog."""
     def filter(task):
-        # XXX Starting 69, we don't ship Fennec Nightly anymore. We just want geckoview to be
-        # uploaded
-        return task.label in (
+        # XXX Starting 68, we ship Fennec outside of mozilla-central, but geckoview must remain
+        # shipped from there
+        if task.label in (
             'beetmover-geckoview-android-aarch64-nightly/opt',
             'beetmover-geckoview-android-api-16-nightly/opt',
             'beetmover-geckoview-android-x86-nightly/opt',
             'beetmover-geckoview-android-x86_64-nightly/opt',
-        )
+        ):
+            return False
+
+        platform = task.attributes.get('build_platform')
+        if not filter_for_project(task, parameters):
+            return False
+        if platform in ('android-aarch64-nightly',
+                        'android-api-16-nightly',
+                        'android-nightly',
+                        'android-x86-nightly',
+                        'android-x86_64-nightly',
+                        ):
+            if not task.attributes.get('nightly', False):
+                return False
+            return filter_for_project(task, parameters)
 
     return [l for l, t in full_task_graph.tasks.iteritems() if filter(t)]
 
 
 def make_desktop_nightly_filter(platforms):
     """Returns a filter that gets all nightly tasks on the given platform."""
     def filter(task, parameters):
         return all([
--- a/taskcluster/taskgraph/transforms/beetmover.py
+++ b/taskcluster/taskgraph/transforms/beetmover.py
@@ -194,16 +194,17 @@ def make_task_description(config, jobs):
             'description': description,
             'worker-type': get_worker_type_for_scope(config, bucket_scope),
             'scopes': [bucket_scope, action_scope],
             'dependencies': dependencies,
             'attributes': attributes,
             'run-on-projects': dep_job.attributes.get('run_on_projects'),
             'treeherder': treeherder,
             'shipping-phase': job['shipping-phase'],
+            'shipping-product': job.get('shipping-product'),
         }
 
         yield task
 
 
 def generate_upstream_artifacts(job, signing_task_ref, build_task_ref, platform,
                                 locale=None):
     build_mapping = UPSTREAM_ARTIFACT_UNSIGNED_PATHS
--- a/taskcluster/taskgraph/transforms/beetmover_geckoview.py
+++ b/taskcluster/taskgraph/transforms/beetmover_geckoview.py
@@ -6,18 +6,19 @@ Transform the beetmover task into an act
 """
 
 from __future__ import absolute_import, print_function, unicode_literals
 
 import re
 
 from taskgraph.loader.single_dep import schema
 from taskgraph.transforms.base import TransformSequence
-from taskgraph.transforms.beetmover import \
-    craft_release_properties as beetmover_craft_release_properties
+from taskgraph.transforms.beetmover import (
+    craft_release_properties as beetmover_craft_release_properties,
+)
 from taskgraph.util.attributes import copy_attributes_from_dependent_job
 from taskgraph.util.schema import resolve_keyed_by, optionally_keyed_by
 from taskgraph.util.scriptworker import (generate_beetmover_artifact_map,
                                          generate_beetmover_compressed_upstream_artifacts,
                                          get_worker_type_for_scope)
 from taskgraph.transforms.task import task_description_schema
 from voluptuous import Required, Optional
 
@@ -115,16 +116,17 @@ def make_task_description(config, jobs):
             'description': description,
             'worker-type': get_worker_type_for_scope(config, job['bucket-scope']),
             'scopes': [job['bucket-scope'], 'project:releng:beetmover:action:push-to-maven'],
             'dependencies': dependencies,
             'attributes': attributes,
             'run-on-projects': job['run-on-projects'],
             'treeherder': treeherder,
             'shipping-phase': job['shipping-phase'],
+            'shipping-product': job.get('shipping-product'),
         }
 
         yield task
 
 
 def generate_upstream_artifacts(build_task_ref):
     return [{
         'taskId': {'task-reference': build_task_ref},
--- a/taskcluster/taskgraph/transforms/google_play_strings.py
+++ b/taskcluster/taskgraph/transforms/google_play_strings.py
@@ -4,17 +4,17 @@
 """
 Transform the push-apk kind into an actual task description.
 """
 
 from __future__ import absolute_import, print_function, unicode_literals
 
 from taskgraph.transforms.base import TransformSequence
 from taskgraph.transforms.task import task_description_schema
-from taskgraph.util.schema import resolve_keyed_by, Schema
+from taskgraph.util.schema import Schema
 
 from voluptuous import Required
 
 google_play_description_schema = Schema({
     Required('name'): basestring,
     Required('description'): task_description_schema['description'],
     Required('job-from'): task_description_schema['job-from'],
     Required('attributes'): task_description_schema['attributes'],
@@ -23,29 +23,8 @@ google_play_description_schema = Schema(
     Required('shipping-phase'): task_description_schema['shipping-phase'],
     Required('shipping-product'): task_description_schema['shipping-product'],
     Required('worker-type'): task_description_schema['worker-type'],
     Required('worker'): object,
 })
 
 transforms = TransformSequence()
 transforms.add_validate(google_play_description_schema)
-
-
-@transforms.add
-def set_label(config, jobs):
-    for job in jobs:
-        job['label'] = job['name']
-        yield job
-
-
-@transforms.add
-def set_worker_data(config, jobs):
-    for job in jobs:
-        worker = job['worker']
-
-        env = worker.setdefault('env', {})
-        resolve_keyed_by(
-            env, 'PACKAGE_NAME', item_name=job['name'],
-            project=config.params['project']
-        )
-
-        yield job
--- a/taskcluster/taskgraph/transforms/push_apk.py
+++ b/taskcluster/taskgraph/transforms/push_apk.py
@@ -19,98 +19,50 @@ from voluptuous import Optional, Require
 
 
 push_apk_description_schema = Schema({
     Required('dependent-tasks'): object,
     Required('name'): basestring,
     Required('label'): task_description_schema['label'],
     Required('description'): task_description_schema['description'],
     Required('job-from'): task_description_schema['job-from'],
-    Required('attributes'): task_description_schema['attributes'],
+    Required('attributes'): object,
     Required('treeherder'): task_description_schema['treeherder'],
     Required('run-on-projects'): task_description_schema['run-on-projects'],
     Required('worker-type'): optionally_keyed_by('release-level', basestring),
     Required('worker'): object,
     Required('scopes'): None,
     Required('requires'): task_description_schema['requires'],
     Required('shipping-phase'): task_description_schema['shipping-phase'],
     Required('shipping-product'): task_description_schema['shipping-product'],
     Optional('extra'): task_description_schema['extra'],
 })
 
 
-PLATFORM_REGEX = re.compile(r'build-signing-android-(\S+)-nightly')
+PLATFORM_REGEX = re.compile(r'build-signing-android-(\S+)/(\S+)')
 
 transforms = TransformSequence()
 transforms.add_validate(push_apk_description_schema)
 
 
 @transforms.add
-def validate_dependent_tasks(config, jobs):
-    for job in jobs:
-        check_every_architecture_is_present_in_dependent_tasks(
-            config.params['project'], job['dependent-tasks']
-        )
-        yield job
-
-
-def check_every_architecture_is_present_in_dependent_tasks(project, dependent_tasks):
-    dep_platforms = set(t.attributes.get('build_platform') for t in dependent_tasks)
-    required_architectures = _get_required_architectures(project)
-    missed_architectures = required_architectures - dep_platforms
-    if missed_architectures:
-        raise Exception('''One or many required architectures are missing.
-
-Required architectures: {}.
-Given dependencies: {}.
-'''.format(required_architectures, dependent_tasks)
-        )
-
-
-def _get_required_architectures(project):
-    architectures = {
-        'android-api-16-nightly',
-        'android-x86-nightly',
-        'android-x86_64-nightly',
-    }
-    if project in ('mozilla-central', 'mozilla-beta', 'try'):
-        architectures.add('android-aarch64-nightly')
-
-    return architectures
-
-
-@transforms.add
 def make_task_description(config, jobs):
     for job in jobs:
         job['dependencies'] = generate_dependencies(job['dependent-tasks'])
-        job['worker']['upstream-artifacts'] = generate_upstream_artifacts(
-            job, job['dependencies']
-        )
+        job['worker']['upstream-artifacts'] = generate_upstream_artifacts(job, job['dependencies'])
 
-        resolve_keyed_by(
-            job, 'worker.google-play-track', item_name=job['name'],
-            **{'release-type': config.params['release_type']}
-        )
-        resolve_keyed_by(
-            job, 'worker.commit', item_name=job['name'],
-            **{'release-level': config.params.release_level()}
-        )
+        params_kwargs = {
+            'release-level': config.params.release_level(),
+        }
 
-        resolve_keyed_by(
-            job, 'worker.rollout-percentage', item_name=job['name'],
-            **{'release-type': config.params['release_type']}
-        )
+        resolve_keyed_by(job, 'worker.commit', item_name=job['name'], **params_kwargs)
+        resolve_keyed_by(job, 'worker-type', item_name=job['name'], **params_kwargs)
 
         job['scopes'] = [get_push_apk_scope(config)]
 
-        resolve_keyed_by(
-            job, 'worker-type', item_name=job['name'],
-            **{'release-level': config.params.release_level()}
-        )
-
         yield job
 
 
 def generate_dependencies(dependent_tasks):
     # Because we depend on several tasks that have the same kind, we introduce the platform
     dependencies = {}
     for task in dependent_tasks:
         platform_match = PLATFORM_REGEX.match(task.label)
--- a/taskcluster/taskgraph/transforms/push_apk_checks.py
+++ b/taskcluster/taskgraph/transforms/push_apk_checks.py
@@ -5,56 +5,48 @@
 Transform the push-apk-checks kind into an actual task description.
 """
 
 from __future__ import absolute_import, print_function, unicode_literals
 
 from taskgraph.transforms.base import TransformSequence
 from taskgraph.transforms.task import task_description_schema
 from taskgraph.transforms.push_apk import (
-    validate_dependent_tasks,
     generate_dependencies,
     delete_non_required_fields,
 )
-from taskgraph.transforms.google_play_strings import set_worker_data
 from taskgraph.transforms.job.mozharness_test import get_artifact_url
-from taskgraph.util.schema import optionally_keyed_by, resolve_keyed_by, Schema
+from taskgraph.util.schema import Schema
 
 from voluptuous import Required
 
 transforms = TransformSequence()
 transforms.add_validate(Schema({
     Required('dependent-tasks'): object,
     Required('name'): basestring,
     Required('label'): task_description_schema['label'],
     Required('description'): task_description_schema['description'],
     Required('job-from'): task_description_schema['job-from'],
-    Required('attributes'): task_description_schema['attributes'],
+    Required('attributes'): object,
     Required('treeherder'): task_description_schema['treeherder'],
-    Required('package-name'): optionally_keyed_by('project', basestring),
+    Required('package-name'): basestring,
     Required('run-on-projects'): task_description_schema['run-on-projects'],
     Required('worker-type'): basestring,
     Required('worker'): object,
     Required('shipping-phase'): task_description_schema['shipping-phase'],
     Required('shipping-product'): task_description_schema['shipping-product'],
 }))
-transforms.add(validate_dependent_tasks)
-transforms.add(set_worker_data)
 
 
 @transforms.add
 def make_task_description(config, jobs):
     for job in jobs:
         job['dependencies'] = generate_dependencies(job['dependent-tasks'])
         dependencies_labels = job['dependencies'].keys()
 
-        resolve_keyed_by(
-            job, 'package-name', item_name=job['name'], project=config.params['project']
-        )
-
         commands = [
             'curl --location "{}" > "<{}>.apk"'.format(
                 get_artifact_url('<{}>'.format(task_label), 'public/build/target.apk'),
                 task_label,
             )
             for task_label in dependencies_labels
         ]
 
--- a/taskcluster/taskgraph/transforms/release_deps.py
+++ b/taskcluster/taskgraph/transforms/release_deps.py
@@ -19,27 +19,39 @@ def add_dependencies(config, jobs):
     for job in jobs:
         dependencies = {}
         # Add any kind_dependencies_tasks with matching product as dependencies
         product = job.get('shipping-product')
         phase = job.get('shipping-phase')
         if product is None:
             continue
 
+        release_type = config.params['release_type']
+        build_platform = job.get('attributes', {}).get('build_platform', '')
+        if product == 'fennec' and (
+            (release_type == 'beta' and '-nightly' in build_platform) or
+            (release_type == 'nightly' and '-beta' in build_platform)
+        ):
+            continue
+
         required_signoffs = set(job.setdefault('attributes', {}).get('required_signoffs', []))
         for dep_task in config.kind_dependencies_tasks:
             # Weed out unwanted tasks.
             # XXX we have run-on-projects which specifies the on-push behavior;
             # we need another attribute that specifies release promotion,
             # possibly which action(s) each task belongs in.
             if product == 'fennec':
                 # Don't ship single locale fennec anymore - Bug 1408083
                 attr = dep_task.attributes.get
                 if attr("locale") or attr("chunk_locales"):
                     continue
+
+                if attr('build_platform', '').endswith('-nightly'):
+                    continue
+
             # We can only depend on tasks in the current or previous phases
             dep_phase = dep_task.attributes.get('shipping_phase')
             if dep_phase and PHASES.index(dep_phase) > PHASES.index(phase):
                 continue
 
             if dep_task.attributes.get("build_platform") and \
                job.get("attributes", {}).get("build_platform"):
                 if dep_task.attributes["build_platform"] != job["attributes"]["build_platform"]:
--- a/taskcluster/taskgraph/util/scriptworker.py
+++ b/taskcluster/taskgraph/util/scriptworker.py
@@ -551,17 +551,16 @@ def generate_beetmover_artifact_map(conf
     Returns:
         list: A list of dictionaries containing source->destination
             maps for beetmover.
     """
     platform = kwargs.get('platform', '')
     resolve_keyed_by(
         job, 'attributes.artifact_map',
         'artifact map',
-        release_type=config.params['release_type'],
         platform=platform
     )
     map_config = deepcopy(cached_load_yaml(job['attributes']['artifact_map']))
     base_artifact_prefix = map_config.get('base_artifact_prefix', get_artifact_prefix(job))
 
     artifacts = list()
 
     dependencies = job['dependencies'].keys()