Backed out 13 changesets (bug 1636637, bug 1623355, bug 1636635, bug 1617481) buid signing failures. CLOSED TREE
authorNarcis Beleuzu <nbeleuzu@mozilla.com>
Mon, 18 May 2020 21:37:31 +0300
changeset 530683 a3941f42e66295031c2a6bf7b188d4c48a7ae624
parent 530682 d7ca9c89d955f8d47d43e237862c95cc31164bc4
child 530684 528ca16f21cba35b86e3dbce5828943d2c26fd45
push id116305
push usernbeleuzu@mozilla.com
push dateMon, 18 May 2020 18:38:12 +0000
treeherderautoland@a3941f42e662 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs1636637, 1623355, 1636635, 1617481
milestone78.0a1
backs out1b340fa71d16e2ca0cdd43410d9a2fc25bf701ac
607d65d6e48a8525181f1c9739f5db9209c7162d
d3b4ed0caa090006f1d30ca0cc1abfc1eab78dd8
bff6ecc8bb12447e8f7580863a0edb33fc16d98f
12774c2e7cfc9cf496fbc36a32ade4e83668c42f
f94e3f8179a57fc0a96c9c335ab3dd0e30b8f0ff
001eb6623a75f74a28317ba61ca16b0eefd1f0c8
87331010321af9d385bd4b7334f2f28fa16cd27c
fd76f6bc0797107c9cbf81bcb3dcd747043db7b7
b4ffd5ccbfc732e3cfc302de36ad64b68dabcdc9
888df247ba6e32fc102f3d0ee1c129add3388fdb
dc307651534214ce28234a8c351e8f08590766dc
de5f01ae37fa21f80476d612978ccd993af20ea4
first release with
nightly linux32
a3941f42e662 / 78.0a1 / 20200518214824 / files
nightly linux64
a3941f42e662 / 78.0a1 / 20200518214824 / files
nightly mac
a3941f42e662 / 78.0a1 / 20200518214824 / files
nightly win32
a3941f42e662 / 78.0a1 / 20200518214824 / files
nightly win64
a3941f42e662 / 78.0a1 / 20200518214824 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Backed out 13 changesets (bug 1636637, bug 1623355, bug 1636635, bug 1617481) buid signing failures. CLOSED TREE Backed out changeset 1b340fa71d16 (bug 1617481) Backed out changeset 607d65d6e48a (bug 1617481) Backed out changeset d3b4ed0caa09 (bug 1636637) Backed out changeset bff6ecc8bb12 (bug 1636637) Backed out changeset 12774c2e7cfc (bug 1636635) Backed out changeset f94e3f8179a5 (bug 1623355) Backed out changeset 001eb6623a75 (bug 1623355) Backed out changeset 87331010321a (bug 1623355) Backed out changeset fd76f6bc0797 (bug 1623355) Backed out changeset b4ffd5ccbfc7 (bug 1623355) Backed out changeset 888df247ba6e (bug 1623355) Backed out changeset dc3076515342 (bug 1623355) Backed out changeset de5f01ae37fa (bug 1623355)
taskcluster/ci/build-fat-aar/kind.yml
taskcluster/ci/build/android.yml
taskcluster/ci/build/linux.yml
taskcluster/ci/build/macosx.yml
taskcluster/ci/build/windows.yml
taskcluster/ci/condprof/kind.yml
taskcluster/ci/generate-profile/kind.yml
taskcluster/ci/instrumented-build/kind.yml
taskcluster/ci/shippable-l10n/kind.yml
taskcluster/ci/test/browsertime-mobile.yml
taskcluster/ci/test/compiled.yml
taskcluster/ci/test/mochitest.yml
taskcluster/ci/test/raptor-fennec68.yml
taskcluster/ci/test/raptor-gve.yml
taskcluster/ci/test/reftest.yml
taskcluster/ci/test/test-platforms.yml
taskcluster/taskgraph/loader/test.py
taskcluster/taskgraph/target_tasks.py
taskcluster/taskgraph/transforms/beetmover.py
taskcluster/taskgraph/transforms/build.py
taskcluster/taskgraph/transforms/build_lints.py
taskcluster/taskgraph/transforms/build_signing.py
taskcluster/taskgraph/transforms/geckodriver_signing.py
taskcluster/taskgraph/transforms/job/mozharness_test.py
taskcluster/taskgraph/transforms/l10n.py
taskcluster/taskgraph/transforms/mar_signing.py
taskcluster/taskgraph/transforms/partner_repack.py
taskcluster/taskgraph/transforms/release_sign_and_push_langpacks.py
taskcluster/taskgraph/transforms/repackage.py
taskcluster/taskgraph/transforms/repackage_routes.py
taskcluster/taskgraph/transforms/repackage_signing.py
taskcluster/taskgraph/transforms/repackage_signing_partner.py
taskcluster/taskgraph/transforms/signing.py
taskcluster/taskgraph/transforms/task.py
taskcluster/taskgraph/transforms/tests.py
taskcluster/taskgraph/transforms/upload_generated_sources.py
taskcluster/taskgraph/transforms/upload_symbols.py
taskcluster/taskgraph/try_option_syntax.py
taskcluster/taskgraph/util/partials.py
taskcluster/taskgraph/util/scriptworker.py
taskcluster/taskgraph/util/verify.py
--- a/taskcluster/ci/build-fat-aar/kind.yml
+++ b/taskcluster/ci/build-fat-aar/kind.yml
@@ -67,30 +67,55 @@ job-defaults:
             - linux64-clang
             - linux64-rust-android
             - linux64-rust-size
             - linux64-cbindgen
             - linux64-nasm
             - linux64-node
 
 jobs:
+    android-geckoview-fat-aar/opt:
+        description: "Android GeckoView multi-architecture fat AAR Opt"
+        index:
+            job-name: android-geckoview-fat-aar-opt
+        treeherder:
+            platform: android-4-0-geckoview-fat-aar/opt
+            symbol: Bgv
+        dependencies:
+            android-x86-opt: build-android-x86/opt
+            android-x86_64-opt: build-android-x86_64/opt
+            android-api-16-opt: build-android-api-16/opt
+            android-aarch64-opt: build-android-aarch64/opt
+        worker:
+            env:
+                PERFHERDER_EXTRA_OPTIONS: android-geckoview-fat-aar-opt
+                USE_ARTIFACT: '1'
+                MOZ_ARTIFACT_TASK: {task-reference: '<android-api-16-opt>'}
+        run:
+            actions: [get-secrets, build]
+            config: ["builds/releng_base_android_64_builds.py"]
+        fetches:
+            toolchain:
+                - linux64-sccache
+
     android-geckoview-fat-aar-shippable/opt:
         description: "Android GeckoView multi-architecture fat AAR Shippable"
         attributes:
+            nightly: true
             shippable: true
             enable-full-crashsymbols: true
             disable-push-apk: true
         shipping-phase: build
         shipping-product: fennec
         index:
-            job-name: android-geckoview-fat-aar-opt
-            type: shippable-with-multi-l10n
+            job-name: android-geckoview-fat-aar-nightly
+            type: nightly-with-multi-l10n
         treeherder:
-            platform: android-4-0-geckoview-fat-aar-shippable/opt
-            symbol: Bgv
+            platform: android-4-0-geckoview-fat-aar/opt
+            symbol: Ngv
         dependencies:
             android-x86-shippable: build-android-x86-shippable/opt
             android-x86_64-shippable: build-android-x86_64-shippable/opt
             android-api-16-shippable: build-android-api-16-shippable/opt
             android-aarch64-shippable: build-android-aarch64-shippable/opt
         worker:
             env:
                 PERFHERDER_EXTRA_OPTIONS: android-geckoview-fat-aar-nightly
--- a/taskcluster/ci/build/android.yml
+++ b/taskcluster/ci/build/android.yml
@@ -110,24 +110,27 @@ android-x86-fuzzing/debug:
         build-fuzzing:
             - android
 
 android-x86-shippable/opt:
     description: "Android 4.2 x86 Shippable"
     attributes:
         enable-full-crashsymbols: true
         shippable: true
+        nightly: true
+        # Android nightlies don't run tests in gecko, but are needed for github projects
+        skip-verify-test-packaging: true
     shipping-phase: build
     shipping-product: fennec
     index:
         job-name: android-x86-opt
-        type: android-shippable
+        type: android-nightly
     treeherder:
-        platform: android-4-2-x86-shippable/opt
-        symbol: B
+        platform: android-4-2-x86/opt
+        symbol: N
     worker-type: b-linux
     worker:
         env:
             TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android-x86/releng.manifest"
             MOZ_AUTOMATION_PACKAGE_TESTS: "1"
     run:
         actions: [get-secrets, build, multi-l10n]
         config:
@@ -156,30 +159,56 @@ android-api-16/opt:
         actions: [get-secrets, build]
         config: ["builds/releng_base_android_64_builds.py"]
         custom-build-variant-cfg: api-16
     fetches:
         toolchain:
             - linux64-clang
             - linux64-sccache
 
+android-api-16/pgo:
+    description: "Android 4.0 api-16+ PGO"
+    use-pgo: true
+    index:
+        job-name: android-api-16-pgo
+    attributes:
+        enable-full-crashsymbols: true
+    treeherder:
+        platform: android-4-0-armv7-api16/pgo
+        symbol: Bpgo(B)
+    worker-type: b-linux
+    worker:
+        env:
+            TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android/releng.manifest"
+            MOZ_AUTOMATION_PACKAGE_TESTS: "1"
+    run:
+        actions: [get-secrets, build]
+        config: ["builds/releng_base_android_64_builds.py"]
+        custom-build-variant-cfg: api-16
+    fetches:
+        toolchain:
+            - linux64-clang
+
 android-api-16-shippable/opt:
     description: "Android 4.0 api-16+ Shippable"
-    use-pgo: true
+    use-pgo: android-api-16/pgo
     attributes:
         enable-full-crashsymbols: true
         shippable: true
+        nightly: true
+        # Android nightlies don't run tests in gecko, but are needed for github projects
+        skip-verify-test-packaging: true
     shipping-phase: build
     shipping-product: fennec
     index:
         job-name: android-api-16-opt
-        type: android-shippable-with-multi-l10n
+        type: android-nightly-with-multi-l10n
     treeherder:
-        platform: android-4-0-armv7-api16-shippable/opt
-        symbol: Bpgo(B)
+        platform: android-4-0-armv7-api16/opt
+        symbol: N
     worker-type: b-linux
     worker:
         env:
             TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android/releng.manifest"
             MOZ_AUTOMATION_PACKAGE_TESTS: "1"
     run:
         actions: [get-secrets, build, multi-l10n]
         config:
@@ -208,16 +237,39 @@ android-aarch64/opt:
         actions: [get-secrets, build]
         config: ["builds/releng_base_android_64_builds.py"]
         custom-build-variant-cfg: aarch64
     fetches:
         toolchain:
             - linux64-clang
             - linux64-sccache
 
+android-aarch64/pgo:
+    description: "Android 5.0 AArch64 PGO"
+    use-pgo: android-api-16/pgo
+    index:
+        job-name: android-aarch64-pgo
+    attributes:
+        enable-full-crashsymbols: true
+    treeherder:
+        platform: android-5-0-aarch64/pgo
+        symbol: Bpgo(B)
+    worker-type: b-linux
+    worker:
+        env:
+            TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android/releng.manifest"
+            MOZ_AUTOMATION_PACKAGE_TESTS: "1"
+    run:
+        actions: [get-secrets, build]
+        config: ["builds/releng_base_android_64_builds.py"]
+        custom-build-variant-cfg: aarch64
+    fetches:
+        toolchain:
+            - linux64-clang
+
 android-aarch64/debug:
     description: "Android 5.0 AArch64 Debug"
     index:
         job-name: android-aarch64-debug
     attributes:
         enable-full-crashsymbols: true
     treeherder:
         platform: android-5-0-aarch64/debug
@@ -233,28 +285,31 @@ android-aarch64/debug:
         custom-build-variant-cfg: aarch64-debug
     fetches:
         toolchain:
             - linux64-clang
             - linux64-sccache
 
 android-aarch64-shippable/opt:
     description: "Android 5.0 AArch64 Shippable"
-    use-pgo: android-api-16-shippable/opt
+    use-pgo: android-api-16/pgo
     attributes:
         enable-full-crashsymbols: true
         shippable: true
+        nightly: true
+        # Android nightlies don't run tests in gecko, but are needed for github projects
+        skip-verify-test-packaging: true
     shipping-phase: build
     shipping-product: fennec
     index:
         job-name: android-aarch64-opt
-        type: android-shippable
+        type: android-nightly
     treeherder:
-        platform: android-5-0-aarch64-shippable/opt
-        symbol: Bpgo(B)
+        platform: android-5-0-aarch64/opt
+        symbol: N
     worker-type: b-linux
     worker:
         env:
             TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android/releng.manifest"
             MOZ_AUTOMATION_PACKAGE_TESTS: "1"
     run:
         actions: [get-secrets, build, multi-l10n]
         config:
@@ -288,24 +343,27 @@ android-x86_64/opt:
             - linux64-clang
             - linux64-sccache
 
 android-x86_64-shippable/opt:
     description: "Android 5.0 x86-64 Shippable"
     attributes:
         enable-full-crashsymbols: true
         shippable: true
+        nightly: true
+        # Android nightlies don't run tests in gecko, but are needed for github projects
+        skip-verify-test-packaging: true
     shipping-phase: build
     shipping-product: fennec
     index:
         job-name: android-x86_64-opt
-        type: android-shippable
+        type: android-nightly
     treeherder:
-        platform: android-5-0-x86_64-shippable/opt
-        symbol: B
+        platform: android-5-0-x86_64/opt
+        symbol: N
     worker-type: b-linux
     worker:
         env:
             TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android-x86/releng.manifest"
             MOZ_AUTOMATION_PACKAGE_TESTS: "1"
     run:
         actions: [get-secrets, build, multi-l10n]
         config:
--- a/taskcluster/ci/build/linux.yml
+++ b/taskcluster/ci/build/linux.yml
@@ -272,20 +272,20 @@ linux64-devedition/opt:
     attributes:
         shippable: true
         enable-full-crashsymbols: true
     shipping-phase: build
     shipping-product: devedition
     index:
         product: devedition
         job-name: linux64-opt
-        type: shippable
+        type: nightly
     treeherder:
         platform: linux64-devedition/opt
-        symbol: B
+        symbol: N
     worker-type: b-linux
     worker:
         max-run-time: 7200
         env:
             MOZ_AUTOMATION_PACKAGE_TESTS: "1"
     run:
         using: mozharness
         actions: [get-secrets, build]
@@ -650,20 +650,20 @@ linux-devedition/opt:
     attributes:
         shippable: true
         enable-full-crashsymbols: true
     shipping-phase: build
     shipping-product: devedition
     index:
         product: devedition
         job-name: linux-opt
-        type: shippable
+        type: nightly
     treeherder:
         platform: linux32-devedition/opt
-        symbol: B
+        symbol: N
     worker-type: b-linux
     worker:
         docker-image: {in-tree: debian8-i386-build}
         max-run-time: 7200
         env:
             MOZ_AUTOMATION_PACKAGE_TESTS: "1"
     run:
         using: mozharness
--- a/taskcluster/ci/build/macosx.yml
+++ b/taskcluster/ci/build/macosx.yml
@@ -189,20 +189,20 @@ macosx64-devedition/opt:
     attributes:
         shippable: true
         enable-full-crashsymbols: true
     shipping-phase: build
     shipping-product: devedition
     index:
         product: devedition
         job-name: macosx64-opt
-        type: shippable
+        type: nightly
     treeherder:
         platform: osx-cross-devedition/opt
-        symbol: B
+        symbol: N
         tier: 1
     worker-type: b-linux
     worker:
         max-run-time: 7200
         env:
             TOOLTOOL_MANIFEST: "browser/config/tooltool-manifests/macosx64/cross-releng.manifest"
             MOZ_AUTOMATION_PACKAGE_TESTS: "1"
     run:
--- a/taskcluster/ci/build/windows.yml
+++ b/taskcluster/ci/build/windows.yml
@@ -1029,17 +1029,17 @@ win64-asan-fuzzing/opt:
             - windows
 
 win32-devedition/opt:
     description: "Win32 Dev Edition (shippable)"
     use-pgo: win32-shippable/opt
     index:
         product: devedition
         job-name: win32-opt
-        type: shippable
+        type: nightly
     attributes:
         shippable: true
         enable-full-crashsymbols: true
     stub-installer:
         by-release-type:
             nightly: true
             beta: true
             release.*: true
@@ -1047,17 +1047,17 @@ win32-devedition/opt:
                 by-project:
                     # browser/confvars.sh looks for nightly-try
                     try: true
                     default: false
     shipping-phase: build
     shipping-product: devedition
     treeherder:
         platform: windows2012-32-devedition/opt
-        symbol: B
+        symbol: N
         tier: 1
     worker-type: b-linux
     worker:
         docker-image: {in-tree: debian9-amd64-build}
         max-run-time: 10800
         env:
             TOOLTOOL_MANIFEST: "browser/config/tooltool-manifests/win32/releng.manifest"
             MOZ_AUTOMATION_PACKAGE_TESTS: "1"
@@ -1096,25 +1096,25 @@ win32-devedition/opt:
             - upx-3.95-win
 
 win64-devedition/opt:
     description: "Win64 Dev Edition (shippable)"
     use-pgo: win64-shippable/opt
     index:
         product: devedition
         job-name: win64-opt
-        type: shippable
+        type: nightly
     attributes:
         shippable: true
         enable-full-crashsymbols: true
     shipping-phase: build
     shipping-product: devedition
     treeherder:
         platform: windows2012-64-devedition/opt
-        symbol: B
+        symbol: N
         tier: 1
     worker-type: b-linux
     worker:
         docker-image: {in-tree: debian9-amd64-build}
         max-run-time: 10800
         env:
             TOOLTOOL_MANIFEST: "browser/config/tooltool-manifests/win64/releng.manifest"
             MOZ_AUTOMATION_PACKAGE_TESTS: "1"
@@ -1472,28 +1472,28 @@ win64-aarch64-shippable-no-eme/opt:
         push-interval-10:
             - windows
 
 win64-aarch64-devedition/opt:
     description: "AArch64 Win64 Dev Edition (shippable)"
     index:
         product: devedition
         job-name: win64-aarch64-opt
-        type: shippable
+        type: nightly
     attributes:
         shippable: true
         enable-full-crashsymbols: true
         # Skip the test packaging check because we copy test packages from
         # another build task rather than generating them in this task.
         skip-verify-test-packaging: true
     shipping-phase: build
     shipping-product: devedition
     treeherder:
         platform: windows2012-aarch64-devedition/opt
-        symbol: B
+        symbol: N
         tier: 1
     worker-type: b-linux
     worker:
         docker-image: {in-tree: debian9-amd64-build}
         max-run-time: 7200
         env:
             TOOLTOOL_MANIFEST: "browser/config/tooltool-manifests/win64/aarch64.manifest"
             MOZ_ARTIFACT_TASK: {task-reference: '<win64-aarch64-opt>'}
@@ -1571,17 +1571,17 @@ win64-aarch64-devedition/opt:
             - upx-3.95-win
 
 win64-aarch64-devedition-no-eme/opt:
     description: "AArch64 Win64 Dev Edition w/o EME"
     use-pgo: win64-shippable/opt
     index:
         product: devedition
         job-name: win64-aarch64-no-eme-opt
-        type: shippable
+        type: nightly
     attributes:
         enable-full-crashsymbols: true
         # We need to package tests in order for the actual
         # win64-aarch64-devedition/opt build to copy them from this task, even
         # though no tests run against this task directly.
         skip-verify-test-packaging: true
     shipping-phase: build
     shipping-product: devedition
--- a/taskcluster/ci/condprof/kind.yml
+++ b/taskcluster/ci/condprof/kind.yml
@@ -125,17 +125,17 @@ jobs:
         description: Creates or update conditioned profiles on GeckoView+G5
         treeherder:
             symbol: condprof(geckoview)
             platform: android-hw-g5-7-0-arm7-api-16/opt
         index:
             product: firefox
             job-name: condprof-g5-geckoview_example
         dependencies:
-            build: build-android-api-16-shippable/opt
+            build: build-android-api-16/pgo
         fetches:
             build:
                 - artifact: target.condprof.tests.tar.gz
                 - artifact: geckoview_example.apk
                   extract: false
             toolchain:
                 - linux64-geckodriver
         run:
@@ -226,17 +226,17 @@ jobs:
         description: Creates or update conditioned profiles on Fenix+P2
         treeherder:
             symbol: condprof(fenix)
             platform: android-hw-p2-8-0-android-aarch64/opt
         index:
             product: firefox
             job-name: condprof-p2_aarch64-fenix.nightly
         dependencies:
-            build: build-android-api-16-shippable/opt
+            build: build-android-api-16/pgo
         fetches:
             build:
                 - artifact: target.condprof.tests.tar.gz
             toolchain:
                 - linux64-geckodriver
         run:
             run-as-root: true
             command: >-
@@ -260,17 +260,17 @@ jobs:
         description: Creates or update conditioned profiles on GeckoView+P2
         treeherder:
             symbol: condprof(geckoview)
             platform: android-hw-p2-8-0-android-aarch64/opt
         index:
             product: firefox
             job-name: condprof-p2_aarch64-geckoview_example
         dependencies:
-            build: build-android-api-16-shippable/opt
+            build: build-android-api-16/pgo
         fetches:
             build:
                 - artifact: target.condprof.tests.tar.gz
                 - artifact: geckoview_example.apk
                   extract: false
             toolchain:
                 - linux64-geckodriver
         run:
--- a/taskcluster/ci/generate-profile/kind.yml
+++ b/taskcluster/ci/generate-profile/kind.yml
@@ -77,17 +77,17 @@ jobs:
             cwd: '{checkout}'
             command: >
                 ./taskcluster/scripts/misc/run-profileserver.sh
         fetches:
             toolchain:
                 - linux64-clang
                 - linux64-minidump-stackwalk
 
-    android-api-16-shippable/opt:
+    android-api-16/pgo:
         description: "Android 4.0 api-16+ Profile Generation"
         shipping-phase: build
         shipping-product: fennec
         index:
             product: mobile
             job-name: android-api-16-profile
         treeherder:
             platform: android-4-0-armv7-api16/pgo
--- a/taskcluster/ci/instrumented-build/kind.yml
+++ b/taskcluster/ci/instrumented-build/kind.yml
@@ -119,17 +119,17 @@ jobs:
                 - linux64-rust-macos
                 - linux64-rust-size
                 - linux64-cbindgen
                 - linux64-nasm
                 - linux64-node
                 - linux64-lucetc
                 - wasi-sysroot
 
-    android-api-16-shippable/opt:
+    android-api-16/pgo:
         description: "Android 4.0 api-16+ PGO instrumented"
         index:
             product: mobile
             job-name: instrumented-android-api-16
         shipping-product: fennec
         treeherder:
             platform: android-4-0-armv7-api16/pgo
         worker-type: b-linux
--- a/taskcluster/ci/shippable-l10n/kind.yml
+++ b/taskcluster/ci/shippable-l10n/kind.yml
@@ -53,17 +53,21 @@ job-template:
                 macosx64.*:
                     - linux64-libdmg
                     - linux64-hfsplus
     tooltool:
         by-build-platform:
             default: internal
             linux.*: public
     index:
-        type: shippable-l10n
+        type:
+            by-build-platform:
+                # Defer swapping index's until a later patch
+                .*devedition.*: nightly-l10n
+                default: shippable-l10n
         product:
             by-build-platform:
                 default: firefox
                 .*-devedition: devedition
         job-name:
             by-build-platform:
                 linux-shippable: linux-opt
                 linux64-shippable: linux64-opt
--- a/taskcluster/ci/test/browsertime-mobile.yml
+++ b/taskcluster/ci/test/browsertime-mobile.yml
@@ -7,17 +7,16 @@ job-defaults:
     suite: raptor
     workdir: /builds/worker
     run-on-projects:
         by-app:
             refbrow: []
             default:
                 by-test-platform:
                     android-hw-p2-.*aarch64.*/pgo: ["mozilla-central", "try"]
-                    android-hw-p2-.*aarch64-shippable/opt: ["mozilla-central", "try"]
                     default: []
     tier: 3
     target:
         by-app:
             fenix:
                 by-test-platform:
                     android-hw.*-aarch64.*/.*:
                         index: project.mobile.fenix.v2.nightly.latest
@@ -113,26 +112,24 @@ browsertime-tp6m:
         by-raptor-test:
             amazon:
                 by-app:
                     fenix: []
                     chrome-m: []
                     default:
                         by-test-platform:
                             android-hw-p2-.*aarch64.*/pgo: ["mozilla-central", "try"]
-                            android-hw-p2-.*aarch64-shippable/opt: ["mozilla-central", "try"]
                             default: []
             youtube:
                 by-app:
                     fenix: []
                     chrome-m: []
                     default:
                         by-test-platform:
                             android-hw-p2-.*aarch64.*/pgo: ["mozilla-central", "try"]
-                            android-hw-p2-.*aarch64-shippable/opt: ["mozilla-central", "try"]
                             default: []
             default: []
     pageload:
         by-app:
             fenix: both
             default: cold
     run-visual-metrics:
         by-app:
@@ -199,15 +196,14 @@ browsertime-speedometer-mobile:
             fenix: 1
             default: 3
     run-on-projects:
         by-app:
             fenix: []
             default:
                 by-test-platform:
                     android-hw-p2-.*aarch64.*/pgo: ["mozilla-central", "try"]
-                    android-hw-p2-.*aarch64-shippable/opt: ["mozilla-central", "try"]
                     default: []
     treeherder-symbol: Btime(sp)
     mozharness:
         extra-options:
             - --browsertime
             - --test=speedometer
--- a/taskcluster/ci/test/compiled.yml
+++ b/taskcluster/ci/test/compiled.yml
@@ -81,17 +81,17 @@ jittest:
             # would succeed. The beginning /?=linux/ is needed because the
             # platform "linux64" doesn't have enough characters for both the
             # beginning /linux/ and the final /...../.
             #
             # Additionally, platforms contain suffixes like "/opt" or "/debug".
             (?=linux).*(?!-ccov)...../.*: []  # redundant with SM(...)
             (?=windows).*(?!-ccov)...../.*: []  # redundant with SM(p)
             android-hw-.*-aarch64/debug: ['try', 'mozilla-central', 'release']
-            android-hw-.*-api-16(?:-shippable)?/.*: ['try', 'mozilla-central', 'release']
+            android-hw-.*-api-16/.*: ['try', 'mozilla-central', 'release']
             default: built-projects
     chunks:
         by-test-platform:
             windows.*: 1
             windows10-64-ccov/debug: 8
             windows10-64-ccov/opt: 8
             macosx.*/opt: 1
             macosx.*/debug: 3
--- a/taskcluster/ci/test/mochitest.yml
+++ b/taskcluster/ci/test/mochitest.yml
@@ -263,19 +263,18 @@ mochitest-media:
     schedules-component: mochitest-plain
     max-run-time:
         by-test-platform:
             windows10-64-ccov/.*: 7200
             macosx.*64-ccov/.*: 7200
             default: 5400
     run-on-projects:
         by-test-platform:
-            android-hw-.*(?<!-shippable)/opt: []
+            android-hw-.*/opt: []
             android-hw-.*-api-16/(?:debug|pgo)?: [trunk', 'mozilla-beta', 'mozilla-release']
-            android-hw-.*-api-16-shippable/opt: ['trunk', 'mozilla-beta', 'mozilla-release']
             windows10-aarch64/.*: ['mozilla-central', 'mozilla-beta', 'mozilla-release']
             default: built-projects
     variants:
         by-test-platform:
             android.*: ['socketprocess']
             linux1804-64/debug: ['fission', 'socketprocess']
             default: ['fission', 'socketprocess']
     loopback-video: true
--- a/taskcluster/ci/test/raptor-fennec68.yml
+++ b/taskcluster/ci/test/raptor-fennec68.yml
@@ -315,68 +315,61 @@ raptor-scn-power-idle-bg-fennec68:
 
 raptor-youtube-playback-fennec68:
     description: "Raptor YouTube Playback on Fennec68"
     try-name: raptor-youtube-playback-fennec68
     treeherder-symbol: Rap(ytp)
     run-on-projects:
         by-test-platform:
             android-hw-p2.*aarch64.*/pgo: ['mozilla-central']
-            android-hw-p2.*aarch64-shippable/opt: ['mozilla-central']
             android-hw-g5.*/pgo: ['mozilla-central']
-            android-hw-g5.*-shippable/opt: ['mozilla-central']
             default: []
     mozharness:
         extra-options:
             - --test=raptor-youtube-playback-fennec68
             - --app=fennec
             - --binary=org.mozilla.firefox
 
 raptor-youtube-playback-av1-sfr-fennec68:
     description: "Raptor YouTube Playback AV1 SFR on Fennec68"
     try-name: raptor-youtube-playback-av1-sfr-fennec68
     treeherder-symbol: Rap(ytp-av1-sfr)
     run-on-projects:
         by-test-platform:
             android-hw-p2.*aarch64.*/pgo: ['mozilla-central']
-            android-hw-p2.*aarch64-shippable/opt: ['mozilla-central']
             android-hw-g5.*/pgo: ['mozilla-central']
-            android-hw-g5.*-shippable/opt: ['mozilla-central']
             default: []
     mozharness:
         extra-options:
             - --test=raptor-youtube-playback-av1-sfr-fennec68
             - --app=fennec
             - --binary=org.mozilla.firefox
 
 raptor-youtube-playback-h264-sfr-fennec68:
     description: "Raptor YouTube Playback H264 SFR on Fennec68"
     try-name: raptor-youtube-playback-h264-sfr-fennec68
     treeherder-symbol: Rap(ytp-h264-sfr)
     run-on-projects:
         by-test-platform:
             android-hw-p2.*aarch64.*/pgo: ['mozilla-central']
-            android-hw-p2.*aarch64-shippable/opt: ['mozilla-central']
             android-hw-g5.*/pgo: ['mozilla-central']
-            android-hw-g5.*-shippable/opt: ['mozilla-central']
             default: []
     mozharness:
         extra-options:
             - --test=raptor-youtube-playback-h264-sfr-fennec68
             - --app=fennec
             - --binary=org.mozilla.firefox
 
 raptor-youtube-playback-vp9-sfr-fennec68:
     description: "Raptor YouTube Playback VP9 SFR on Fennec68"
     try-name: raptor-youtube-playback-vp9-sfr-fennec68
     treeherder-symbol: Rap(ytp-vp9-sfr)
     run-on-projects:
         by-test-platform:
             android-hw-p2.*aarch64.*/pgo: ['mozilla-central']
-            android-hw-p2.*aarch64-shippable/opt: ['mozilla-central']
             default: []
     mozharness:
         extra-options:
             - --test=raptor-youtube-playback-vp9-sfr-fennec68
             - --app=fennec
             - --binary=org.mozilla.firefox
 
 raptor-youtube-playback-widevine-hfr-fennec68:
--- a/taskcluster/ci/test/raptor-gve.yml
+++ b/taskcluster/ci/test/raptor-gve.yml
@@ -5,26 +5,24 @@
 job-defaults:
     max-run-time: 1800
     suite: raptor
     workdir: /builds/worker
     run-on-projects:
         by-test-name:
             raptor-tp6m-.*-cold:
                 by-test-platform:
-                    android-hw-.*(?<!-shippable)/opt: []
+                    android-hw-.*/opt: []
                     android-hw-p2-.*api-16/pgo: []
-                    android-hw-p2-.*api-16-shippable/opt: []
                     default: ['trunk', 'mozilla-beta']
             default:
                 by-test-platform:
                     android-hw-p2-.*-api-16/(?!opt).*: []
-                    android-hw-p2-.*-api-16-shippable/opt: []
-                    android-hw-p2-.*?(?<!-aarch64-shippable)/opt.*: []
-                    android-hw(?!-p2).*(?<!-api-16-shippable)/opt.*: []
+                    android-hw-p2-.*(?!-api-16)/opt.*: []
+                    android-hw(?!-p2).*(?!-api-16)/opt.*: []
                     default: ['mozilla-central']
     target: geckoview_example.apk
     tier: 1
     virtualization: hardware
     mozharness:
         script: raptor_script.py
         config:
             - raptor/android_hw_config.py
@@ -128,22 +126,20 @@ raptor-tp6m-9-geckoview:
             - --activity=org.mozilla.geckoview_example.GeckoViewActivity
 
 raptor-speedometer-geckoview:
     description: "Raptor Speedometer on GeckoView"
     try-name: raptor-speedometer-geckoview
     treeherder-symbol: Rap(sp)
     run-on-projects:
         by-test-platform:
-            android-hw-.*(?<!-shippable)/opt: []
+            android-hw-.*/opt: []
             android-hw-p2-.*api-16/pgo: []
             android-hw-p2-.*aarch64.*/pgo: ['trunk', 'mozilla-beta']
-            android-hw-p2-.*aarch64-shippable/opt: ['trunk', 'mozilla-beta']
             android-hw-g5.*/pgo: ['trunk', 'mozilla-beta']
-            android-hw-g5.*-shippable/opt: ['trunk', 'mozilla-beta']
             default: ['mozilla-central', 'mozilla-beta']
     max-run-time: 900
     mozharness:
         extra-options:
             - --test=raptor-speedometer
             - --app=geckoview
             - --binary=org.mozilla.geckoview_example
             - --activity=org.mozilla.geckoview_example.GeckoViewActivity
@@ -284,21 +280,19 @@ raptor-scn-cpu-memory-power-idle-bg-geck
             - --activity=org.mozilla.geckoview_example.GeckoViewActivity
 
 raptor-unity-webgl-geckoview:
     description: "Raptor Unity WebGL on GeckoView"
     try-name: raptor-unity-webgl-geckoview
     treeherder-symbol: Rap(ugl)
     run-on-projects:
         by-test-platform:
-            android-hw-.*(?<!-shippable)/opt: []
+            android-hw-.*/opt: []
             android-hw-p2-.*api-16/pgo: []
-            android-hw-p2-.*api-16-shippable/opt: []
             android-hw-(?!p2-.*api-16)/pgo: ['trunk', 'mozilla-beta']
-            android-hw-(?!p2-.*api-16)-shippable/opt: ['trunk', 'mozilla-beta']
             default: ['mozilla-central', 'mozilla-beta']
     max-run-time: 900
     mozharness:
         extra-options:
             - --test=raptor-unity-webgl
             - --app=geckoview
             - --binary=org.mozilla.geckoview_example
             - --activity=org.mozilla.geckoview_example.GeckoViewActivity
@@ -308,19 +302,17 @@ raptor-unity-webgl-geckoview:
 
 raptor-youtube-playback-geckoview:
     description: "Raptor YouTube Playback on GeckoView"
     try-name: raptor-youtube-playback-geckoview
     treeherder-symbol: Rap(ytp)
     run-on-projects:
         by-test-platform:
             android-hw-p2.*aarch64.*/pgo: ['mozilla-central']
-            android-hw-p2.*aarch64-shippable/opt: ['mozilla-central']
             android-hw-g5.*/pgo: ['mozilla-central']
-            android-hw-g5.*-shippable/opt: ['mozilla-central']
             default: []
     max-run-time: 3000
     mozharness:
         extra-options:
             - --test=raptor-youtube-playback
             - --app=geckoview
             - --binary=org.mozilla.geckoview_example
             - --activity=org.mozilla.geckoview_example.GeckoViewActivity
@@ -330,53 +322,48 @@ raptor-youtube-playback-geckoview:
 
 raptor-youtube-playback-av1-sfr-geckoview:
     description: "Raptor YouTube Playback AV1 SFR on GeckoView"
     try-name: raptor-youtube-playback-av1-sfr-geckoview
     treeherder-symbol: Rap(ytp-av1-sfr)
     run-on-projects:
         by-test-platform:
             android-hw-p2.*aarch64.*/pgo: ['mozilla-central']
-            android-hw-p2.*aarch64-shippable/opt: ['mozilla-central']
             android-hw-g5.*/pgo: ['mozilla-central']
-            android-hw-g5.*-shippable/opt: ['mozilla-central']
             default: []
     mozharness:
         extra-options:
             - --test=raptor-youtube-playback-av1-sfr
             - --app=geckoview
             - --binary=org.mozilla.geckoview_example
             - --activity=org.mozilla.geckoview_example.GeckoViewActivity
 
 raptor-youtube-playback-h264-sfr-geckoview:
     description: "Raptor YouTube Playback H264 SFR on GeckoView"
     try-name: raptor-youtube-playback-h264-sfr-geckoview
     treeherder-symbol: Rap(ytp-h264-sfr)
     run-on-projects:
         by-test-platform:
             android-hw-p2.*aarch64.*/pgo: ['mozilla-central']
-            android-hw-p2.*aarch64-shippable/opt: ['mozilla-central']
             android-hw-g5.*/pgo: ['mozilla-central']
-            android-hw-g5.*-shippable/opt: ['mozilla-central']
             default: []
     mozharness:
         extra-options:
             - --test=raptor-youtube-playback-h264-sfr
             - --app=geckoview
             - --binary=org.mozilla.geckoview_example
             - --activity=org.mozilla.geckoview_example.GeckoViewActivity
 
 raptor-youtube-playback-vp9-sfr-geckoview:
     description: "Raptor YouTube Playback VP9 SFR on GeckoView"
     try-name: raptor-youtube-playback-vp9-sfr-geckoview
     treeherder-symbol: Rap(ytp-vp9-sfr)
     run-on-projects:
         by-test-platform:
             android-hw-p2.*aarch64.*/pgo: ['mozilla-central']
-            android-hw-p2.*aarch64-shippable/opt: ['mozilla-central']
             default: []
     mozharness:
         extra-options:
             - --test=raptor-youtube-playback-vp9-sfr
             - --app=geckoview
             - --binary=org.mozilla.geckoview_example
             - --activity=org.mozilla.geckoview_example.GeckoViewActivity
 
--- a/taskcluster/ci/test/reftest.yml
+++ b/taskcluster/ci/test/reftest.yml
@@ -97,18 +97,18 @@ jsreftest:
         by-test-platform:
             windows10-64-ccov/.*: 7200
             macosx.*64-ccov/.*: 7200
             linux.*64-ccov/.*: 7200
             default: 3600
     tier: default
     run-on-projects:
         by-test-platform:
-            android-hw-.*-aarch64(?:-shippable)?/.*: ['try', 'mozilla-central', 'release']
-            android-hw-.*-api-16(?:-shippable)?/.*: ['try', 'mozilla-central', 'release']
+            android-hw-.*-aarch64/.*: ['try', 'mozilla-central', 'release']
+            android-hw-.*-api-16/.*: ['try', 'mozilla-central', 'release']
             default: built-projects
 
 reftest:
     description: "Reftest run"
     treeherder-symbol: R(R)
     virtualization: virtual-with-gpu
     chunks:
         by-test-platform:
--- a/taskcluster/ci/test/test-platforms.yml
+++ b/taskcluster/ci/test/test-platforms.yml
@@ -395,30 +395,30 @@ android-hw-g5-7-0-arm7-api-16/opt:
     test-sets:
         - android-hw-arm7-browsertime
         - android-hw-arm7-raptor
         - android-hw-arm7-raptor-power
         - android-hw-arm7-raptor-cpu-memory
         - android-hw-arm7-raptor-cpu-memory-power
         - raptor-fetch-geckoview
 
-android-hw-g5-7-0-arm7-api-16-shippable/opt:
-    build-platform: android-api-16-shippable/opt
+android-hw-g5-7-0-arm7-api-16/pgo:
+    build-platform: android-api-16-pgo/opt
     test-sets:
         - android-hw-arm7-browsertime
         - android-hw-arm7-raptor
         - android-hw-arm7-raptor-power
         - android-hw-arm7-raptor-cpu-memory
         - android-hw-arm7-raptor-cpu-memory-power
         - raptor-fetch-geckoview
 
 # android-hw-p2-8-0 Google Pixel 2 Android 8.0
 
-android-hw-p2-8-0-arm7-api-16-shippable/opt:
-    build-platform: android-api-16-shippable/opt
+android-hw-p2-8-0-arm7-api-16/pgo:
+    build-platform: android-api-16-pgo/opt
     test-sets:
         - android-hw-arm7-pgo-unittests
 
 android-hw-p2-8-0-arm7-api-16/opt:
     build-platform: android-api-16/opt
     test-sets:
         - android-hw-arm7-browsertime
         - android-hw-arm7-raptor
@@ -447,18 +447,18 @@ android-hw-p2-8-0-android-aarch64/opt:
     test-sets:
         - android-hw-aarch64-browsertime
         - android-hw-aarch64-opt-unittests
         - android-hw-aarch64-raptor
         - android-hw-aarch64-raptor-power
         - android-hw-aarch64-raptor-cpu-memory
         - android-hw-aarch64-raptor-cpu-memory-power
 
-android-hw-p2-8-0-android-aarch64-shippable/opt:
-    build-platform: android-aarch64-shippable/opt
+android-hw-p2-8-0-android-aarch64/pgo:
+    build-platform: android-aarch64-pgo/opt
     test-sets:
         - android-hw-aarch64-browsertime
         - android-hw-aarch64-pgo-unittests
         - android-hw-aarch64-raptor
         - android-hw-aarch64-raptor-power
         - android-hw-aarch64-raptor-cpu-memory
         - android-hw-aarch64-raptor-cpu-memory-power
 
--- a/taskcluster/taskgraph/loader/test.py
+++ b/taskcluster/taskgraph/loader/test.py
@@ -46,16 +46,18 @@ def loader(kind, path, config, params, l
             test['build-platform'] = test_platform['build-platform']
             test['test-platform'] = test_platform_name
             test['build-label'] = test_platform['build-label']
             if test_platform.get('build-signing-label', None):
                 test['build-signing-label'] = test_platform['build-signing-label']
 
             test['build-attributes'] = test_platform['build-attributes']
             test['test-name'] = test_name
+            if test_platform.get('nightly'):
+                test.setdefault('attributes', {})['nightly'] = True
             if test_platform.get('shippable'):
                 test.setdefault('attributes', {})['shippable'] = True
                 test['attributes']['shipping_product'] = test_platform['shipping_product']
 
             logger.debug("Generating tasks for test {} on platform {}".format(
                 test_name, test['test-platform']))
             yield test
 
@@ -92,16 +94,19 @@ def get_test_platforms(test_platforms_cf
                     build_platform, test_platform))
             continue
         test_platforms[test_platform] = {
             'build-platform': build_platform,
             'build-label': builds_by_platform[build_platform].label,
             'build-attributes': builds_by_platform[build_platform].attributes,
         }
 
+        if builds_by_platform[build_platform].attributes.get('nightly'):
+            test_platforms[test_platform]['nightly'] = \
+                builds_by_platform[build_platform].attributes['nightly']
         if builds_by_platform[build_platform].attributes.get('shippable'):
             test_platforms[test_platform]['shippable'] = \
                 builds_by_platform[build_platform].attributes['shippable']
             test_platforms[test_platform]['shipping_product'] = \
                 builds_by_platform[build_platform].attributes['shipping_product']
 
         test_platforms[test_platform].update(cfg)
 
--- a/taskcluster/taskgraph/target_tasks.py
+++ b/taskcluster/taskgraph/target_tasks.py
@@ -47,19 +47,18 @@ def _target_task(name):
     return wrap
 
 
 def get_method(method):
     """Get a target_task_method to pass to a TaskGraphGenerator."""
     return _target_task_methods[method]
 
 
-def filter_out_shipping_phase(task, parameters):
+def filter_out_nightly(task, parameters):
     return (
-        # nightly still here because of geckodriver
         not task.attributes.get('nightly') and
         task.attributes.get('shipping_phase') in (None, 'build')
         )
 
 
 def filter_out_devedition(task, parameters):
     return not task.attributes.get('shipping_product') == 'devedition'
 
@@ -226,27 +225,27 @@ def target_tasks_try_auto(full_task_grap
 
     Should do the same thing as the `default` target tasks method.
     """
     params = dict(parameters)
     params['project'] = 'autoland'
     parameters = Parameters(**params)
     return [l for l, t in six.iteritems(full_task_graph.tasks)
             if standard_filter(t, parameters)
-            and filter_out_shipping_phase(t, parameters)
+            and filter_out_nightly(t, parameters)
             and filter_tasks_by_blacklist(t.label)]
 
 
 @_target_task('default')
 def target_tasks_default(full_task_graph, parameters, graph_config):
     """Target the tasks which have indicated they should be run on this project
     via the `run_on_projects` attributes."""
     return [l for l, t in six.iteritems(full_task_graph.tasks)
             if standard_filter(t, parameters)
-            and filter_out_shipping_phase(t, parameters)
+            and filter_out_nightly(t, parameters)
             and filter_out_devedition(t, parameters)]
 
 
 @_target_task('graphics_tasks')
 def target_tasks_graphics(full_task_graph, parameters, graph_config):
     """In addition to doing the filtering by project that the 'default'
        filter does, also remove artifact builds because we have csets on
        the graphics branch that aren't on the candidate branches of artifact
@@ -427,18 +426,18 @@ def target_tasks_pine(full_task_graph, p
     def filter(task):
         platform = task.attributes.get('build_platform')
         # disable mobile jobs
         if str(platform).startswith('android'):
             return False
         # disable asan
         if platform == 'linux64-asan':
             return False
-        # disable non-pine and tasks with a shipping phase
-        if standard_filter(task, parameters) or filter_out_shipping_phase(task, parameters):
+        # disable non-pine and nightly tasks
+        if standard_filter(task, parameters) or filter_out_nightly(task, parameters):
             return True
     return [l for l, t in six.iteritems(full_task_graph.tasks) if filter(t)]
 
 
 @_target_task('kaios_tasks')
 def target_tasks_kaios(full_task_graph, parameters, graph_config):
     """The set of tasks to run for kaios integration"""
     def filter(task):
@@ -504,42 +503,42 @@ def target_tasks_general_perf_testing(fu
         if vismet:
             # Visual metric tasks are configured a bit differently
             platform = task.task.get('extra').get('treeherder-platform')
             try_name = task.label
 
         # Run chrome and chromium on all platforms available
         if '-chrome' in try_name:
             if 'android' in platform:
-                # Run only on shippable android builds
-                if 'shippable' in platform:
+                # Run only on pgo android builds
+                if 'pgo' in platform:
                     return True
                 else:
                     return False
             else:
                 # Run on all desktop builds
                 return True
         if '-chromium' in try_name:
             return True
 
         # Run raptor scn-power-idle and speedometer for fenix and fennec68
-        if 'shippable' in platform:
+        if 'pgo' in platform:
             if 'raptor-scn-power-idle' in try_name \
                     and ('-fenix' in try_name or '-fennec68' in try_name):
                 return True
             if 'raptor-speedometer' in try_name \
                     and '-fennec68' in try_name:
                 return True
             if 'raptor-speedometer' in try_name \
                     and 'power' in try_name \
                     and 'fenix' in try_name:
                 return True
 
         # Select browsertime tasks
-        if 'browsertime' in try_name and 'shippable' in platform:
+        if 'browsertime' in try_name and 'pgo' in platform:
             if 'speedometer' in try_name:
                 return True
             if '-live' in try_name:
                 return True
             return False
 
         # Run the following tests on android geckoview
         if platform and 'android' not in platform:
@@ -549,85 +548,88 @@ def target_tasks_general_perf_testing(fu
 
         # Run cpu+memory, and power tests
         cpu_n_memory_task = '-cpu' in try_name and '-memory' in try_name
         power_task = '-power' in try_name
         # Ignore cpu+memory+power tests
         if power_task and cpu_n_memory_task:
             return False
         if power_task or cpu_n_memory_task:
-            if 'shippable' not in platform:
+            if 'pgo' not in platform:
                 return False
             if '-speedometer-' in try_name:
                 return True
             if '-scn' in try_name and '-idle' in try_name:
                 return True
         return False
 
     return [l for l, t in six.iteritems(full_task_graph.tasks) 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([
             filter_on_platforms(task, platforms),
             filter_for_project(task, parameters),
-            task.attributes.get('shippable', False),
+            any([
+                task.attributes.get('nightly', False),
+                task.attributes.get('shippable', False),
+            ]),
             # Tests and nightly only builds don't have `shipping_product` set
             task.attributes.get('shipping_product') in {None, "firefox", "thunderbird"},
             task.kind not in {'l10n'},  # no on-change l10n
         ])
     return filter
 
 
 @_target_task('nightly_linux')
 def target_tasks_nightly_linux(full_task_graph, parameters, graph_config):
     """Select the set of tasks required for a nightly build of linux. The
     nightly build process involves a pipeline of builds, signing,
     and, eventually, uploading the tasks to balrog."""
     filter = make_desktop_nightly_filter({
-        'linux64-shippable', 'linux-shippable'
+        'linux64-nightly', 'linux-nightly', 'linux64-shippable', 'linux-shippable'
         })
     return [l for l, t in six.iteritems(full_task_graph.tasks) if filter(t, parameters)]
 
 
 @_target_task('nightly_macosx')
 def target_tasks_nightly_macosx(full_task_graph, parameters, graph_config):
     """Select the set of tasks required for a nightly build of macosx. The
     nightly build process involves a pipeline of builds, signing,
     and, eventually, uploading the tasks to balrog."""
-    filter = make_desktop_nightly_filter({'macosx64-shippable'})
+    filter = make_desktop_nightly_filter({'macosx64-nightly', 'macosx64-shippable'})
     return [l for l, t in six.iteritems(full_task_graph.tasks) if filter(t, parameters)]
 
 
 @_target_task('nightly_win32')
 def target_tasks_nightly_win32(full_task_graph, parameters, graph_config):
     """Select the set of tasks required for a nightly build of win32 and win64.
     The nightly build process involves a pipeline of builds, signing,
     and, eventually, uploading the tasks to balrog."""
-    filter = make_desktop_nightly_filter({'win32-shippable'})
+    filter = make_desktop_nightly_filter({'win32-nightly', 'win32-shippable'})
     return [l for l, t in six.iteritems(full_task_graph.tasks) if filter(t, parameters)]
 
 
 @_target_task('nightly_win64')
 def target_tasks_nightly_win64(full_task_graph, parameters, graph_config):
     """Select the set of tasks required for a nightly build of win32 and win64.
     The nightly build process involves a pipeline of builds, signing,
     and, eventually, uploading the tasks to balrog."""
-    filter = make_desktop_nightly_filter({'win64-shippable'})
+    filter = make_desktop_nightly_filter({'win64-nightly', 'win64-shippable'})
     return [l for l, t in six.iteritems(full_task_graph.tasks) if filter(t, parameters)]
 
 
 @_target_task('nightly_win64_aarch64')
 def target_tasks_nightly_win64_aarch64(full_task_graph, parameters, graph_config):
     """Select the set of tasks required for a nightly build of win32 and win64.
     The nightly build process involves a pipeline of builds, signing,
     and, eventually, uploading the tasks to balrog."""
-    filter = make_desktop_nightly_filter({'win64-aarch64-shippable'})
+    filter = make_desktop_nightly_filter({'win64-aarch64-nightly', 'win64-aarch64-shippable'})
     return [l for l, t in six.iteritems(full_task_graph.tasks) if filter(t, parameters)]
 
 
 @_target_task('nightly_asan')
 def target_tasks_nightly_asan(full_task_graph, parameters, graph_config):
     """Select the set of tasks required for a nightly build of asan. The
     nightly build process involves a pipeline of builds, signing,
     and, eventually, uploading the tasks to balrog."""
@@ -838,17 +840,17 @@ def target_tasks_raptor_tp6m(full_task_g
         platform = task.attributes.get('build_platform')
         attributes = task.attributes
 
         if platform and 'android' not in platform:
             return False
         if attributes.get('unittest_suite') != 'raptor':
             return False
         try_name = attributes.get('raptor_try_name')
-        if '-cold' in try_name and 'shippable' in platform:
+        if '-cold' in try_name and 'pgo' in platform:
             if '-1-refbrow-' in try_name:
                 return True
             # Get browsertime amazon smoke tests
             if 'browsertime' in try_name and \
                'amazon' in try_name and 'search' not in try_name and \
                'fenix' in try_name:
                 return True
 
--- a/taskcluster/taskgraph/transforms/beetmover.py
+++ b/taskcluster/taskgraph/transforms/beetmover.py
@@ -109,16 +109,17 @@ def make_task_description(config, jobs):
         }
 
         yield task
 
 
 def craft_release_properties(config, job):
     params = config.params
     build_platform = job['attributes']['build_platform']
+    build_platform = build_platform.replace('-nightly', '')
     build_platform = build_platform.replace('-shippable', '')
     if build_platform.endswith("-source"):
         build_platform = build_platform.replace('-source', '-release')
 
     # XXX This should be explicitly set via build attributes or something
     if 'android' in job['label'] or 'fennec' in job['label']:
         app_name = 'Fennec'
     elif config.graph_config['trust-domain'] == 'comm':
--- a/taskcluster/taskgraph/transforms/build.py
+++ b/taskcluster/taskgraph/transforms/build.py
@@ -166,12 +166,13 @@ def enable_full_crashsymbols(config, job
 @transforms.add
 def use_artifact(config, jobs):
     if config.params.is_try():
         use_artifact = config.params['try_task_config'].get('use-artifact-builds', False)
     else:
         use_artifact = False
     for job in jobs:
         if (config.kind == 'build' and use_artifact and
+            not job.get('attributes', {}).get('nightly', False) and
             job.get('index', {}).get('job-name') in ARTIFACT_JOBS):
             job['treeherder']['symbol'] += 'a'
             job['worker']['env']['USE_ARTIFACT'] = '1'
         yield job
--- a/taskcluster/taskgraph/transforms/build_lints.py
+++ b/taskcluster/taskgraph/transforms/build_lints.py
@@ -34,24 +34,25 @@ def check_mozharness_perfherder_options(
             yield job
             continue
 
         worker = job.get('worker', {})
 
         platform = job['treeherder']['platform']
         primary_config = job['run']['config'][0]
         options = worker.get('env', {}).get('PERFHERDER_EXTRA_OPTIONS')
+        nightly = job.get('attributes', {}).get('nightly', False)
         shippable = job.get('attributes', {}).get('shippable', False)
 
         # This isn't strictly necessary. But the Perfherder code looking at the
         # values we care about is only active on builds. So it doesn't make
         # sense to run this linter elsewhere.
         assert primary_config.startswith('builds/')
 
-        key = (platform, primary_config, shippable, options)
+        key = (platform, primary_config, (nightly or shippable), options)
 
         if key in SEEN_CONFIGS:
             raise Exception(
                 'Non-unique Perfherder data collection for jobs %s-%s and %s: '
                 'set PERFHERDER_EXTRA_OPTIONS in worker environment variables '
                 'or use different mozconfigs'
                 % (config.kind, job['name'], SEEN_CONFIGS[key]))
 
--- a/taskcluster/taskgraph/transforms/build_signing.py
+++ b/taskcluster/taskgraph/transforms/build_signing.py
@@ -20,17 +20,25 @@ def add_signed_routes(config, jobs):
     """Add routes corresponding to the routes of the build task
        this corresponds to, with .signed inserted, for all gecko.v2 routes"""
 
     for job in jobs:
         dep_job = job['primary-dependency']
         enable_signing_routes = job.pop('enable-signing-routes', True)
 
         job['routes'] = []
-        if dep_job.attributes.get('shippable') and enable_signing_routes:
+        if dep_job.attributes.get('nightly') and enable_signing_routes:
+            for dep_route in dep_job.task.get('routes', []):
+                if not dep_route.startswith('index.gecko.v2'):
+                    continue
+                branch = dep_route.split(".")[3]
+                rest = ".".join(dep_route.split(".")[4:])
+                job['routes'].append(
+                    'index.gecko.v2.{}.signed-nightly.{}'.format(branch, rest))
+        elif dep_job.attributes.get('shippable') and enable_signing_routes:
             for dep_route in dep_job.task.get('routes', []):
                 if not dep_route.startswith('index.gecko.v2'):
                     continue
                 branch = dep_route.split(".")[3]
                 rest = ".".join(dep_route.split(".")[4:])
                 job['routes'].append(
                     'index.gecko.v2.{}.signed.{}'.format(branch, rest))
 
--- a/taskcluster/taskgraph/transforms/geckodriver_signing.py
+++ b/taskcluster/taskgraph/transforms/geckodriver_signing.py
@@ -50,19 +50,19 @@ def make_signing_description(config, job
             if k != 'docker-image'
         })
 
         description = "Signing Geckodriver for build '{}'".format(
             attributes.get('build_platform'),
         )
 
         build_platform = dep_job.attributes.get('build_platform')
-        is_shippable = dep_job.attributes.get('shippable')
+        is_nightly = dep_job.attributes.get('nightly', dep_job.attributes.get('shippable'))
         signing_cert_scope = get_signing_cert_scope_per_platform(
-            build_platform, is_shippable, config
+            build_platform, is_nightly, config
         )
 
         upstream_artifacts = _craft_upstream_artifacts(dep_job, dep_job.kind, build_platform)
 
         scopes = [signing_cert_scope]
 
         platform = build_platform.split("-")[0]
 
--- a/taskcluster/taskgraph/transforms/job/mozharness_test.py
+++ b/taskcluster/taskgraph/transforms/job/mozharness_test.py
@@ -22,16 +22,17 @@ from taskgraph.transforms.tests import (
     test_description_schema,
     normpath
 )
 from taskgraph.transforms.job.common import (
     support_vcs_checkout,
 )
 
 VARIANTS = [
+    'nightly',
     'shippable',
     'devedition',
     'pgo',
     'asan',
     'stylo',
     'qr',
     'ccov',
 ]
@@ -51,20 +52,20 @@ mozharness_test_run_schema = Schema({
     Required('workdir'): text_type,
 })
 
 
 def test_packages_url(taskdesc):
     """Account for different platforms that name their test packages differently"""
     artifact_url = get_artifact_url('<build>', get_artifact_path(taskdesc,
                                     'target.test_packages.json'))
-    # for android shippable we need to add 'en-US' to the artifact url
+    # for android nightly we need to add 'en-US' to the artifact url
     test = taskdesc['run']['test']
     if 'android' in test['test-platform'] and (
-            get_variant(test['test-platform']) in ('shippable', )):
+            get_variant(test['test-platform']) in ("nightly", 'shippable')):
         head, tail = os.path.split(artifact_url)
         artifact_url = os.path.join(head, 'en-US', tail)
     return artifact_url
 
 
 @run_job_using('docker-worker', 'mozharness-test', schema=mozharness_test_run_schema)
 def mozharness_test_on_docker(config, job, taskdesc):
     run = job['run']
--- a/taskcluster/taskgraph/transforms/l10n.py
+++ b/taskcluster/taskgraph/transforms/l10n.py
@@ -132,17 +132,17 @@ l10n_description_schema = schema.extend(
 
     # Extra environment values to pass to the worker
     Optional('env'): _by_platform({text_type: taskref_or_string}),
 
     # Max number locales per chunk
     Optional('locales-per-chunk'): _by_platform(int),
 
     # Task deps to chain this task with, added in transforms from primary-dependency
-    # if this is a shippable-style build
+    # if this is a nightly
     Optional('dependencies'): {text_type: text_type},
 
     # Run the task when the listed files change (if present).
     Optional('when'): {
         'files-changed': [text_type]
     },
 
     # passed through directly to the job description
@@ -206,17 +206,17 @@ def copy_in_useful_magic(config, jobs):
         job['attributes'] = attributes
         yield job
 
 
 transforms.add_validate(l10n_description_schema)
 
 
 @transforms.add
-def setup_shippable_dependency(config, jobs):
+def setup_nightly_dependency(config, jobs):
     """ Sets up a task dependency to the signing job this relates to """
     for job in jobs:
         job['dependencies'] = {'build': job['dependent-tasks']['build'].label}
         if job['attributes']['build_platform'].startswith('win') or \
                 job['attributes']['build_platform'].startswith('linux'):
             job['dependencies'].update({
                 'build-signing': job['dependent-tasks']['build-signing'].label,
             })
@@ -277,16 +277,17 @@ def handle_artifact_prefix(config, jobs)
                     )
         yield job
 
 
 @transforms.add
 def all_locales_attribute(config, jobs):
     for job in jobs:
         locales_platform = job['attributes']['build_platform'].replace("-shippable", "")
+        locales_platform = locales_platform.replace("-nightly", "")
         locales_platform = locales_platform.replace("-pgo", "")
         locales_with_changesets = parse_locales_file(job["locales-file"],
                                                      platform=locales_platform)
         locales_with_changesets = _remove_locales(locales_with_changesets,
                                                   to_remove=job['ignore-locales'])
 
         locales = sorted(locales_with_changesets.keys())
         attributes = job.setdefault('attributes', {})
--- a/taskcluster/taskgraph/transforms/mar_signing.py
+++ b/taskcluster/taskgraph/transforms/mar_signing.py
@@ -123,17 +123,18 @@ def make_task_description(config, jobs):
             upstream_artifacts = generate_partials_artifacts(
                 dep_job, config.params['release_history'], build_platform, locale)
         else:
             upstream_artifacts = generate_complete_artifacts(dep_job, config.kind)
 
         is_shippable = job.get(
             'shippable',  # First check current job
             dep_job.attributes.get(
-                'shippable'))  # Then dep job for 'shippable'
+                'shippable',  # Then dep job for 'shippable'
+                dep_job.attributes.get('nightly')))  # lastly dep job for 'nightly'
         signing_cert_scope = get_signing_cert_scope_per_platform(
             build_platform, is_shippable, config
         )
 
         scopes = [signing_cert_scope]
 
         task = {
             'label': label,
--- a/taskcluster/taskgraph/transforms/partner_repack.py
+++ b/taskcluster/taskgraph/transforms/partner_repack.py
@@ -63,23 +63,25 @@ def add_command_arguments(config, tasks)
     release_config = get_release_config(config)
     all_locales = set()
     for partner_class in config.params['release_partner_config'].values():
         for partner in partner_class.values():
             for sub_partner in partner.values():
                 all_locales.update(sub_partner.get('locales', []))
     for task in tasks:
         # add the MOZHARNESS_OPTIONS, eg version=61.0, build-number=1, platform=win64
-        if not task['attributes']['build_platform'].endswith('-shippable'):
+        if not task['attributes']['build_platform'].endswith('-shippable') and \
+                not task['attributes']['build_platform'].endswith('-nightly'):
             raise Exception(
                 "Unexpected partner repack platform: {}".format(
                     task['attributes']['build_platform'],
                 ),
             )
         platform = task['attributes']['build_platform'].partition('-shippable')[0]
+        platform = platform.partition('-nightly')[0]
         task['run']['options'] = [
             'version={}'.format(release_config['version']),
             'build-number={}'.format(release_config['build_number']),
             'platform={}'.format(platform),
         ]
         if task['extra']['limit-locales']:
             for locale in all_locales:
                 task['run']['options'].append('limit-locale={}'.format(locale))
--- a/taskcluster/taskgraph/transforms/release_sign_and_push_langpacks.py
+++ b/taskcluster/taskgraph/transforms/release_sign_and_push_langpacks.py
@@ -79,19 +79,21 @@ def copy_attributes(config, jobs):
         yield job
 
 
 @transforms.add
 def filter_out_macos_jobs_but_mac_only_locales(config, jobs):
     for job in jobs:
         build_platform = job['primary-dependency'].attributes.get('build_platform')
 
-        if build_platform in ('linux64-devedition', 'linux64-shippable'):
+        if build_platform in (
+                'linux64-nightly', 'linux64-devedition', 'linux64-shippable'):
             yield job
-        elif build_platform in ('macosx64-devedition', 'macosx64-shippable') and \
+        elif build_platform in (
+                'macosx64-nightly', 'macosx64-devedition', 'macosx64-shippable') and \
                 'ja-JP-mac' in job['attributes']['chunk_locales']:
             # Other locales of the same job shouldn't be processed
             job['attributes']['chunk_locales'] = ['ja-JP-mac']
             job['label'] = job['label'].replace(
                 # Guard against a chunk 10 or chunk 1 (latter on try) weird munging
                 "-{}/".format(job['attributes']['l10n_chunk']), '-ja-JP-mac/'
             )
             yield job
--- a/taskcluster/taskgraph/transforms/repackage.py
+++ b/taskcluster/taskgraph/transforms/repackage.py
@@ -200,17 +200,20 @@ def make_job_description(config, jobs):
         attributes = copy_attributes_from_dependent_job(dep_job)
         attributes['repackage_type'] = 'repackage'
 
         locale = attributes.get('locale', job.get('locale'))
         if locale:
             attributes['locale'] = locale
 
         treeherder = job.get('treeherder', {})
-        treeherder.setdefault('symbol', 'Rpk')
+        if attributes.get('nightly'):
+            treeherder.setdefault('symbol', 'Nr')
+        else:
+            treeherder.setdefault('symbol', 'Rpk')
         dep_th_platform = dep_job.task.get('extra', {}).get('treeherder-platform')
         treeherder.setdefault('platform', dep_th_platform)
         treeherder.setdefault('tier', 1)
         treeherder.setdefault('kind', 'build')
 
         if config.kind == 'repackage-msi':
             treeherder['symbol'] = 'MSI({})'.format(locale or 'N')
 
--- a/taskcluster/taskgraph/transforms/repackage_routes.py
+++ b/taskcluster/taskgraph/transforms/repackage_routes.py
@@ -18,18 +18,22 @@ def add_indexes(config, jobs):
         repackage_type = job['attributes'].get('repackage_type')
         if repackage_type:
             build_platform = job['attributes']['build_platform']
             job_name = '{}-{}'.format(build_platform, repackage_type)
             product = job.get('index', {}).get('product', 'firefox')
             index_type = 'generic'
             if job['attributes'].get('shippable') and job['attributes'].get('locale'):
                 index_type = 'shippable-l10n'
+            if job['attributes'].get('nightly') and job['attributes'].get('locale'):
+                index_type = 'nightly-l10n'
             if job['attributes'].get('shippable'):
                 index_type = 'shippable'
+            if job['attributes'].get('nightly'):
+                index_type = 'nightly'
             if job['attributes'].get('locale'):
                 index_type = 'l10n'
             job['index'] = {
                 'job-name': job_name,
                 'product': product,
                 'type': index_type
             }
 
--- a/taskcluster/taskgraph/transforms/repackage_signing.py
+++ b/taskcluster/taskgraph/transforms/repackage_signing.py
@@ -41,17 +41,20 @@ transforms.add_validate(repackage_signin
 def make_repackage_signing_description(config, jobs):
     for job in jobs:
         dep_job = job['primary-dependency']
         attributes = copy_attributes_from_dependent_job(dep_job)
         locale = attributes.get('locale', dep_job.attributes.get('locale'))
         attributes['repackage_type'] = 'repackage-signing'
 
         treeherder = job.get('treeherder', {})
-        treeherder.setdefault('symbol', 'rs(B)')
+        if attributes.get('nightly'):
+            treeherder.setdefault('symbol', 'rs(N)')
+        else:
+            treeherder.setdefault('symbol', 'rs(B)')
         dep_th_platform = dep_job.task.get('extra', {}).get('treeherder-platform')
         treeherder.setdefault('platform', dep_th_platform)
         treeherder.setdefault(
             'tier',
             dep_job.task.get('extra', {}).get('treeherder', {}).get('tier', 1)
             )
         treeherder.setdefault('kind', 'build')
 
@@ -80,19 +83,19 @@ def make_repackage_signing_description(c
             "{build_platform}/{build_type}'".format(
                 locale=attributes.get('locale', 'en-US'),
                 build_platform=attributes.get('build_platform'),
                 build_type=attributes.get('build_type')
             )
         )
 
         build_platform = dep_job.attributes.get('build_platform')
-        is_shippable = dep_job.attributes.get('shippable')
+        is_nightly = dep_job.attributes.get('nightly', dep_job.attributes.get('shippable'))
         signing_cert_scope = get_signing_cert_scope_per_platform(
-            build_platform, is_shippable, config
+            build_platform, is_nightly, config
         )
         scopes = [signing_cert_scope]
 
         upstream_artifacts = []
         for artifact in dep_job.release_artifacts:
             basename = os.path.basename(artifact)
             if basename in SIGNING_FORMATS:
                 upstream_artifacts.append({
--- a/taskcluster/taskgraph/transforms/repackage_signing_partner.py
+++ b/taskcluster/taskgraph/transforms/repackage_signing_partner.py
@@ -36,17 +36,17 @@ transforms.add_validate(repackage_signin
 
 @transforms.add
 def make_repackage_signing_description(config, jobs):
     for job in jobs:
         dep_job = job['primary-dependency']
         repack_id = dep_job.task['extra']['repack_id']
         attributes = dep_job.attributes
         build_platform = dep_job.attributes.get('build_platform')
-        is_shippable = dep_job.attributes.get('shippable')
+        is_nightly = dep_job.attributes.get('nightly', dep_job.attributes.get('shippable'))
 
         # Mac & windows
         label = dep_job.label.replace("repackage-", "repackage-signing-")
         # Linux
         label = label.replace("chunking-dummy-", "repackage-signing-")
         description = (
             "Signing of repackaged artifacts for partner repack id '{repack_id}' for build '"
             "{build_platform}/{build_type}'".format(
@@ -65,17 +65,17 @@ def make_repackage_signing_description(c
         else:
             # we have a genuine repackage job as our parent
             dependencies = {"repackage": dep_job.label}
 
         attributes = copy_attributes_from_dependent_job(dep_job)
         attributes['repackage_type'] = 'repackage-signing'
 
         signing_cert_scope = get_signing_cert_scope_per_platform(
-            build_platform, is_shippable, config
+            build_platform, is_nightly, config
         )
         scopes = [signing_cert_scope]
 
         if 'win' in build_platform:
             upstream_artifacts = [{
                 "taskId": {"task-reference": "<repackage>"},
                 "taskType": "repackage",
                 "paths": [
--- a/taskcluster/taskgraph/transforms/signing.py
+++ b/taskcluster/taskgraph/transforms/signing.py
@@ -109,17 +109,18 @@ def make_task_description(config, jobs):
         attributes = dep_job.attributes
 
         signing_format_scopes = []
         formats = set([])
         for artifacts in job['upstream-artifacts']:
             for f in artifacts['formats']:
                 formats.add(f)  # Add each format only once
 
-        is_shippable = dep_job.attributes.get('shippable', False)
+        is_nightly = dep_job.attributes.get(
+            'nightly', dep_job.attributes.get('shippable', False))
         build_platform = dep_job.attributes.get('build_platform')
         treeherder = None
         if 'partner' not in config.kind and 'eme-free' not in config.kind:
             treeherder = job.get('treeherder', {})
 
             dep_th_platform = dep_job.task.get('extra', {}).get(
                 'treeherder', {}).get('machine', {}).get('platform', '')
             build_type = dep_job.attributes.get('build_type')
@@ -152,19 +153,19 @@ def make_task_description(config, jobs):
             copy_attributes_from_dependent_job(dep_job)
         attributes['signed'] = True
 
         if dep_job.attributes.get('chunk_locales'):
             # Used for l10n attribute passthrough
             attributes['chunk_locales'] = dep_job.attributes.get('chunk_locales')
 
         signing_cert_scope = get_signing_cert_scope_per_platform(
-            build_platform, is_shippable, config
+            build_platform, is_nightly, config
         )
-        worker_type_alias = 'linux-signing' if is_shippable else 'linux-depsigning'
+        worker_type_alias = 'linux-signing' if is_nightly else 'linux-depsigning'
         mac_behavior = None
         task = {
             'label': label,
             'description': description,
             'worker': {'implementation': 'scriptworker-signing',
                        'upstream-artifacts': job['upstream-artifacts'],
                        'max-run-time': job.get('max-run-time', 3600)},
             'scopes': [signing_cert_scope] + signing_format_scopes,
@@ -176,16 +177,19 @@ def make_task_description(config, jobs):
             'shipping-product': job.get('shipping-product'),
             'shipping-phase': job.get('shipping-phase'),
         }
 
         if 'macosx' in build_platform:
             shippable = "false"
             if "shippable" in attributes and attributes["shippable"]:
                 shippable = "true"
+            # remove the nightly check once nightly is gone as an attribute
+            if "nightly" in attributes and attributes["nightly"]:
+                shippable = "true"
             mac_behavior = evaluate_keyed_by(
                 config.graph_config['mac-notarization']['mac-behavior'],
                 'mac behavior',
                 {
                     'project': config.params['project'],
                     'shippable': shippable,
                 },
             )
--- a/taskcluster/taskgraph/transforms/task.py
+++ b/taskcluster/taskgraph/transforms/task.py
@@ -136,20 +136,19 @@ task_description_schema = Schema({
     Optional('index'): {
         # the name of the product this build produces
         'product': text_type,
 
         # the names to use for this job in the TaskCluster index
         'job-name': text_type,
 
         # Type of gecko v2 index to use
-        'type': Any('generic', 'l10n',
-                    'shippable', 'shippable-l10n',
-                    'android-shippable', 'android-shippable-with-multi-l10n',
-                    'shippable-with-multi-l10n'),
+        'type': Any('generic', 'nightly', 'l10n', 'nightly-with-multi-l10n',
+                    'nightly-l10n', 'shippable', 'shippable-l10n',
+                    'android-nightly', 'android-nightly-with-multi-l10n'),
 
         # The rank that the task will receive in the TaskCluster
         # index.  A newly completed task supercedes the currently
         # indexed task iff it has a higher rank.  If unspecified,
         # 'by-tier' behavior will be used.
         'rank': Any(
             # Rank is equal the timestamp of the build_date for tier-1
             # tasks, and zero for non-tier-1.  This sorts tier-{2,3}
@@ -240,23 +239,37 @@ V2_ROUTE_TEMPLATES = [
 ]
 
 # {central, inbound, autoland} write to a "trunk" index prefix. This facilitates
 # walking of tasks with similar configurations.
 V2_TRUNK_ROUTE_TEMPLATES = [
     "index.{trust-domain}.v2.trunk.revision.{branch_rev}.{product}.{job-name}",
 ]
 
+V2_NIGHTLY_TEMPLATES = [
+    "index.{trust-domain}.v2.{project}.nightly.latest.{product}.{job-name}",
+    "index.{trust-domain}.v2.{project}.nightly.{build_date}.revision.{branch_rev}.{product}.{job-name}",  # noqa - too long
+    "index.{trust-domain}.v2.{project}.nightly.{build_date}.latest.{product}.{job-name}",
+    "index.{trust-domain}.v2.{project}.nightly.revision.{branch_rev}.{product}.{job-name}",
+]
+
 V2_SHIPPABLE_TEMPLATES = [
     "index.{trust-domain}.v2.{project}.shippable.latest.{product}.{job-name}",
     "index.{trust-domain}.v2.{project}.shippable.{build_date}.revision.{branch_rev}.{product}.{job-name}",  # noqa - too long
     "index.{trust-domain}.v2.{project}.shippable.{build_date}.latest.{product}.{job-name}",
     "index.{trust-domain}.v2.{project}.shippable.revision.{branch_rev}.{product}.{job-name}",
 ]
 
+V2_NIGHTLY_L10N_TEMPLATES = [
+    "index.{trust-domain}.v2.{project}.nightly.latest.{product}-l10n.{job-name}.{locale}",
+    "index.{trust-domain}.v2.{project}.nightly.{build_date}.revision.{branch_rev}.{product}-l10n.{job-name}.{locale}",  # noqa - too long
+    "index.{trust-domain}.v2.{project}.nightly.{build_date}.latest.{product}-l10n.{job-name}.{locale}",  # noqa - too long
+    "index.{trust-domain}.v2.{project}.nightly.revision.{branch_rev}.{product}-l10n.{job-name}.{locale}",  # noqa - too long
+]
+
 V2_SHIPPABLE_L10N_TEMPLATES = [
     "index.{trust-domain}.v2.{project}.shippable.latest.{product}-l10n.{job-name}.{locale}",
     "index.{trust-domain}.v2.{project}.shippable.{build_date}.revision.{branch_rev}.{product}-l10n.{job-name}.{locale}",  # noqa - too long
     "index.{trust-domain}.v2.{project}.shippable.{build_date}.latest.{product}-l10n.{job-name}.{locale}",  # noqa - too long
     "index.{trust-domain}.v2.{project}.shippable.revision.{branch_rev}.{product}-l10n.{job-name}.{locale}",  # noqa - too long
 ]
 
 V2_L10N_TEMPLATES = [
@@ -1521,16 +1534,42 @@ def add_generic_index_routes(config, tas
     # namespace.
     if project and project in TRUNK_PROJECTS:
         for tpl in V2_TRUNK_ROUTE_TEMPLATES:
             routes.append(tpl.format(**subs))
 
     return task
 
 
+@index_builder('nightly')
+def add_nightly_index_routes(config, task):
+    index = task.get('index')
+    routes = task.setdefault('routes', [])
+
+    verify_index(config, index)
+
+    subs = config.params.copy()
+    subs['job-name'] = index['job-name']
+    subs['build_date_long'] = time.strftime("%Y.%m.%d.%Y%m%d%H%M%S",
+                                            time.gmtime(config.params['build_date']))
+    subs['build_date'] = time.strftime("%Y.%m.%d",
+                                       time.gmtime(config.params['build_date']))
+    subs['product'] = index['product']
+    subs['trust-domain'] = config.graph_config['trust-domain']
+    subs['branch_rev'] = get_branch_rev(config)
+
+    for tpl in V2_NIGHTLY_TEMPLATES:
+        routes.append(tpl.format(**subs))
+
+    # Also add routes for en-US
+    task = add_l10n_index_routes(config, task, force_locale="en-US")
+
+    return task
+
+
 @index_builder('shippable')
 def add_shippable_index_routes(config, task):
     index = task.get('index')
     routes = task.setdefault('routes', [])
 
     verify_index(config, index)
 
     subs = config.params.copy()
@@ -1544,22 +1583,26 @@ def add_shippable_index_routes(config, t
     subs['branch_rev'] = get_branch_rev(config)
 
     for tpl in V2_SHIPPABLE_TEMPLATES:
         routes.append(tpl.format(**subs))
 
     # Also add routes for en-US
     task = add_shippable_l10n_index_routes(config, task, force_locale="en-US")
 
+    # For nightly-compat index:
+    if 'nightly' in config.params['target_tasks_method']:
+        add_nightly_index_routes(config, task)
+
     return task
 
 
-@index_builder('shippable-with-multi-l10n')
-def add_shippable_multi_index_routes(config, task):
-    task = add_shippable_index_routes(config, task)
+@index_builder('nightly-with-multi-l10n')
+def add_nightly_multi_index_routes(config, task):
+    task = add_nightly_index_routes(config, task)
     task = add_l10n_index_routes(config, task, force_locale="multi")
     return task
 
 
 @index_builder('l10n')
 def add_l10n_index_routes(config, task, force_locale=None):
     index = task.get('index')
     routes = task.setdefault('routes', [])
@@ -1631,16 +1674,57 @@ def add_shippable_l10n_index_routes(conf
     # See Bug 1323792
     if len(locales) > 18:  # 18 * 3 = 54, max routes = 64
         return task
 
     for locale in locales:
         for tpl in V2_SHIPPABLE_L10N_TEMPLATES:
             routes.append(tpl.format(locale=locale, **subs))
 
+    # For nightly-compat index:
+    if 'nightly' in config.params['target_tasks_method']:
+        add_nightly_l10n_index_routes(config, task, force_locale)
+
+    return task
+
+
+@index_builder('nightly-l10n')
+def add_nightly_l10n_index_routes(config, task, force_locale=None):
+    index = task.get('index')
+    routes = task.setdefault('routes', [])
+
+    verify_index(config, index)
+
+    subs = config.params.copy()
+    subs['job-name'] = index['job-name']
+    subs['build_date_long'] = time.strftime("%Y.%m.%d.%Y%m%d%H%M%S",
+                                            time.gmtime(config.params['build_date']))
+    subs['build_date'] = time.strftime("%Y.%m.%d",
+                                       time.gmtime(config.params['build_date']))
+    subs['product'] = index['product']
+    subs['trust-domain'] = config.graph_config['trust-domain']
+    subs['branch_rev'] = get_branch_rev(config)
+
+    locales = task['attributes'].get('chunk_locales',
+                                     task['attributes'].get('all_locales'))
+    # Some tasks has only one locale set
+    if task['attributes'].get('locale'):
+        locales = [task['attributes']['locale']]
+
+    if force_locale:
+        # Used for en-US and multi-locale
+        locales = [force_locale]
+
+    if not locales:
+        raise Exception("Error: Unable to use l10n index for tasks without locales")
+
+    for locale in locales:
+        for tpl in V2_NIGHTLY_L10N_TEMPLATES:
+            routes.append(tpl.format(locale=locale, **subs))
+
     return task
 
 
 def add_geckoview_index_routes(config, task):
     index = task.get('index')
     routes = task.setdefault('routes', [])
     geckoview_version = _compute_geckoview_version(
         config.params['app_version'],
@@ -1654,27 +1738,27 @@ def add_geckoview_index_routes(config, t
         'project': config.params['project'],
         'trust-domain': config.graph_config['trust-domain'],
     }
     routes.append(V2_GECKOVIEW_RELEASE.format(**subs))
 
     return task
 
 
-@index_builder('android-shippable')
-def add_android_shippable_index_routes(config, task):
-    task = add_shippable_index_routes(config, task)
+@index_builder('android-nightly')
+def add_android_nightly_index_routes(config, task):
+    task = add_nightly_index_routes(config, task)
     task = add_geckoview_index_routes(config, task)
 
     return task
 
 
-@index_builder('android-shippable-with-multi-l10n')
-def add_android_shippable_multi_index_routes(config, task):
-    task = add_shippable_multi_index_routes(config, task)
+@index_builder('android-nightly-with-multi-l10n')
+def add_android_nightly_multi_index_routes(config, task):
+    task = add_nightly_multi_index_routes(config, task)
     task = add_geckoview_index_routes(config, task)
 
     return task
 
 
 @transforms.add
 def add_index_routes(config, tasks):
     for task in tasks:
--- a/taskcluster/taskgraph/transforms/tests.py
+++ b/taskcluster/taskgraph/transforms/tests.py
@@ -854,16 +854,17 @@ def set_tier(config, tasks):
 
         if 'fission-tier' in task:
             resolve_keyed_by(task, 'fission-tier', item_name=task['test-name'])
 
         # only override if not set for the test
         if 'tier' not in task or task['tier'] == 'default':
             if task['test-platform'] in [
                 'linux64/opt',
+                'linux64-nightly/opt',
                 'linux64/debug',
                 'linux64-pgo/opt',
                 'linux64-shippable/opt',
                 'linux64-devedition/opt',
                 'linux64-asan/opt',
                 'linux64-qr/opt',
                 'linux64-qr/debug',
                 'linux64-pgo-qr/opt',
@@ -875,30 +876,33 @@ def set_tier(config, tasks):
                 'linux1804-64-qr/debug',
                 'linux1804-64-shippable-qr/opt',
                 'linux1804-64-asan/opt',
                 'linux1804-64-tsan/opt',
                 'windows7-32/debug',
                 'windows7-32/opt',
                 'windows7-32-pgo/opt',
                 'windows7-32-devedition/opt',
+                'windows7-32-nightly/opt',
                 'windows7-32-shippable/opt',
                 'windows10-aarch64/opt',
                 'windows10-64/debug',
                 'windows10-64/opt',
                 'windows10-64-pgo/opt',
                 'windows10-64-shippable/opt',
                 'windows10-64-devedition/opt',
+                'windows10-64-nightly/opt',
                 'windows10-64-asan/opt',
                 'windows10-64-qr/opt',
                 'windows10-64-qr/debug',
                 'windows10-64-pgo-qr/opt',
                 'windows10-64-shippable-qr/opt',
                 'macosx1014-64/opt',
                 'macosx1014-64/debug',
+                'macosx1014-64-nightly/opt',
                 'macosx1014-64-shippable/opt',
                 'macosx1014-64-devedition/opt',
                 'macosx1014-64-qr/opt',
                 'macosx1014-64-shippable-qr/opt',
                 'macosx1014-64-qr/debug',
                 'android-em-7.0-x86_64/opt',
                 'android-em-7.0-x86_64/debug',
                 'android-em-7.0-x86/opt',
--- a/taskcluster/taskgraph/transforms/upload_generated_sources.py
+++ b/taskcluster/taskgraph/transforms/upload_generated_sources.py
@@ -23,16 +23,18 @@ def add_task_info(config, jobs):
         # Add a dependency on the build task.
         job['dependencies'] = {'build': dep_task.label}
         # Label the job to match the build task it's uploading from.
         job['label'] = dep_task.label.replace("build-", "upload-generated-sources-")
         # Copy over some bits of metdata from the build task.
         dep_th = dep_task.task['extra']['treeherder']
         job.setdefault('attributes', {})
         job['attributes']['build_platform'] = dep_task.attributes.get('build_platform')
+        if dep_task.attributes.get('nightly'):
+            job['attributes']['nightly'] = True
         if dep_task.attributes.get('shippable'):
             job['attributes']['shippable'] = True
         plat = '{}/{}'.format(dep_th['machine']['platform'], dep_task.attributes.get('build_type'))
         job['treeherder']['platform'] = plat
         job['treeherder']['tier'] = dep_th['tier']
         if dep_th['symbol'] != "N":
             job['treeherder']['symbol'] = "Ugs{}".format(dep_th['symbol'])
         job['run-on-projects'] = dep_task.attributes.get('run_on_projects')
--- a/taskcluster/taskgraph/transforms/upload_symbols.py
+++ b/taskcluster/taskgraph/transforms/upload_symbols.py
@@ -16,27 +16,27 @@ from taskgraph.util.attributes import co
 import logging
 logger = logging.getLogger(__name__)
 
 transforms = TransformSequence()
 
 
 @transforms.add
 def check_nightlies(config, tasks):
-    """Ensure that we upload symbols for all shippable builds, so that crash-stats can
+    """Ensure that we upload symbols for all nightly builds, so that crash-stats can
     resolve any reports sent to it. Try may enable full symbols but not upload them.
 
     Putting this check here (instead of the transforms for the build kind) lets us
     leverage the any not-for-build-platforms set in the update-symbols kind."""
     for task in tasks:
         dep = task['primary-dependency']
         if config.params['project'] in RELEASE_PROJECTS and \
-                dep.attributes.get('shippable') and \
+                dep.attributes.get('nightly', dep.attributes.get('shippable')) and \
                 not dep.attributes.get('enable-full-crashsymbols'):
-            raise Exception('Shippable job %s should have enable-full-crashsymbols attribute '
+            raise Exception('Nightly job %s should have enable-full-crashsymbols attribute '
                             'set to true to enable symbol upload to crash-stats' % dep.label)
         yield task
 
 
 @transforms.add
 def fill_template(config, tasks):
     for task in tasks:
         dep = task['primary-dependency']
@@ -66,17 +66,20 @@ def fill_template(config, tasks):
 
         # Disambiguate the treeherder symbol.
         sym = 'Sym' + (th_symbol[1:] if th_symbol.startswith('B') else th_symbol)
         treeherder.setdefault(
             'symbol', join_symbol(th_groupsymbol, sym)
         )
         task['treeherder'] = treeherder
 
-        if attributes.get('shippable'):
+        if attributes.get('nightly'):
+            # For nightly builds, we want to run these tasks if the build is run.
+            task['run-on-projects'] = dep.attributes.get('run_on_projects')
+        elif attributes.get('shippable'):
             # For shippable builds, we want to run these tasks if the build is run.
             # XXX Better to run this on promote phase instead?
             task['run-on-projects'] = dep.attributes.get('run_on_projects')
         else:
             # For other builds, these can be requested to upload to the try symbol sever.
             task['run-on-projects'] = ['try']
 
         # clear out the stuff that's not part of a task description
--- a/taskcluster/taskgraph/try_option_syntax.py
+++ b/taskcluster/taskgraph/try_option_syntax.py
@@ -552,16 +552,18 @@ class TryOptionSyntax(object):
                 if a.startswith(prefix):
                     rv.add(a[len(prefix):])
         return sorted(rv)
 
     def task_matches(self, task):
         attr = task.attributes.get
 
         def check_run_on_projects():
+            if attr('nightly') and not self.include_nightly:
+                return False
             return set(['try', 'all']) & set(attr('run_on_projects', []))
 
         # Don't schedule fission tests when try option syntax is used
         if attr('unittest_variant') == 'fission':
             return False
 
         def match_test(try_spec, attr_name):
             run_by_default = True
--- a/taskcluster/taskgraph/util/partials.py
+++ b/taskcluster/taskgraph/util/partials.py
@@ -76,17 +76,17 @@ FTP_PLATFORM_MAP = {
 
 
 def get_balrog_platform_name(platform):
     """Convert build platform names into balrog platform names.
 
     Remove known values instead to catch aarch64 and other platforms
     that may be added.
     """
-    removals = ["-devedition", "-shippable"]
+    removals = ["-devedition", "-nightly", "-shippable"]
     for remove in removals:
         platform = platform.replace(remove, '')
     return PLATFORM_RENAMES.get(platform, platform)
 
 
 def _sanitize_platform(platform):
     platform = get_balrog_platform_name(platform)
     if platform not in BALROG_PLATFORM_MAP:
--- a/taskcluster/taskgraph/util/scriptworker.py
+++ b/taskcluster/taskgraph/util/scriptworker.py
@@ -331,20 +331,20 @@ def get_release_config(config):
     release_config['version'] = config.params['version']
     release_config['appVersion'] = config.params['app_version']
 
     release_config['next_version'] = config.params['next_version']
     release_config['build_number'] = config.params['build_number']
     return release_config
 
 
-def get_signing_cert_scope_per_platform(build_platform, is_shippable, config):
+def get_signing_cert_scope_per_platform(build_platform, is_nightly, config):
     if 'devedition' in build_platform:
         return get_devedition_signing_cert_scope(config)
-    elif is_shippable:
+    elif is_nightly:
         return get_signing_cert_scope(config)
     else:
         return add_scope_prefix(config, 'signing:cert:dep-signing')
 
 
 # generate_beetmover_upstream_artifacts {{{1
 def generate_beetmover_upstream_artifacts(
     config, job, platform, locale=None, dependencies=None, **kwargs
--- a/taskcluster/taskgraph/util/verify.py
+++ b/taskcluster/taskgraph/util/verify.py
@@ -285,53 +285,58 @@ def verify_always_optimized(task, taskgr
     """
     if task is None:
         return
     if task.task.get('workerType') == 'always-optimized':
         raise Exception('Could not optimize the task {!r}'.format(task.label))
 
 
 @verifications.add('full_task_graph')
-def verify_shippable_no_sccache(task, taskgraph, scratch_pad, graph_config):
-    if task and task.attributes.get('shippable'):
+def verify_nightly_no_sccache(task, taskgraph, scratch_pad, graph_config):
+    if task and any([task.attributes.get('nightly'), task.attributes.get('shippable')]):
         if task.task.get('payload', {}).get('env', {}).get('USE_SCCACHE'):
             raise Exception(
-                'Shippable job {} cannot use sccache'.format(task.label))
+                'Nightly job {} cannot use sccache'.format(task.label))
 
 
 @verifications.add('full_task_graph')
 def verify_test_packaging(task, taskgraph, scratch_pad, graph_config):
     if task is None:
         exceptions = []
         for task in six.itervalues(taskgraph.tasks):
             if task.kind == 'build' and not task.attributes.get('skip-verify-test-packaging'):
                 build_env = task.task.get('payload', {}).get('env', {})
                 package_tests = build_env.get('MOZ_AUTOMATION_PACKAGE_TESTS')
                 shippable = task.attributes.get('shippable', False)
+                nightly = task.attributes.get('nightly', False)
                 build_has_tests = scratch_pad.get(task.label)
 
                 if package_tests != '1':
                     # Shippable builds should always package tests.
                     if shippable:
                         exceptions.append('Build job {} is shippable and does not specify '
                                           'MOZ_AUTOMATION_PACKAGE_TESTS=1 in the '
                                           'environment.'.format(task.label))
+                    if nightly:
+                        exceptions.append('Build job {} is nightly and does not specify '
+                                          'MOZ_AUTOMATION_PACKAGE_TESTS=1 in the '
+                                          'environment.'.format(task.label))
 
                     # Build tasks in the scratch pad have tests dependent on
                     # them, so we need to package tests during build.
                     if build_has_tests:
                         exceptions.append(
                             'Build job {} has tests dependent on it and does not specify '
                             'MOZ_AUTOMATION_PACKAGE_TESTS=1 in the environment'.format(task.label))
                 else:
                     # Build tasks that aren't in the scratch pad have no
                     # dependent tests, so we shouldn't package tests.
-                    # With the caveat that we expect shippable jobs to always
+                    # With the caveat that we expect shippable and nightly jobs to always
                     # produce tests.
-                    if not build_has_tests and not shippable:
+                    if not build_has_tests and not any([shippable, nightly]):
                         exceptions.append(
                             'Build job {} has no tests, but specifies '
                             'MOZ_AUTOMATION_PACKAGE_TESTS={} in the environment. '
                             'Unset MOZ_AUTOMATION_PACKAGE_TESTS in the task definition '
                             'to fix.'.format(task.label, package_tests))
         if exceptions:
             raise Exception("\n".join(exceptions))
         return