From 4ed158489ff7c75a173850cac6fdbfada3175006 Mon Sep 17 00:00:00 2001 From: Alexandre Lissy Date: Wed, 17 Dec 2025 18:00:14 +0100 Subject: [PATCH 1/2] FxCI: Add Windows Aarch64 --- .../win64-aarch64/nightly-enterprise | 7 ++ python/mozbuild/mozbuild/mach_commands.py | 11 ++- python/mozbuild/mozbuild/repackaging/msix.py | 1 + taskcluster/config.yml | 2 + taskcluster/gecko_taskgraph/decision.py | 16 +++-- .../transforms/partner_repack.py | 6 +- .../gecko_taskgraph/transforms/repackage.py | 67 +++++++++++++------ .../transforms/repackage_partner.py | 10 ++- .../transforms/repackage_signing.py | 17 ++++- taskcluster/gecko_taskgraph/util/verify.py | 23 +++++++ .../kinds/beetmover-geckoview/kind.yml | 1 + taskcluster/kinds/build/windows.yml | 56 ++++++++++++++++ .../enterprise-repack-repackage/kind.yml | 5 ++ taskcluster/kinds/enterprise-repack/kind.yml | 10 +++ taskcluster/kinds/repackage-msix/kind.yml | 11 +-- .../kinds/repackage-signing-msix/kind.yml | 3 - taskcluster/kinds/repackage-signing/kind.yml | 1 + taskcluster/kinds/repackage/kind.yml | 1 + 18 files changed, 212 insertions(+), 36 deletions(-) create mode 100644 browser/config/mozconfigs/win64-aarch64/nightly-enterprise diff --git a/browser/config/mozconfigs/win64-aarch64/nightly-enterprise b/browser/config/mozconfigs/win64-aarch64/nightly-enterprise new file mode 100644 index 0000000000000..03c37880aa682 --- /dev/null +++ b/browser/config/mozconfigs/win64-aarch64/nightly-enterprise @@ -0,0 +1,7 @@ +. "$topsrcdir/build/mozconfig.win-common" +. "$topsrcdir/browser/config/mozconfigs/win64-aarch64/common-win64" +. "$topsrcdir/browser/config/mozconfigs/win64-aarch64/common-opt" + +ac_add_options --enable-enterprise + +. "$topsrcdir/build/mozconfig.common.override" diff --git a/python/mozbuild/mozbuild/mach_commands.py b/python/mozbuild/mozbuild/mach_commands.py index 7259c406566a7..def8866fb9125 100644 --- a/python/mozbuild/mozbuild/mach_commands.py +++ b/python/mozbuild/mozbuild/mach_commands.py @@ -3015,7 +3015,15 @@ def repackage_msi( @CommandArgument( "--channel", type=str, - choices=["official", "beta", "esr", "aurora", "nightly", "unofficial"], + choices=[ + "official", + "beta", + "esr", + "aurora", + "nightly", + "unofficial", + "firefoxenterprise", + ], help="Release channel.", ) @CommandArgument( @@ -3120,6 +3128,7 @@ def repackage_msix( "beta": "beta", "aurora": "aurora", "nightly": "nightly", + "firefoxenterprise": "firefoxenterprise", } if not input: diff --git a/python/mozbuild/mozbuild/repackaging/msix.py b/python/mozbuild/mozbuild/repackaging/msix.py index a52b72bef8fad..67e2bd623f7a9 100644 --- a/python/mozbuild/mozbuild/repackaging/msix.py +++ b/python/mozbuild/mozbuild/repackaging/msix.py @@ -358,6 +358,7 @@ def repackage_msix( "aurora", "nightly", "unofficial", + "firefoxenterprise", ): raise Exception(f"channel is unrecognized: {channel}") diff --git a/taskcluster/config.yml b/taskcluster/config.yml index fa2fed24ac0b1..821a1c28f9b19 100644 --- a/taskcluster/config.yml +++ b/taskcluster/config.yml @@ -199,7 +199,9 @@ treeherder: 'Rpk-Ent': 'Enterprise repacks' 'Rpk': 'Classic repacks' 'MSI-Ent': "MSI Enterprise repacks" + 'MSIX-Ent': "MSIX Enterprise repacks" 'MSIs-Ent': "MSI signed Enterprise repacks" + 'MSIXs-Ent': "MSIX signed Enterprise repacks" 'BMS-Ent': "Mac signing for Enterprise repacks" 'BMN-Ent': "Mac notarization for Enterprise repacks" diff --git a/taskcluster/gecko_taskgraph/decision.py b/taskcluster/gecko_taskgraph/decision.py index 71a25361338e5..ef5dac70bfc05 100644 --- a/taskcluster/gecko_taskgraph/decision.py +++ b/taskcluster/gecko_taskgraph/decision.py @@ -143,6 +143,17 @@ }, }, }, + "repackage-msix": { + "sample": { + "gcpEU": { + "locales": ["en-US"], + "platforms": [ + "win64-enterprise-shippable", + "win64-aarch64-enterprise-shippable", + ], + }, + }, + }, "enterprise-repack-repackage": { "sample": { "gcpEU": { @@ -152,6 +163,7 @@ "linux64-aarch64-enterprise-shippable", "macosx64-enterprise-shippable", "win64-enterprise-shippable", + "win64-aarch64-enterprise-shippable", ], }, }, @@ -161,9 +173,7 @@ "gcpEU": { "locales": ["en-US"], "platforms": [ - "linux64-enterprise-shippable", "macosx64-enterprise-shippable", - "win64-enterprise-shippable", ], }, }, @@ -173,8 +183,6 @@ "gcpEU": { "locales": ["en-US"], "platforms": [ - "linux64-enterprise-shippable", - "macosx64-enterprise-shippable", "win64-enterprise-shippable", ], }, diff --git a/taskcluster/gecko_taskgraph/transforms/partner_repack.py b/taskcluster/gecko_taskgraph/transforms/partner_repack.py index a02583327a490..5e65d0aff2a78 100644 --- a/taskcluster/gecko_taskgraph/transforms/partner_repack.py +++ b/taskcluster/gecko_taskgraph/transforms/partner_repack.py @@ -120,7 +120,11 @@ def add_command_arguments(config, tasks): task["attributes"]["build_platform"], ), ) - platform = task["attributes"]["build_platform"].partition("-shippable")[0] + platform = ( + task["attributes"]["build_platform"] + .partition("-shippable")[0] + .partition("-enterprise")[0] + ) task["run"]["options"] = [ "version={}".format(release_config["version"]), "build-number={}".format(release_config["build_number"]), diff --git a/taskcluster/gecko_taskgraph/transforms/repackage.py b/taskcluster/gecko_taskgraph/transforms/repackage.py index 8b3d64e8ae0b1..d27545cc2e8ca 100644 --- a/taskcluster/gecko_taskgraph/transforms/repackage.py +++ b/taskcluster/gecko_taskgraph/transforms/repackage.py @@ -528,11 +528,17 @@ def make_job_description(config, jobs): if not dep_th_platform and "enterprise-repack-repackage" in dep_job.kind: build_platform = attributes.get("build_platform") if "linux64" in build_platform: - dep_th_platform = "linux64-enterprise/opt" + if "aarch64" in build_platform: + dep_th_platform = "linux64-aarch64-enterprise/opt" + else: + dep_th_platform = "linux64-enterprise/opt" elif "macosx64" in build_platform: dep_th_platform = "osx-cross-enterprise/opt" elif "win64" in build_platform: - dep_th_platform = "windows2012-64-enterprise/opt" + if "aarch64" in build_platform: + dep_th_platform = "windows2012-aarch64-enterprise/opt" + else: + dep_th_platform = "windows2012-64-enterprise/opt" else: raise ValueError(f"Unsupported {build_platform}") @@ -566,10 +572,16 @@ def make_job_description(config, jobs): elif config.kind == "repackage-msix": assert not locale - # Like "MSIXs(Bs)". - treeherder["symbol"] = "MSIX({})".format( - dep_job.task.get("extra", {}).get("treeherder", {}).get("symbol", "B") - ) + if "enterprise-repack" in dep_job.label: + repack_id = dep_job.task.get("extra").get("repack_id") + treeherder["symbol"] = f"MSIX-Ent({repack_id})" + else: + # Like "MSIXs(Bs)". + treeherder["symbol"] = "MSIX({})".format( + dep_job.task.get("extra", {}) + .get("treeherder", {}) + .get("symbol", "B") + ) elif config.kind == "repackage-shippable-l10n-msix": assert not locale @@ -862,6 +874,7 @@ def make_job_description(config, jobs): locale=locale, existing_fetch=task["fetches"], enterprise_repack=repack, + repack_label=repack_task["label"], ) yield repack_task @@ -876,6 +889,7 @@ def _generate_download_config( locale=None, existing_fetch=None, enterprise_repack=None, + repack_label=None ): locale_path = f"{locale}/" if locale else "" fetch = {} @@ -885,11 +899,7 @@ def _generate_download_config( if enterprise_repack: locale_path = f"{enterprise_repack}/" - if repackage_signing_task and build_platform.startswith("win"): - fetch.update({ - repackage_signing_task: [f"{locale_path}target.installer.exe"], - }) - elif build_platform.startswith("linux") or build_platform.startswith("macosx"): + if build_platform.startswith("linux") or build_platform.startswith("macosx"): signing_fetch = [ { "artifact": f"{locale_path}target{archive_format(build_platform)}", @@ -903,15 +913,32 @@ def _generate_download_config( }) fetch.update({signing_task: signing_fetch}) elif build_platform.startswith("win"): - fetch.update({ - signing_task: [ - { - "artifact": f"{locale_path}target.zip", - "extract": False, - }, - f"{locale_path}setup.exe", - ], - }) + if repackage_signing_task and build_platform.startswith("win"): + if "-msi-" in repack_label: + fetch.update({ + repackage_signing_task: [f"{locale_path}target.installer.exe"], + }) + elif "-msix-" in repack_label: + fetch.update({ + repackage_signing_task: [ + { + "artifact": f"{locale_path}target.zip", + "extract": False, + } + ], + }) + else: + raise NotImplementedError(f"Unsupported enterprise repack {task.label}") + else: + fetch.update({ + signing_task: [ + { + "artifact": f"{locale_path}target.zip", + "extract": False, + }, + f"{locale_path}setup.exe", + ], + }) use_stub = task.attributes.get("stub-installer") if use_stub: diff --git a/taskcluster/gecko_taskgraph/transforms/repackage_partner.py b/taskcluster/gecko_taskgraph/transforms/repackage_partner.py index 6f274b26ef683..959c27e6501dd 100644 --- a/taskcluster/gecko_taskgraph/transforms/repackage_partner.py +++ b/taskcluster/gecko_taskgraph/transforms/repackage_partner.py @@ -238,11 +238,17 @@ def make_job_description(config, jobs): .replace("shippable", "") ) if "linux64" in platform: - th_platform = "linux64-enterprise/opt" + if "aarch64" in platform: + th_platform = "linux64-aarch64-enterprise/opt" + else: + th_platform = "linux64-enterprise/opt" elif "macosx64" in platform: th_platform = "osx-cross-enterprise/opt" elif "win64" in platform: - th_platform = "windows2012-64-enterprise/opt" + if "aarch64" in platform: + th_platform = "windows2012-aarch64-enterprise/opt" + else: + th_platform = "windows2012-64-enterprise/opt" else: raise ValueError(f"Unsupported {platform}") diff --git a/taskcluster/gecko_taskgraph/transforms/repackage_signing.py b/taskcluster/gecko_taskgraph/transforms/repackage_signing.py index ddd93aba5b084..05e6cc143e461 100644 --- a/taskcluster/gecko_taskgraph/transforms/repackage_signing.py +++ b/taskcluster/gecko_taskgraph/transforms/repackage_signing.py @@ -75,7 +75,22 @@ def make_repackage_signing_description(config, jobs): dep_symbol = dep_job.task.get("extra").get("treeherder").get("symbol") treeherder["symbol"] = f"MSIs-Ent({dep_symbol})" else: - treeherder["symbol"] = "MSIs({})".format(locale or "N") + treeherder["symbol"] = "MSIs({})".format( + dep_job.task.get("extra", {}) + .get("treeherder", {}) + .get("symbol", "B") + ) + + if config.kind == "repackage-signing-msix": + if "enterprise-repack" in dep_job.label: + dep_symbol = dep_job.task.get("extra").get("treeherder").get("symbol") + treeherder["symbol"] = f"MSIXs-Ent({dep_symbol})" + else: + treeherder["symbol"] = "MSIXs({})".format( + dep_job.task.get("extra", {}) + .get("treeherder", {}) + .get("symbol", "B") + ) elif config.kind in ( "repackage-signing-msix", diff --git a/taskcluster/gecko_taskgraph/util/verify.py b/taskcluster/gecko_taskgraph/util/verify.py index 4207f9bf5a029..889ebc6429b52 100644 --- a/taskcluster/gecko_taskgraph/util/verify.py +++ b/taskcluster/gecko_taskgraph/util/verify.py @@ -397,6 +397,29 @@ def has_one_route_with(what): f"The following task has a route with invalid index `{task.label}`: {route}" ) +@verifications.add("full_task_graph") +def verify_no_shippable_enterprise( + task, taskgraph, scratch_pad, graph_config, parameters +): + """ + This function ensures that enterprise tasks for PR (level 1) are not shippable + """ + + if not task or not "enterprise" in task.label or task.label.endswith("/debug"): + return + + level = int(parameters["level"]) + + if level not in [1, 3]: + raise Exception(f"Unexpected level `{level}` for task `{task.label}`") + + is_shippable = task.attributes.get("shippable", False) + + if level == 1: + if is_shippable or "shippable" in task.label: + raise Exception(f"Unexpected shippable status for task of level `{level}` `{task.label}`: {is_shippable}") + + @verifications.add("full_task_graph") def verify_routes_notification_filters( diff --git a/taskcluster/kinds/beetmover-geckoview/kind.yml b/taskcluster/kinds/beetmover-geckoview/kind.yml index 78d72b56d866d..ef1a2c3fd7ff1 100644 --- a/taskcluster/kinds/beetmover-geckoview/kind.yml +++ b/taskcluster/kinds/beetmover-geckoview/kind.yml @@ -34,6 +34,7 @@ not-for-build-platforms: - win64-enterprise/opt - win64-enterprise-shippable/opt - win64-aarch64-shippable/opt + - win64-aarch64-enterprise-shippable/opt - win64-nightlyasrelease/opt - linux64-devedition/opt - linux64-aarch64-devedition/opt diff --git a/taskcluster/kinds/build/windows.yml b/taskcluster/kinds/build/windows.yml index 459b01166642c..f9f2224124c64 100644 --- a/taskcluster/kinds/build/windows.yml +++ b/taskcluster/kinds/build/windows.yml @@ -588,6 +588,62 @@ win64-enterprise/opt: fetch: - upx-3.95-win +win64-aarch64-enterprise-shippable/opt: + description: "AArch64 Win64 Enterprise Shippable" + use-pgo: win64-shippable/opt + index: + product: firefox + job-name: win64-aarch64-enterprise-shippable-opt + type: shippable + attributes: + shippable: true + enable-full-crashsymbols: true + shipping-phase: build + shipping-product: firefox + treeherder: + platform: windows2012-aarch64-enterprise-shippable/opt + symbol: Bpgo(Bent) + tier: 1 + run-on-projects: ["enterprise-firefox"] + run-on-repo-type: ["git"] + worker-type: b-linux-docker-xlarge-amd + worker: + max-run-time: 10800 + env: + PERFHERDER_EXTRA_OPTIONS: enterprise + MOZ_AUTOMATION_PACKAGE_TESTS: "1" + run: + actions: [get-secrets, build] + options: [append-env-variables-from-configs] + script: mozharness/scripts/fx_desktop_build.py + secrets: true + config: + - builds/releng_base_firefox.py + - builds/releng_base_linux_64_builds.py + extra-config: + stage_platform: win64-aarch64 + mozconfig_platform: win64-aarch64 + max_build_output_timeout: 3600 + fetches: + toolchain: + - linux64-clang + - linux64-rust-cross + - linux64-rust-size + - linux64-nasm + - linux64-node + - linux64-cbindgen + - linux64-dump_syms + - linux64-wine + - linux64-winchecksec + - nsis + - sysroot-x86_64-linux-gnu + - sysroot-wasm32-wasi + - vs + - dxc-aarch64-pc-windows-msvc + - winappsdk-aarch64-pc-windows-msvc + fetch: + - upx-3.95-win + win64-plain/opt: description: "Win64 Opt Plain" index: diff --git a/taskcluster/kinds/enterprise-repack-repackage/kind.yml b/taskcluster/kinds/enterprise-repack-repackage/kind.yml index 60a0d9dd574db..cdf991ad9a9a0 100644 --- a/taskcluster/kinds/enterprise-repack-repackage/kind.yml +++ b/taskcluster/kinds/enterprise-repack-repackage/kind.yml @@ -22,6 +22,7 @@ kind-dependencies: only-for-build-platforms: - macosx64-enterprise-shippable/opt - win64-enterprise-shippable/opt + - win64-aarch64-enterprise-shippable/opt tasks: enterprise-repack-repackage: @@ -44,6 +45,10 @@ tasks: - repackage/base.py - repackage/win32_sfx_stub.py - repackage/win64_partner.py + win64-aarch64\b.*: + - repackage/base.py + - repackage/win64-aarch64_sfx_stub.py + - repackage/win64_signed.py linux64.*: - repackage/base.py package-formats: diff --git a/taskcluster/kinds/enterprise-repack/kind.yml b/taskcluster/kinds/enterprise-repack/kind.yml index 136c980b3f6ea..fc5bf55191e73 100644 --- a/taskcluster/kinds/enterprise-repack/kind.yml +++ b/taskcluster/kinds/enterprise-repack/kind.yml @@ -53,6 +53,7 @@ only-for-build-platforms: - linux64-aarch64-enterprise-shippable/opt - macosx64-enterprise-shippable/opt - win64-enterprise-shippable/opt + - win64-aarch64-enterprise-shippable/opt tasks: linux64-enterprise-shippable: @@ -91,3 +92,12 @@ tasks: build_platform: win64-enterprise-shippable build_type: opt artifact_prefix: public + win64-aarch64-enterprise-shippable: + treeherder: + symbol: Rpk-Ent + platform: windows2012-aarch64-enterprise/opt + attributes: + shippable: true + build_platform: win64-aarch64-enterprise-shippable + build_type: opt + artifact_prefix: public diff --git a/taskcluster/kinds/repackage-msix/kind.yml b/taskcluster/kinds/repackage-msix/kind.yml index 32784575d20fb..fb262f3492043 100644 --- a/taskcluster/kinds/repackage-msix/kind.yml +++ b/taskcluster/kinds/repackage-msix/kind.yml @@ -13,12 +13,10 @@ transforms: kind-dependencies: # We're going to generate tasks based on this. We `depend` on and fetch the package from this. + - enterprise-repack-repackage - build-signing - toolchain -task-defaults: - run-on-repo-type: [hg] - only-for-build-platforms: - win32/opt - win64/opt @@ -26,7 +24,9 @@ only-for-build-platforms: - win64/debug - win32-shippable/opt - win64-shippable/opt + - win64-enterprise-shippable/opt - win64-aarch64-shippable/opt + - win64-aarch64-enterprise-shippable/opt - win32-devedition/opt - win64-devedition/opt - win64-aarch-devedition/opt @@ -39,7 +39,7 @@ tasks: worker: max-run-time: 2700 # This is for fast try iteration; `repackage-shippable-l10n-msix` is the "real one". - run-on-projects: [] + # run-on-projects: [] mozharness: config: by-build-platform: @@ -66,6 +66,7 @@ tasks: devedition: aurora default: by-release-type: + nightly-enterprise: firefoxenterprise beta.*: beta release.*: official esr.*: official @@ -80,12 +81,14 @@ tasks: by-package-format: msix: by-release-type: + nightly-enterprise: firefoxenterprise beta.*: MozillaFirefoxBeta release.*: MozillaFirefox esr.*: MozillaFirefox default: MozillaFirefoxNightly msix-store: by-release-type: + nightly-enterprise: firefoxenterprise beta.*: FirefoxBeta release.*: Firefox esr.*: Firefox diff --git a/taskcluster/kinds/repackage-signing-msix/kind.yml b/taskcluster/kinds/repackage-signing-msix/kind.yml index 29d6ac75bb840..97ee6f87329f0 100644 --- a/taskcluster/kinds/repackage-signing-msix/kind.yml +++ b/taskcluster/kinds/repackage-signing-msix/kind.yml @@ -13,9 +13,6 @@ transforms: kind-dependencies: - repackage-msix -task-defaults: - run-on-repo-type: [hg] - tasks: repackage-signing-msix: from-deps: diff --git a/taskcluster/kinds/repackage-signing/kind.yml b/taskcluster/kinds/repackage-signing/kind.yml index 6447d6666bbe8..83b86eeb08e5b 100644 --- a/taskcluster/kinds/repackage-signing/kind.yml +++ b/taskcluster/kinds/repackage-signing/kind.yml @@ -23,6 +23,7 @@ only-for-build-platforms: - win64-aarch64-devedition/opt - win64-asan-reporter-shippable/opt - win64-enterprise-shippable/opt + - win64-aarch64-enterprise-shippable/opt tasks: repackage-signing: diff --git a/taskcluster/kinds/repackage/kind.yml b/taskcluster/kinds/repackage/kind.yml index c23cbbf5478bc..ac330d564fa26 100644 --- a/taskcluster/kinds/repackage/kind.yml +++ b/taskcluster/kinds/repackage/kind.yml @@ -49,6 +49,7 @@ only-for-build-platforms: - win64-asan-reporter-shippable/opt - win64-enterprise/opt - win64-enterprise-shippable/opt + - win64-aarch64-enterprise-shippable/opt tasks: repackage: From 70e238f571db69042aac251ab7576be47673d22f Mon Sep 17 00:00:00 2001 From: Alexandre Lissy Date: Fri, 16 Jan 2026 23:25:38 +0100 Subject: [PATCH 2/2] DO NOT LAND: ALLOW SHIPPABLE ON PR --- taskcluster/gecko_taskgraph/target_tasks.py | 6 +++--- taskcluster/gecko_taskgraph/util/verify.py | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/taskcluster/gecko_taskgraph/target_tasks.py b/taskcluster/gecko_taskgraph/target_tasks.py index f951035deb6c4..bd9ed080cb38e 100644 --- a/taskcluster/gecko_taskgraph/target_tasks.py +++ b/taskcluster/gecko_taskgraph/target_tasks.py @@ -501,9 +501,9 @@ def filter(task): build_type = task.attributes.get("build_type") shippable = task.attributes.get("shippable", False) - level = int(parameters["level"]) - if ("shippable" in task.label or shippable) and level < 3: - return False + #level = int(parameters["level"]) + #if ("shippable" in task.label or shippable) and level < 3: + # return False if task.kind == "enterprise-test": return True diff --git a/taskcluster/gecko_taskgraph/util/verify.py b/taskcluster/gecko_taskgraph/util/verify.py index 889ebc6429b52..afcb5e47f49d3 100644 --- a/taskcluster/gecko_taskgraph/util/verify.py +++ b/taskcluster/gecko_taskgraph/util/verify.py @@ -404,6 +404,7 @@ def verify_no_shippable_enterprise( """ This function ensures that enterprise tasks for PR (level 1) are not shippable """ + return if not task or not "enterprise" in task.label or task.label.endswith("/debug"): return