Skip to content

Fix flaky arm64 multi-arch build: register binfmt with current QEMU - #1762

Merged
Ganga Mahesh Siddem (ganga1980) merged 1 commit into
ci_prodfrom
fix/arm64-qemu-binfmt-segfault
Aug 14, 2026
Merged

Ganga Mahesh Siddem (ganga1980) merged 1 commit into
ci_prodfrom
fix/arm64-qemu-binfmt-segfault

Conversation

@suyadav1

@suyadav1 suyadav1 commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Problem

The linux/arm64 leg of the multi-arch build fails ~50% of the time on ci_prod — 9 of the last 20 runs. Most recently build 123410, whose only code change was a one-line telegraf version bump.

The emulated gcc segfaults at random while compiling the ruby native gem extensions in kubernetes/linux/setup.sh. All three retries in that build died in a different place, which is what makes it clearly environmental rather than a code defect:

Attempt Crash site
1 ossl_pkey_dh.o (openssl gem) — Segmentation fault (core dumped)
2 aarch64-unknown-linux-gnu-gcc: internal compiler error: Segmentation fault signal terminated program cc1
3 epoll.o (io-event gem) — Segmentation fault (core dumped)

Further evidence that this is not code-related:

  • Commit 66d115cc2 both failed (123192) and succeeded (123209, 123210) with no changes in between.
  • linux/amd64 compiles the exact same gem set in ~80s, every time.
  • The failure always lands in emulated native compilation, never in ruby/gem logic.

Why it got worse recently. Two changes significantly increased the amount of C compiled under emulation:

  • fluentd 1.19.x pulled in async-httpasyncio-event, a native epoll extension.
  • setup.sh deletes the bundled openssl default gem for CVE reasons, which forces a full openssl gem source build.

Root cause

The emulator was ancient.

docker run --rm --privileged multiarch/qemu-user-static --reset -p yes pins the QEMU binary from that image into the kernel via the binfmt_misc F (fix-binary) flag. That image was last published 2023-01-17 and tops out at QEMU 7.2.

The apt-get install qemu binfmt-support qemu-user-static line above it doesn't help either — Ubuntu freezes upstream versions per release and only backports fixes, so jammy is pinned at QEMU 6.2 (1:6.2+dfsg-2ubuntu6.31, 31 Ubuntu revisions later and still 6.2). It was also redundant, since the --reset -p yes immediately overwrote whatever it registered.

Random cc1 segfaults under old qemu-user are a well-known problem, and the standard remedy is to register handlers from a current QEMU build.

Fix

.pipelines/azure_pipeline_mergedbranches.yaml

  • Register binfmt handlers with tonistiigi/binfmt:qemu-v9.2.2-52 (QEMU 9.2.2) — the image docker/setup-qemu-action uses. Pulled from the MCR mirror, since this pipeline already documents working around Docker Hub rate limiting.
  • Uninstall existing handlers first, so the new QEMU actually takes effect rather than losing to a stale F-flag registration.
  • Drop the redundant apt QEMU install.
  • Add an arm64 smoke test, so broken emulation fails the job in seconds instead of 30+ minutes into the build.
  • Job timeout 120 → 180 min, so the added retries can't trade a segfault for a timeout.

kubernetes/linux/setup.sh

  • Gem install retries 3 → 5 with backoff, as defense in depth. Retries are cheap because already-installed gems are skipped, so each attempt resumes where the previous one crashed (visible in 123410: 905s → 241s → 399s).
  • Log the failing command in the retry warning, and switch the log/error messages from $@ to $*. Inside a quoted string $@ expands to one word per argument; echo re-joins them with spaces so the rendered output is unchanged, making this a readability fix rather than a bug fix. The invocation itself stays gem install "$@", which must keep argument boundaries intact.

scripts/build/linux/install-build-pre-requisites.sh

  • Same QEMU change, so local dev builds match CI.

Validation

Queued as build 123605 on this branch. build_linux succeeded, including the ORAS push and ESRP signing steps that build 123410 never reached.

QEMU registration now reports current emulators:

Status: Downloaded newer image for mcr.microsoft.com/mirror/docker/tonistiigi/binfmt:qemu-v9.2.2-52
uninstalling: qemu-* not found
installing: arm64 OK
...
"supported": [ "linux/amd64", ..., "linux/arm64", ... ]
"emulators": [ "qemu-aarch64", ... ]

The arm64 smoke test passes (aarch64), and the previously fatal gem builds now complete on the first attempt:

#47 970.4  gem install attempt 1/5: gem install fluentd -v 1.19.3 --no-document
#47 2041.6 Successfully installed openssl-4.0.2
#47 2118.3 Successfully installed io-event-1.19.5
#47 2118.3 Successfully installed fluentd-1.19.3

Across the whole build log:

  • 0 occurrences of Segmentation fault / internal compiler error / core dumped (123410 had 3)
  • 0 gem retry warnings — every gem install succeeded on attempt 1
  • Multi-arch manifest pushed: cidev:3.6.0-3-gd08216c60-20260814170628

Also verified before pushing: YAML parses, the rendered inline script and both shell scripts pass bash -n, the retry wrapper was unit-tested (succeeds on retry, exits 1 after exhaustion), and the binfmt flags were checked against the upstream README.

set -e semantics were audited in both scripts, since they differ: the ADO inline script has no set -e (proven by 123410's log continuing past the failed build), so the new critical steps use explicit || exit 1; the dev prereq script does (line 6), so the no-op --uninstall uses || true while --install is left to abort on genuine failure.

Note: Docker windows build for ltsc2019 hit an unrelated transient failure in 123605 and passed on the pipeline's automatic retry. This PR contains no Windows changes.

Follow-up (not in this PR)

The QEMU tag is pinned deliberately, for reproducibility. It's worth revisiting periodically, and longer term a native arm64 build agent would remove the emulation risk entirely rather than just making it much less likely.

The linux/arm64 leg of the multi-arch build fails ~50% of the time on
ci_prod. The emulated gcc segfaults at random while compiling the ruby
native gem extensions in kubernetes/linux/setup.sh -- build 123410 hit
three different crash sites across its three retries (ossl_pkey_dh.o,
a bare cc1 ICE, and io-event's epoll.o), and the same commit
(66d115c) has both passed and failed.

The emulator was ancient. `multiarch/qemu-user-static --reset -p yes`
pins the QEMU binary from that image into the kernel via the binfmt_misc
'F' flag, and that image was last published in Jan 2023 (QEMU 7.2). The
apt qemu-user-static underneath it is frozen at QEMU 6.2 on ubuntu-22.04
(apt backports fixes but never new upstream versions) and was redundantly
overwritten anyway.

Register binfmt handlers with tonistiigi/binfmt instead, which tracks
current QEMU releases and is what docker/setup-qemu-action uses. Pulled
from the MCR mirror since this pipeline already works around Docker Hub
rate limiting. Existing handlers are uninstalled first so the new QEMU
actually takes effect, and an arm64 smoke test fails the job in seconds
if emulation is broken rather than 30+ minutes into the build.

Also bump the gem install retries from 3 to 5 as defense in depth --
retries are cheap because already-installed gems are skipped, so each
attempt resumes where the previous one crashed -- and raise the job
timeout so the extra retries cannot trade a segfault for a timeout.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@suyadav1
suyadav1 requested a review from a team as a code owner August 14, 2026 18:47
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
There may be pipelines that require an authorized user to comment /azp run to run.

@ganga1980
Ganga Mahesh Siddem (ganga1980) merged commit 94ca5a2 into ci_prod Aug 14, 2026
19 checks passed
suyadav1 added a commit that referenced this pull request Aug 14, 2026
The linux/arm64 leg of the multi-arch build fails ~50% of the time on
ci_prod. The emulated gcc segfaults at random while compiling the ruby
native gem extensions in kubernetes/linux/setup.sh -- build 123410 hit
three different crash sites across its three retries (ossl_pkey_dh.o,
a bare cc1 ICE, and io-event's epoll.o), and the same commit
(66d115c) has both passed and failed.

The emulator was ancient. `multiarch/qemu-user-static --reset -p yes`
pins the QEMU binary from that image into the kernel via the binfmt_misc
'F' flag, and that image was last published in Jan 2023 (QEMU 7.2). The
apt qemu-user-static underneath it is frozen at QEMU 6.2 on ubuntu-22.04
(apt backports fixes but never new upstream versions) and was redundantly
overwritten anyway.

Register binfmt handlers with tonistiigi/binfmt instead, which tracks
current QEMU releases and is what docker/setup-qemu-action uses. Pulled
from the MCR mirror since this pipeline already works around Docker Hub
rate limiting. Existing handlers are uninstalled first so the new QEMU
actually takes effect, and an arm64 smoke test fails the job in seconds
if emulation is broken rather than 30+ minutes into the build.

Also bump the gem install retries from 3 to 5 as defense in depth --
retries are cheap because already-installed gems are skipped, so each
attempt resumes where the previous one crashed -- and raise the job
timeout so the extra retries cannot trade a segfault for a timeout.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
suyadav1 added a commit that referenced this pull request Aug 14, 2026
The branch carried cherry-picked copies of ci_prod's commits rather than
ci_prod itself, so those copies had new SHAs and git could not match them
to the originals. The merge base was consequently stuck at 1eabff2
(2026-07-14) and the PR diff re-displayed 8 already-merged PRs:
#1743, #1745, #1746, #1711, #1751, #1756, #1760, #1762.

Merging ci_prod (94ca5a2) makes those commits genuine ancestors, which
advances the merge base and collapses the PR diff from 55 files
(+1326/-2214) to the 24 files (+368/-223) of actual release-process work.

All 4 conflicts were the same theme: ci_prod hardcodes 3.6.0, while this
branch's purpose is to replace hardcoded versions with pipeline-injected
placeholders. Resolved in favour of the branch:

  charts/.../Chart-template.yaml    version/appVersion -> ${HELM_SEMVER} / ${IMAGE_TAG}
  charts/.../values-template.yaml   imageTag*/tag*     -> ${IMAGE_TAG} / ${IMAGE_TAG_WINDOWS}
  kubernetes/linux/Dockerfile.multiarch   IMAGE_TAG    -> 0.0.0-dev
  kubernetes/windows/Dockerfile           IMAGE_TAG    -> win-0.0.0-dev

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
suyadav1 added a commit that referenced this pull request Aug 17, 2026
* Add VERSION-based SEMVER and helm package step to ama-logs build pipeline

Mirror the ama-metrics approach so a downstream release pipeline can later
consume a versioned, packaged Helm chart:

- Add repo-root VERSION file (3.6.0) as the SEMVER base.
- Derive SEMVER = <VERSION>-<branch>-<date>-<commit> in the setup step and
  use it for the linux/windows image tags.
- Templatize the azuremonitor-containerinsights chart (Chart-template.yaml /
  values-template.yaml); generate Chart.yaml/values.yaml at build via
  envsubst and gitignore the generated files. Add generate_helm_files.sh
  local-dev helper.
- Add a helm_chart job that lints, packages, and (on non-PR ci_prod) pushes
  the chart to the cidev ACR OCI path and publishes a pipeline artifact.
- Regenerate Chart.yaml/values.yaml from the templates in the shared Helm
  deploy template (ama-logs-helm-deploy.yaml) so the e2e FilePath deploys
  still have a complete chart after the committed files were removed.
- trunc 63 the chart: labels across the templates so long dev-build SEMVERs
  stay within the 63-char Kubernetes label limit.
- Neutralize stale ARG IMAGE_TAG defaults in the Dockerfiles.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 83c76146-9fbb-4014-998a-eeed6f589b81

* Package and promote -arc Helm chart variant for ama-logs

Build pipeline (azure_pipeline_mergedbranches.yaml): package the chart a
second time as <SEMVER>-arc and push it to cidev alongside the plain
<SEMVER> tag; record both refs in metadata.json; add pushChartToAcr.sh to
the AKS Managed-SDP Ev2 artifacts tar.

Prod release: add a PushChartToACR Ev2 shell extension that oras-copies
both cidev chart tags to ciprod under the clean release tag
(<AgentImageTagSuffix> and <AgentImageTagSuffix>-arc), mirroring the agent
image promotion and reusing existing ScopeBindings/Configuration tokens.
WaitForMCRImages now also polls the ciprod chart repo for both tags before
deploying.

The -arc tag serves the AKS Arc rollout and the plain tag the AKS
extension rollout. Migrating the Arc release pipeline to consume the
promoted -arc chart from ciprod MCR is a follow-up PR.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 83c76146-9fbb-4014-998a-eeed6f589b81

* Derive ama-logs prod release version from build runName

The prod release hand-set AgentImageTagSuffix via VAR_AGENT_IMAGE_TAG_SUFFIX.
Mirror ama-metrics instead: the build pipeline sets its run number to the
SEMVER (##vso[build.updatebuildnumber]), and the release derives
AgentImageTagSuffix from the picked build run's runName
($(resources.pipeline._ci-aks-prod-release.runName)). A release now just picks
a build run and uses whatever version is inside it, keeping the ciprod
image/chart tag and helm deploys in lockstep with the build.

Also drop the now-always-true ne(AgentImageTagSuffix, '') clause from the
Stage_3 gating condition.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 83c76146-9fbb-4014-998a-eeed6f589b81

* Ungate build chart push and set VERSION to 3.5.0

Build pipeline (azure_pipeline_mergedbranches.yaml): remove the
IS_PR/IS_MAIN_BRANCH condition on the "Push Helm chart to ACR" step so the
chart is pushed to cidev on every build, matching ama-metrics whose chart
push is ungated. The ADO pipeline-artifact publish stays gated to non-PR
ci_prod builds. This lets feature-branch build runs produce a cidev chart
the prod release can promote.

VERSION: 3.6.0 -> 3.5.0 so the SEMVER-derived image/chart tags use 3.5.0.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 83c76146-9fbb-4014-998a-eeed6f589b81

* Add .helmignore to exclude chart generator files from package

The build generates Chart.yaml/values.yaml from the *-template.yaml files
before 'helm package', but with no .helmignore the packaged .tgz also
shipped the Chart-template.yaml, values-template.yaml, and
generate_helm_files.sh source files. Exclude them so the published chart
contains only the real chart contents.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 83c76146-9fbb-4014-998a-eeed6f589b81

* Source prod release version solely from build runName; drop dormant SDP pipeline

ci-aks-prod-release.yaml: the cidev->ciprod promotion SOURCE tags now derive
from the picked build run's runName, matching the DEST tag
(AgentImageTagSuffix) and mirroring ama-metrics
resources.pipeline.<alias>.runName. CDPXLinuxTag = runName; CDPXWindowsTag =
win-runName. Removed the two "Set CDPX * Tag" Bash tasks that re-derived these
at runtime from the build artifact's metadata.json, consolidating to a single
runName mechanism (the build sets its run number to SEMVER via
##vso[build.updatebuildnumber], and tags the images/chart with the same
SEMVER, so runName resolves to exactly what was published).

Deleted deployment/mergebranch-multiarch-agent-deployment-Managed-SDP/
ServiceGroupRoot/ManagedSDPReleasePipeline.yml, a dormant standalone OneBranch
pipeline that was never registered in ADO and is referenced nowhere; the live
release runs entirely through the inline Ev2RARollout@2 ("Ev2 Managed SDP -
Deploy") in ci-aks-prod-release.yaml. This file held the last
VAR_AGENT_IMAGE_TAG_SUFFIX / VAR_CDPX_*_TAG version inputs. The rest of
ServiceGroupRoot/ (RolloutSpec.json, RolloutParameter.json, Scripts, etc.) is
kept - the live pipeline consumes it.

Net: no hand-set ADO variable feeds the release version anymore; a release
picks a build run and promotes exactly the image + chart tags that build
produced.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 83c76146-9fbb-4014-998a-eeed6f589b81

* Collapse CDPX tag vars into single AgentImageTagSuffix (ama-metrics parity)

The prod release pipeline carried a legacy CDPX* tag/registry variable set
(CDPXLinux/Windows ACR|Registry|RepoName + CDPXLinuxTag/CDPXWindowsTag) from an
era when the cidev source tag differed from the clean release tag. Now the build
publishes cidev artifacts under clean SEMVER (= the build run's runName), so
source tag == dest tag and the CDPX distinction is redundant. This matches how
ama-metrics promotes: one tag per artifact, symmetric across source/dest, only
the repo differs (cidev -> ciprod).

- ci-aks-prod-release.yaml: delete the CDPX var block (6 dead ACR/Registry/
  RepoName vars never consumed anywhere + CDPXLinuxTag/CDPXWindowsTag that just
  duplicated runName / win-runName); drop cdpxLinuxTag/cdpxWindowsTag from
  configurationOverrides.
- RolloutParameter.json: remove the 3 CDPX_TAG env blocks; repoint each source
  path to __AGENT_IMAGE_TAG_SUFFIX__ (cidev:<tag>, cidev:win-<tag>,
  cidev/azuremonitor-containers:<tag>) so source mirrors dest.
- ScopeBindings.json / Configurations.Public.Prod.json: drop the cdpx bindings
  and settings (keep overrideTag).
- pushAgentToAcr.sh / pushChartToAcr.sh: remove the now-unused CDPX_TAG empty
  guard (AGENT_IMAGE_TAG_SUFFIX is already guarded); refresh the chart-script
  header comment.

Net effect: image + both chart tags all derive from one value, the picked build
run's runName (= SEMVER). No version-carrying ADO variables remain.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 83c76146-9fbb-4014-998a-eeed6f589b81

* Arc prod-release: consume promoted ciprod -arc chart, drop in-pipeline chart push

Mirror the ama-metrics model for the Arc K8s extension prod-release pipeline. The
build packages the Helm chart to cidev and the AKS prod release promotes it to the
single ciprod MCR path (<ver> plain + <ver>-arc). The Arc release now ONLY performs
the rollout/registration of that already-promoted chart instead of packaging and
pushing its own copy.

ci-arc-k8s-extension-prod-release.yaml:
- CHART_VERSION now derives from the picked build run:
  $(resources.pipeline._ci-arc-k8s-extension-prod-release.runName)-arc
  (was the hand-set $(VAR_CHART_VERSION)).
- Delete the two in-pipeline Chart Push stages (Stage_Canary_MCR, Stage_1). No stage
  had an explicit dependsOn on either, so implicit file-order gating rewires cleanly:
  Stage_Canary_Regions is now first and Stage_2 gates on Wait_After_Canary. All
  deploy/wait/JIT stages are unchanged.

arcExtensionRelease.sh:
- Repoint all chart paths (REGISTRY_PATH_CANARY_STABLE/PROD_STABLE and the three
  MCR_NAME_PATH helm-pull sources) to the single promoted ciprod path
  mcr.microsoft.com/azuremonitor/containerinsights/ciprod/azuremonitor-containers.
- Add a header comment documenting the consolidation.

Operational note: the Arc release must run after the AKS prod release has promoted
the chart for the same build run (both key off runName), so ciprod:<runName>-arc
exists when the helm-pull validation runs.

Dormant after this change (tracked for a later cleanup PR): the
deployment/arc-k8s-extension-Managed-SDP/ chart-push folder + its build packaging,
and the now-dead ADO vars/overrides (VAR_CHART_VERSION, ACRName/RepoType, acrName/
repoType). Left in place to keep this a minimal repoint.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 83c76146-9fbb-4014-998a-eeed6f589b81

* Restructure MCR chart path with helmchart/ prefix; push build chart to preview

Per microsoft/mcr #5138 reviewer decision, the public chart repo is
restructured so charts live under a dedicated `helmchart/` segment on MCR,
decoupled from the agent image repos. Dev/build charts reuse the already
onboarded `preview` chart repo (no `helmchart/` prefix, "for now"); prod
charts are promoted to `helmchart/containerinsights/ciprod/...`.

Build (azure_pipeline_mergedbranches.yaml):
- Add `chartRepoName` var = .../public/azuremonitor/containerinsights/preview,
  decoupled from the cidev image `repoImageName`. Repoint both helm pushes
  (<SEMVER> + <SEMVER>-arc), metadata.json refs, and the log message from
  repoImageName to chartRepoName. Update cidev-referencing comments.

AKS prod release:
- ci-aks-prod-release.yaml: WaitForMCRImages verify gate PROD_MCR_CHART_REPO
  -> /azuremonitor/helmchart/containerinsights/ciprod/azuremonitor-containers.
- RolloutParameter.json: SOURCE_CHART_FULL_PATH cidev -> preview;
  DEST_CHART_REPO adds helmchart/ (keeps __AGENT_RELEASE__ parametrization).
- pushChartToAcr.sh: overwrite-guard CHART_MCR_REPO adds helmchart/.

Arc prod release (arcExtensionRelease.sh):
- All 5 ciprod chart refs (2 https REGISTRY_PATH_* + 3 oci MCR_NAME_PATH)
  add helmchart/. Header comment updated (build pushes to preview, not cidev).

Image paths are unchanged (agent image stays on cidev/ciprod). oras copy /
helm pull take full paths, so the dev(preview)/prod(helmchart) asymmetry is
mechanically fine.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 83c76146-9fbb-4014-998a-eeed6f589b81

* Add early -arc chart availability preflight to Arc prod release pipeline

Gate every rollout stage's approval on the promoted <version>-arc chart
being present on the ciprod MCR path, so the Arc release fails fast in the
pipeline (before the approval request and the Ev2 rollout) instead of
mid-rollout inside the Ev2 shell script.

- ci-arc-k8s-extension-prod-release.yaml: add a PowerShell preflight step to
  the releaseGating job of all 6 rollout stages. It queries the anonymous MCR
  v2 tags/list API for
  azuremonitor/helmchart/containerinsights/ciprod/azuremonitor-containers and
  checks for tag $(CHART_VERSION) (= runName + "-arc"), with a short retry
  loop to absorb ACR->MCR mirror propagation. On miss it logs an actionable
  error and exits 1, which skips approval and the Ev2 rollout via the existing
  dependsOn chain (approval dependsOn releaseGating; rollout dependsOn approval).

arcExtensionRelease.sh is unchanged (keeps its per-stage helm pull as an
Ev2-time last-resort check).

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 83c76146-9fbb-4014-998a-eeed6f589b81

* TEMP(test): version 3.4.0 + AKS chart-only promotion (disable image transfer)

Test-prep changes to validate the Helm chart promotion path without producing
a ciprod ama-logs image on MCR:

- VERSION 3.5.0 -> 3.4.0: avoid colliding test SEMVER tags with the team's
  in-progress 3.5.0 GA rollout.
- AKS Managed-SDP RolloutSpec.json: drop shell/PushAgentToACR and
  shell/PushAgentToACR-1 (Linux/Windows image transfer); keep only
  shell/PushChartToACR so the run promotes the chart (plain + -arc) but no image.
- ci-aks-prod-release.yaml Stage_3: condition -> false. Its WaitForMCRImages gate
  requires the image tags (would hang 24h) and its cluster deploys need the image;
  disabled for the chart-only test. Original condition preserved in a REVERT comment.

Temporary; revert after chart-promotion testing.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 83c76146-9fbb-4014-998a-eeed6f589b81

* Remove unused generate_helm_files.sh dev helper

The script duplicated the pipeline's inline envsubst generation and was
never invoked by any automation (build pipeline and helm-deploy templates
inline the same substitution). Drop it and its .helmignore entry; local
chart generation, if needed, can be done with the same envsubst commands.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 83c76146-9fbb-4014-998a-eeed6f589b81

* Re-enable Linux/Windows image transfer in AKS prod EV2 rollout

Restore PushAgentToACR + PushAgentToACR-1 alongside PushChartToACR so the
Stage_2 EV2 rollout promotes the ama-logs images (preview/cidev -> ciprod)
in addition to the chart. The chart pins pods to
mcr.microsoft.com/azuremonitor/containerinsights/ciprod:<tag>, so the Arc
canary rollout requires the ciprod image to exist or pods hit
ImagePullBackOff. This is the production-correct action set for this PR.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 83c76146-9fbb-4014-998a-eeed6f589b81

* Revert Arc prod-release changes for current release

For the current release the Arc prod release pipeline stays unchanged from
ci_prod (still packages/pushes the chart in-pipeline). The consume-promoted-
ciprod-chart changes are preserved on branch zane/arc-prod-release-changes and
will be re-applied next release when managed-EV2 (PR #1745) handles Arc rollout.

Reverted to ci_prod:
- .pipelines/ci-arc-k8s-extension-prod-release.yaml
- deployment/arc-k8s-extension-release-v2-Managed-SDP/ServiceGroupRoot/Scripts/arcExtensionRelease.sh

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 83c76146-9fbb-4014-998a-eeed6f589b81

* Revert temp test scaffolding to GA state

The chart+image promotion test is done, so restore production values:
- VERSION 3.4.0 -> 3.5.0
- ci-aks-prod-release.yaml Stage_3: restore
  condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true))
  (was temporarily condition: false for the chart-only test)

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 83c76146-9fbb-4014-998a-eeed6f589b81

* Cleanup toggles for CI (#1743)

* managed ev2 pipeline for logs (#1745)

* 3.5.0 Release notes (#1746)

* 3.5.0 release notes and chart update

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 3a92dbc1-2157-499d-b5ec-5834710c7180

* Update extension pipelines

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* OTLP GRPC support (#1711)

* Upgrade mdsd for otlp grpc support

* Upgrade to 1.42

* Pin azure-mdsd to 1.42.0

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* 3.6.0 release notes and chart update (#1751)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Route NuGet restore through CFS feed (SR21 CFSClean) (#1756)

Pipeline 444 (ContainerInsights-MultiArch-MergedBranches) is flagged under
MountainPass SR21 / SFI-ES4.2.4 for CFSClean violations. 1ES telemetry shows
the only CFSClean endpoint hit is api.nuget.org, from dotnet.exe during the
'build base' step on build_windows_2019 and build_windows_2022.

Changes:
- Add NuGet.config at repo root with <clear /> and only the CFS-backed
  Azure Artifacts feed (microsoft_PublicPackages), which already has a
  NuGet Gallery upstream. Without this, restore falls back to api.nuget.org.
- Drop 'dotnet add package Newtonsoft.json' and 'dotnet add package
  BouncyCastle' from build/windows/Makefile.ps1. Both are already pinned as
  PackageReference in CertificateGenerator.csproj (13.0.1 / 1.8.9); the
  unversioned 'dotnet add package' calls reach api.nuget.org to resolve the
  latest version and rewrite the csproj, un-pinning the versions at build time.
- Add NuGetAuthenticate@1 to both Windows jobs so the credential provider is
  configured for the feed. The build shells out to dotnet from a script rather
  than DotNetCoreCLI@2, so nothing wires up feed auth today.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: ee239d9a-59a5-409c-bf8f-5a1e5d9a9d58

* Upgrade telegraf-agent to 1.39.3 (#1760)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix flaky arm64 build: use current QEMU for binfmt emulation (#1762)

The linux/arm64 leg of the multi-arch build fails ~50% of the time on
ci_prod. The emulated gcc segfaults at random while compiling the ruby
native gem extensions in kubernetes/linux/setup.sh -- build 123410 hit
three different crash sites across its three retries (ossl_pkey_dh.o,
a bare cc1 ICE, and io-event's epoll.o), and the same commit
(66d115c) has both passed and failed.

The emulator was ancient. `multiarch/qemu-user-static --reset -p yes`
pins the QEMU binary from that image into the kernel via the binfmt_misc
'F' flag, and that image was last published in Jan 2023 (QEMU 7.2). The
apt qemu-user-static underneath it is frozen at QEMU 6.2 on ubuntu-22.04
(apt backports fixes but never new upstream versions) and was redundantly
overwritten anyway.

Register binfmt handlers with tonistiigi/binfmt instead, which tracks
current QEMU releases and is what docker/setup-qemu-action uses. Pulled
from the MCR mirror since this pipeline already works around Docker Hub
rate limiting. Existing handlers are uninstalled first so the new QEMU
actually takes effect, and an arm64 smoke test fails the job in seconds
if emulation is broken rather than 30+ minutes into the build.

Also bump the gem install retries from 3 to 5 as defense in depth --
retries are cheap because already-installed gems are skipped, so each
attempt resumes where the previous one crashed -- and raise the job
timeout so the extra retries cannot trade a segfault for a timeout.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Update version to 3.6.0

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: suyadav1 <87668410+suyadav1@users.noreply.github.com>
Co-authored-by: rashmichandrashekar <rashmy@microsoft.com>
Co-authored-by: bragi92 <kadubey@microsoft.com>
Co-authored-by: azure-monitor-assistant[bot] <217255729+azure-monitor-assistant[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Sunil Yadav <suyadav@microsoft.com>
Copilot-Session: 83c76146-9fbb-4014-998a-eeed6f589b81
Copilot-Session: ee239d9a-59a5-409c-bf8f-5a1e5d9a9d58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants