Bug 1717540 - Add esr91 support. r=releng-reviewers,taskgraph-reviewers,aki a=release
authorJulien Cristau <jcristau@mozilla.com>
Tue, 13 Jul 2021 10:17:48 +0000
changeset 653670 d88ba22ed4b5bc069e38e15448bb1ffc3447f964
parent 653669 2e03d0df596e395217cf51b0dd46bf4477d23590
child 653671 1656e86faf045ea97c45ed9a9a3bd594e896e661
push id15612
push userpchevrel@mozilla.com
push dateThu, 15 Jul 2021 11:48:25 +0000
treeherdermozilla-beta@d6af2879a42b [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersreleng-reviewers, taskgraph-reviewers, aki, release
bugs1717540
milestone91.0
Bug 1717540 - Add esr91 support. r=releng-reviewers,taskgraph-reviewers,aki a=release Differential Revision: https://phabricator.services.mozilla.com/D119521
.cron.yml
taskcluster/ci/build/linux.yml
taskcluster/ci/build/windows-mingw.yml
taskcluster/ci/config.yml
taskcluster/ci/cron-bouncer-check/kind.yml
taskcluster/ci/release-balrog-scheduling/kind.yml
taskcluster/ci/release-balrog-submit-toplevel/kind.yml
taskcluster/ci/release-bouncer-aliases/kind.yml
taskcluster/ci/release-bouncer-sub/kind.yml
taskcluster/ci/release-snap-push/kind.yml
taskcluster/ci/release-update-verify-config-next/kind.yml
taskcluster/ci/release-update-verify-config/kind.yml
taskcluster/ci/release-update-verify-next/kind.yml
taskcluster/docs/attributes.rst
taskcluster/docs/parameters.rst
taskcluster/taskgraph/decision.py
taskcluster/taskgraph/target_tasks.py
taskcluster/taskgraph/transforms/update_verify_config.py
taskcluster/taskgraph/util/attributes.py
taskcluster/taskgraph/util/scriptworker.py
--- a/.cron.yml
+++ b/.cron.yml
@@ -116,16 +116,17 @@ jobs:
           type: decision-task
           treeherder-symbol: Searchfox
           target-tasks-method: searchfox_index
       run-on-projects:
           - mozilla-central
           - mozilla-beta
           - mozilla-release
           - mozilla-esr78
+          - mozilla-esr91
       when:
           by-project:
               # We want to run at both of the times the nightly runs.
               mozilla-central: [{hour: 10, minute: 0}, {hour: 22, minute: 0}]
               # For all other jobs we just run once daily matching the 10 UTC
               # nightly which is designed to align with searchfox's AWS cron
               # jobs (for legacy reasons) rather than trying to align with
               # specific builds.  (Ex: mozilla-beta has a "daily-releases" job
@@ -135,16 +136,17 @@ jobs:
               # in a redundant job being scheduled each day rather than reusing
               # the previous day's job.  This is only beneficial in the sense
               # that there's no risk of expiration for artifacts and is a
               # trade-off to avoid stale indices.  Bug 1686981 tracks fixing
               # this.
               mozilla-beta: [{hour: 10, minute: 0}]
               mozilla-release: [{hour: 10, minute: 0}]
               mozilla-esr78: [{hour: 10, minute: 0}]
+              mozilla-esr91: [{hour: 10, minute: 0}]
 
     - name: coverity-tree-analysis
       job:
           type: decision-task
           treeherder-symbol: CoverityTA
           target-tasks-method: coverity_static_analysis_full
       run-on-projects:
           - mozilla-central
@@ -203,42 +205,47 @@ jobs:
           type: decision-task
           treeherder-symbol: Rel
           target-tasks-method: cron_bouncer_check
       run-on-projects:
           - mozilla-central
           - mozilla-beta
           - mozilla-release
           - mozilla-esr78
+          - mozilla-esr91
       when:
           by-project:
               # No default branch
               mozilla-central:
                   - {hour: 7, minute: 0}
                   - {hour: 19, minute: 0}
               mozilla-beta:
                   - {hour: 7, minute: 0}
                   - {hour: 19, minute: 0}
               mozilla-release:
                   - {hour: 7, minute: 0}
                   - {hour: 19, minute: 0}
               mozilla-esr78:
                   - {hour: 7, minute: 0}
                   - {hour: 19, minute: 0}
+              mozilla-esr91:
+                  - {hour: 7, minute: 0}
+                  - {hour: 19, minute: 0}
 
     - name: periodic-update
       job:
           type: decision-task
           treeherder-symbol: Nfile
           target-tasks-method: file_update
       run-on-projects:
           - mozilla-central
           - mozilla-beta
           - mozilla-release
           - mozilla-esr78
+          - mozilla-esr91
       when:
           - {weekday: 'Monday', hour: 8, minute: 0}
           - {weekday: 'Thursday', hour: 8, minute: 0}
 
     - name: raptor-tp6m
       job:
           type: decision-task
           treeherder-symbol: tp6m
--- a/taskcluster/ci/build/linux.yml
+++ b/taskcluster/ci/build/linux.yml
@@ -493,17 +493,17 @@ linux/opt:
         actions: [get-secrets, build]
         config:
             - builds/releng_base_firefox.py
             - builds/releng_base_linux_32_builds.py
         script: "mozharness/scripts/fx_desktop_build.py"
         secrets: true
         tooltool-downloads: public
         need-xvfb: true
-    run-on-projects: ['mozilla-beta', 'mozilla-release', 'mozilla-esr78']
+    run-on-projects: ['mozilla-beta', 'mozilla-release', 'mozilla-esr78', 'mozilla-esr91']
     use-sccache: true
     fetches:
         toolchain:
             - linux64-binutils
             - linux64-clang
             - linux64-rust
             - linux64-rust-size
             - linux64-cbindgen
--- a/taskcluster/ci/build/windows-mingw.yml
+++ b/taskcluster/ci/build/windows-mingw.yml
@@ -29,17 +29,17 @@ win32-mingwclang/opt:
             PERFHERDER_EXTRA_OPTIONS: "opt 32 clang"
             MOZ_AUTOMATION_PACKAGE_TESTS: "1"
     run:
         config:
             - builds/releng_base_firefox.py
             - builds/releng_base_windows_32_mingw_builds.py
             - builds/releng_sub_windows_configs/32_mingwclang.py
         mozconfig-variant: mingwclang
-    run-on-projects: ['mozilla-central', 'mozilla-esr78']
+    run-on-projects: ['mozilla-central', 'mozilla-esr78', 'mozilla-esr91']
     use-sccache: true
     fetches:
         toolchain:
             - mingw32-rust
             - linux64-upx
             - linux64-wine
             - linux64-sccache
             - linux64-cbindgen
@@ -64,17 +64,17 @@ win32-mingwclang/debug:
             PERFHERDER_EXTRA_OPTIONS: "debug 32 clang"
             MOZ_AUTOMATION_PACKAGE_TESTS: "1"
     run:
         config:
             - builds/releng_base_firefox.py
             - builds/releng_base_windows_32_mingw_builds.py
             - builds/releng_sub_windows_configs/32_mingwclang.py
         mozconfig-variant: mingwclang-debug
-    run-on-projects: ['mozilla-central', 'mozilla-esr78']
+    run-on-projects: ['mozilla-central', 'mozilla-esr78', 'mozilla-esr91']
     use-sccache: true
     fetches:
         toolchain:
             - mingw32-rust
             - linux64-upx
             - linux64-wine
             - linux64-sccache
             - linux64-cbindgen
@@ -99,17 +99,17 @@ win64-mingwclang/opt:
             PERFHERDER_EXTRA_OPTIONS: "opt 64 clang"
             MOZ_AUTOMATION_PACKAGE_TESTS: "1"
     run:
         config:
             - builds/releng_base_firefox.py
             - builds/releng_base_windows_64_mingw_builds.py
             - builds/releng_sub_windows_configs/64_mingwclang.py
         mozconfig-variant: mingwclang
-    run-on-projects: ['mozilla-central', 'mozilla-esr78']
+    run-on-projects: ['mozilla-central', 'mozilla-esr78', 'mozilla-esr91']
     use-sccache: true
     fetches:
         toolchain:
             - mingw32-rust
             - linux64-upx
             - linux64-wine
             - linux64-sccache
             - linux64-cbindgen
@@ -134,17 +134,17 @@ win64-mingwclang/debug:
             PERFHERDER_EXTRA_OPTIONS: "debug 64 clang"
             MOZ_AUTOMATION_PACKAGE_TESTS: "1"
     run:
         config:
             - builds/releng_base_firefox.py
             - builds/releng_base_windows_64_mingw_builds.py
             - builds/releng_sub_windows_configs/64_mingwclang.py
         mozconfig-variant: mingwclang-debug
-    run-on-projects: ['mozilla-central', 'mozilla-esr78']
+    run-on-projects: ['mozilla-central', 'mozilla-esr78', 'mozilla-esr91']
     use-sccache: true
     fetches:
         toolchain:
             - mingw32-rust
             - linux64-upx
             - linux64-wine
             - linux64-sccache
             - linux64-cbindgen
--- a/taskcluster/ci/config.yml
+++ b/taskcluster/ci/config.yml
@@ -315,18 +315,18 @@ merge-automation:
             version-files:
                 - filename: "browser/config/version_display.txt"
                   new-suffix: 'esr'
             replacements: []
             merge-old-head: false
             base-tag: "FIREFOX_ESR_{major_version}_BASE"
             from-repo: 'https://hg.mozilla.org/releases/mozilla-release'
             from-branch: 'release'
-            to-repo: 'https://hg.mozilla.org/releases/mozilla-esr78'
-            to-branch: 'esr78'
+            to-repo: 'https://hg.mozilla.org/releases/mozilla-esr91'
+            to-branch: 'esr91'
         bump-central:
             fetch-version-from: "browser/config/version.txt"
             version-files:
                 - filename: "config/milestone.txt"
                   version-bump: "major"
                   new-suffix: 'a1'
                 - filename: "browser/config/version.txt"
                   version-bump: "major"
@@ -353,16 +353,29 @@ merge-automation:
                 - filename: "browser/config/version.txt"
                   version-bump: "minor"
                 - filename: "browser/config/version_display.txt"
                   version-bump: "minor"
             replacements: []
             merge-old-head: false
             to-repo: 'https://hg.mozilla.org/releases/mozilla-esr78'
             to-branch: 'esr78'
+        bump-esr91:
+            fetch-version-from: "browser/config/version.txt"
+            version-files:
+                - filename: "config/milestone.txt"
+                  version-bump: "minor"
+                - filename: "browser/config/version.txt"
+                  version-bump: "minor"
+                - filename: "browser/config/version_display.txt"
+                  version-bump: "minor"
+            replacements: []
+            merge-old-head: false
+            to-repo: 'https://hg.mozilla.org/releases/mozilla-esr91'
+            to-branch: 'esr91'
 
 scriptworker:
     # See additional configuration in taskcluster/taskgraph/util/scriptworker.py
     scope-prefix: 'project:releng'
 
 partner-urls:
     release-partner-repack:
         by-release-product:
--- a/taskcluster/ci/cron-bouncer-check/kind.yml
+++ b/taskcluster/ci/cron-bouncer-check/kind.yml
@@ -49,17 +49,17 @@ jobs:
                     default:
                         - releases/bouncer_firefox_beta.py
             product-field:
                 by-project:
                     mozilla-central: FIREFOX_NIGHTLY
                     mozilla-beta: LATEST_FIREFOX_RELEASED_DEVEL_VERSION
                     mozilla-release: LATEST_FIREFOX_VERSION
                     mozilla-esr78: FIREFOX_ESR
-                    # mozilla-esrXX: FIREFOX_ESR_NEXT
+                    mozilla-esr91: FIREFOX_ESR_NEXT
                     default: LATEST_FIREFOX_DEVEL_VERSION
             products-url: https://product-details.mozilla.org/1.0/firefox_versions.json
         treeherder:
             platform: firefox-release/opt
 
     devedition:
         shipping-product: devedition
         run-on-projects: [mozilla-beta]
--- a/taskcluster/ci/release-balrog-scheduling/kind.yml
+++ b/taskcluster/ci/release-balrog-scheduling/kind.yml
@@ -31,22 +31,24 @@ jobs:
             product: firefox
             publish-rules:
                 by-release-level:
                     production:
                         by-release-type:
                             beta: [32]
                             release: [145]
                             esr78: [3820]
+                            esr91: [17638]
                             default: []
                     staging:
                         by-release-type:
                             beta: [32]
                             release: [145]
                             esr78: [887]
+                            esr91: [889]
                             default: []
             background-rate:
                 by-release-type:
                     beta:
                         by-beta-number:
                             '1': 25
                             '2': 50
                             '3': 100
--- a/taskcluster/ci/release-balrog-submit-toplevel/kind.yml
+++ b/taskcluster/ci/release-balrog-submit-toplevel/kind.yml
@@ -42,16 +42,17 @@ jobs:
                     release(-rc)?: ["release", "release-localtest", "release-cdntest"]
                     esr.*: ["esr", "esr-localtest", "esr-cdntest", "esr-localtest-next", "esr-cdntest-next"]
                     default: []
             rules-to-update:
                 by-release-type:
                     beta: ["firefox-beta-cdntest", "firefox-beta-localtest"]
                     release(-rc)?: ["firefox-release-cdntest", "firefox-release-localtest"]
                     esr78: ["firefox-esr78-cdntest", "firefox-esr78-localtest"]
+                    esr91: ["firefox-esr91-cdntest", "firefox-esr91-localtest"]
                     default: []
             platforms: ["linux", "linux64", "macosx64", "win32", "win64", "win64-aarch64"]
         treeherder:
             platform: firefox-release/opt
             symbol: Rel(BPFx)
             tier: 1
             kind: build
 
--- a/taskcluster/ci/release-bouncer-aliases/kind.yml
+++ b/taskcluster/ci/release-bouncer-aliases/kind.yml
@@ -61,17 +61,17 @@ jobs:
                 mozilla-esr78:
                     # when there is one ESR branch both sets of aliases work
                     # when there are two ESR branches ...
                     # ... these always point to the older branch
                     firefox-esr-latest-ssl: installer-ssl
                     firefox-esr-latest: installer
                     firefox-esr-msi-latest-ssl: msi
                     firefox-esr-pkg-latest-ssl: pkg
-                    # mozilla-esrXX: XXX - to uncomment when we branch next ESR
+                mozilla-esr91:
                     # ... these point to the newer branch
                     firefox-esr-next-latest-ssl: installer-ssl
                     firefox-esr-next-latest: installer
                     firefox-esr-next-msi-latest-ssl: msi
                     firefox-esr-next-pkg-latest-ssl: pkg
                 birch:
                     firefox-latest-ssl: installer-ssl
                     firefox-latest: installer
--- a/taskcluster/ci/release-bouncer-sub/kind.yml
+++ b/taskcluster/ci/release-bouncer-sub/kind.yml
@@ -39,16 +39,17 @@ jobs:
             platform: devedition-release/opt
 
     firefox:
         bouncer-platforms: ['linux', 'linux64', 'osx', 'win', 'win64', 'win64-aarch64']
         bouncer-products:
             by-release-type:
                 default: ['complete-mar', 'installer', 'installer-ssl', 'partial-mar', 'stub-installer', 'msi', 'pkg']
                 esr78: ['complete-mar', 'installer', 'installer-ssl', 'partial-mar', 'msi', 'pkg']
+                esr91: ['complete-mar', 'installer', 'installer-ssl', 'partial-mar', 'msi', 'pkg']
         shipping-product: firefox
         treeherder:
             platform: firefox-release/opt
 
     firefox-rc:
         bouncer-platforms: ['linux', 'linux64', 'osx', 'win', 'win64', 'win64-aarch64']
         bouncer-products: ['complete-mar-candidates', 'partial-mar-candidates']
         shipping-product: firefox
--- a/taskcluster/ci/release-snap-push/kind.yml
+++ b/taskcluster/ci/release-snap-push/kind.yml
@@ -26,16 +26,16 @@ job-defaults:
             staging: scriptworker-k8s/gecko-1-pushsnap
     worker:
         implementation: push-snap
         channel:
             by-release-type:
                 beta: beta
                 release: candidate
                 esr78: esr/stable
-                # esrXX: esr/candidate
+                esr91: esr/candidate
                 default: mock
 
 jobs:
     firefox:
         shipping-product: firefox
         treeherder:
             symbol: Snap(push)
--- a/taskcluster/ci/release-update-verify-config-next/kind.yml
+++ b/taskcluster/ci/release-update-verify-config-next/kind.yml
@@ -8,17 +8,17 @@ transforms:
     - taskgraph.transforms.release:run_on_releases
     - taskgraph.transforms.update_verify_config:transforms
     - taskgraph.transforms.job:transforms
     - taskgraph.transforms.task:transforms
 
 job-defaults:
     name: update-verify-config-next
     run-on-projects: []  # to make sure this never runs as part of CI
-    run-on-releases: [esr78]
+    run-on-releases: [esr78, esr91]
     shipping-phase: promote
     worker-type: b-linux
     worker:
         docker-image:
             in-tree: "update-verify"
         max-run-time: 3600
         artifacts:
             - name: public/build/update-verify.cfg
@@ -47,17 +47,17 @@ job-defaults:
                 production: "https://aus5.mozilla.org"
         override-certs:
             by-release-level:
                 staging: dep
                 production: null
         updater-platform: linux-x86_64
         product: firefox
         channel: "esr-localtest-next"
-        include-version: esr78-next
+        include-version: esr91-next
         last-watershed: "68.0esr"
 
 jobs:
     firefox-next-linux:
         shipping-product: firefox
         treeherder:
             platform: linux32-shippable/opt
         attributes:
--- a/taskcluster/ci/release-update-verify-config/kind.yml
+++ b/taskcluster/ci/release-update-verify-config/kind.yml
@@ -57,16 +57,17 @@ job-defaults:
         last-watershed:
             by-release-type:
                 beta:
                     by-platform:
                         win64-aarch64.*: "67.0b2"
                         default: "56.0b3"
                 release(-rc)?: "72.0.2"
                 esr78: "68.0esr"
+                esr91: "91.0esr"
                 default: "default"
 
 jobs:
     firefox-linux:
         shipping-product: firefox
         treeherder:
             symbol: UVC
             platform: linux32-shippable/opt
--- a/taskcluster/ci/release-update-verify-next/kind.yml
+++ b/taskcluster/ci/release-update-verify-next/kind.yml
@@ -15,17 +15,17 @@ transforms:
     - taskgraph.transforms.release_deps:transforms
     - taskgraph.transforms.update_verify:transforms
     - taskgraph.transforms.job:transforms
     - taskgraph.transforms.task:transforms
 
 job-defaults:
     name: update-verify-next
     run-on-projects: []  # to make sure this never runs as part of CI
-    run-on-releases: [esr78]
+    run-on-releases: [esr78, esr91]
     shipping-phase: promote
     worker-type: b-linux
     worker:
         artifacts:
             - name: 'public/build/diff-summary.log'
               path: '/builds/worker/tools/release/updates/diff-summary.log'
               type: file
         docker-image:
--- a/taskcluster/docs/attributes.rst
+++ b/taskcluster/docs/attributes.rst
@@ -41,16 +41,17 @@ These are the aliases:
 
 Project names are the repositories.  They can be:
 
 * `autoland`
 * `mozilla-central`
 * `mozilla-beta`
 * `mozilla-release`
 * `mozilla-esr78`
+* `mozilla-esr91`
 * ... A partial list can be found in taskcluster/taskgraph/util/attributes.py
 
 For try, this attribute applies only if ``-p all`` is specified.  All jobs can
 be specified by name regardless of ``run_on_projects``.
 
 If ``run_on_projects`` is set to an empty list, then the task will not run
 anywhere, unless its build platform is specified explicitly in try syntax.
 
@@ -432,9 +433,9 @@ This build is an artifact build.
 
 This deliberately excludes builds that are implemented using the artifact build
 machinery, but are not primarily intended to short-circuit build time. In
 particular the Windows aarch64 builds are not marked this way.
 
 supports-artifact-builds
 ========================
 
-If false, the task requires a compiled build and will not work with artifact builds.
\ No newline at end of file
+If false, the task requires a compiled build and will not work with artifact builds.
--- a/taskcluster/docs/parameters.rst
+++ b/taskcluster/docs/parameters.rst
@@ -168,17 +168,17 @@ Release Promotion
 
 ``app_version``
    Specify the application version for release tasks. For releases, this is often a less specific version number than ``version``.
 
 ``next_version``
    Specify the next version for version bump tasks.
 
 ``release_type``
-   The type of release being promoted. One of "nightly", "beta", "esr78", "release-rc", or "release".
+   The type of release being promoted. One of "nightly", "beta", "esr78", "esr91", "release-rc", or "release".
 
 ``release_eta``
    The time and date when a release is scheduled to live. This value is passed to Balrog.
 
 ``release_enable_partner_repack``
    Boolean which controls repacking vanilla Firefox builds for partners.
 
 ``release_enable_partner_attribution``
--- a/taskcluster/taskgraph/decision.py
+++ b/taskcluster/taskgraph/decision.py
@@ -79,16 +79,20 @@ PER_PROJECT_PARAMETERS = {
     "mozilla-release": {
         "target_tasks_method": "mozilla_release_tasks",
         "release_type": "release",
     },
     "mozilla-esr78": {
         "target_tasks_method": "mozilla_esr78_tasks",
         "release_type": "esr78",
     },
+    "mozilla-esr91": {
+        "target_tasks_method": "mozilla_esr91_tasks",
+        "release_type": "esr91",
+    },
     "pine": {
         "target_tasks_method": "pine_tasks",
     },
     "kaios": {
         "target_tasks_method": "kaios_tasks",
     },
     # the default parameters are used for projects that do not match above.
     "default": {
--- a/taskcluster/taskgraph/target_tasks.py
+++ b/taskcluster/taskgraph/target_tasks.py
@@ -549,17 +549,17 @@ def target_tasks_mozilla_release(full_ta
         for l, t in six.iteritems(full_task_graph.tasks)
         if filter_release_tasks(t, parameters) and standard_filter(t, parameters)
     ]
 
 
 @_target_task("mozilla_esr78_tasks")
 def target_tasks_mozilla_esr78(full_task_graph, parameters, graph_config):
     """Select the set of tasks required for a promotable beta or release build
-    of desktop, plus android CI. The candidates build process involves a pipeline
+    of desktop, without android CI. The candidates build process involves a pipeline
     of builds and signing, but does not include beetmover or balrog jobs."""
 
     def filter(task):
         if not filter_release_tasks(task, parameters):
             return False
 
         if not standard_filter(task, parameters):
             return False
@@ -576,16 +576,40 @@ def target_tasks_mozilla_esr78(full_task
         if test_platform and "-qr/" in test_platform:
             return False
 
         return True
 
     return [l for l, t in six.iteritems(full_task_graph.tasks) if filter(t)]
 
 
+@_target_task("mozilla_esr91_tasks")
+def target_tasks_mozilla_esr91(full_task_graph, parameters, graph_config):
+    """Select the set of tasks required for a promotable beta or release build
+    of desktop, without android CI. The candidates build process involves a pipeline
+    of builds and signing, but does not include beetmover or balrog jobs."""
+
+    def filter(task):
+        if not filter_release_tasks(task, parameters):
+            return False
+
+        if not standard_filter(task, parameters):
+            return False
+
+        platform = task.attributes.get("build_platform")
+
+        # Android is not built on esr91.
+        if platform and "android" in platform:
+            return False
+
+        return True
+
+    return [l for l, t in six.iteritems(full_task_graph.tasks) if filter(t)]
+
+
 @_target_task("promote_desktop")
 def target_tasks_promote_desktop(full_task_graph, parameters, graph_config):
     """Select the superset of tasks required to promote a beta or release build
     of a desktop product. This should include all non-android
     mozilla_{beta,release} tasks, plus l10n, beetmover, balrog, etc."""
 
     def filter(task):
         if task.attributes.get("shipping_product") != parameters["release_product"]:
--- a/taskcluster/taskgraph/transforms/update_verify_config.py
+++ b/taskcluster/taskgraph/transforms/update_verify_config.py
@@ -28,18 +28,18 @@ transforms = TransformSequence()
 INCLUDE_VERSION_REGEXES = {
     "beta": r"'^(\d+\.\d+(b\d+)?)$'",
     "nonbeta": r"'^\d+\.\d+(\.\d+)?$'",
     # Same as beta, except excludes 58.0b1 due to issues with it not being able
     # to update to latest
     "devedition_hack": r"'^((?!58\.0b1$)\d+\.\d+(b\d+)?)$'",
     # Same as nonbeta, except for the esr suffix
     "esr": r"'^\d+\.\d+(\.\d+)?esr$'",
-    # Previous esr versions, for update testing before we update users to esr78
-    "esr78-next": r"'^(52|60|68)+\.\d+(\.\d+)?esr$'",
+    # Previous esr versions, for update testing before we update users to esr91
+    "esr91-next": r"'^(52|60|68|78)+\.\d+(\.\d+)?esr$'",
 }
 
 MAR_CHANNEL_ID_OVERRIDE_REGEXES = {
     "beta": r"'^\d+\.\d+(\.\d+)?$$,firefox-mozilla-beta,firefox-mozilla-release'",
 }
 
 
 @transforms.add
--- a/taskcluster/taskgraph/util/attributes.py
+++ b/taskcluster/taskgraph/util/attributes.py
@@ -15,19 +15,21 @@ INTEGRATION_PROJECTS = {
 
 TRUNK_PROJECTS = INTEGRATION_PROJECTS | {"mozilla-central", "comm-central"}
 
 RELEASE_PROJECTS = {
     "mozilla-central",
     "mozilla-beta",
     "mozilla-release",
     "mozilla-esr78",
+    "mozilla-esr91",
     "comm-central",
     "comm-beta",
     "comm-esr78",
+    "comm-esr91",
     "oak",
 }
 
 RELEASE_PROMOTION_PROJECTS = {
     "jamun",
     "maple",
     "try",
     "try-comm-central",
--- a/taskcluster/taskgraph/util/scriptworker.py
+++ b/taskcluster/taskgraph/util/scriptworker.py
@@ -60,18 +60,20 @@ SIGNING_SCOPE_ALIAS_TO_PROJECT = [
     ],
     [
         "all-release-branches",
         set(
             [
                 "mozilla-beta",
                 "mozilla-release",
                 "mozilla-esr78",
+                "mozilla-esr91",
                 "comm-beta",
                 "comm-esr78",
+                "comm-esr91",
             ]
         ),
     ],
 ]
 
 """Map the signing scope aliases to the actual scopes.
 """
 SIGNING_CERT_SCOPES = {
@@ -111,18 +113,20 @@ BEETMOVER_SCOPE_ALIAS_TO_PROJECT = [
     ],
     [
         "all-release-branches",
         set(
             [
                 "mozilla-beta",
                 "mozilla-release",
                 "mozilla-esr78",
+                "mozilla-esr91",
                 "comm-beta",
                 "comm-esr78",
+                "comm-esr91",
             ]
         ),
     ],
 ]
 
 """Map the beetmover scope aliases to the actual scopes.
 """
 BEETMOVER_BUCKET_SCOPES = {
@@ -174,37 +178,47 @@ BALROG_SCOPE_ALIAS_TO_PROJECT = [
         ),
     ],
     [
         "release",
         set(
             [
                 "mozilla-release",
                 "comm-esr78",
+                "comm-esr91",
             ]
         ),
     ],
     [
         "esr78",
         set(
             [
                 "mozilla-esr78",
             ]
         ),
     ],
+    [
+        "esr91",
+        set(
+            [
+                "mozilla-esr91",
+            ]
+        ),
+    ],
 ]
 
 """Map the balrog scope aliases to the actual scopes.
 """
 BALROG_SERVER_SCOPES = {
     "nightly": "balrog:server:nightly",
     "aurora": "balrog:server:aurora",
     "beta": "balrog:server:beta",
     "release": "balrog:server:release",
     "esr78": "balrog:server:esr",
+    "esr91": "balrog:server:esr",
     "default": "balrog:server:dep",
 }
 
 
 """ The list of the release promotion phases which we send notifications for
 """
 RELEASE_NOTIFICATION_PHASES = ("promote", "push", "ship")