From c50c2bd8ed5e9c5780f1ece755164cb0393ed855 Mon Sep 17 00:00:00 2001 From: Steve Ramage Date: Sat, 24 Oct 2026 13:13:06 -0700 Subject: [PATCH] ci: require perf=fast nodes for Gradle and kaniko build pods (#559) The perf=slow nodes (conway00-05) run at 1.5 GHz versus 2.4 GHz on the perf=fast ones (conway06-10). Once the 4Gi request let heavy pods fit on the 8 GB nodes, the scheduler started placing both Gradle pods of a build there despite the preferred perf=fast affinity, and the larger test suite then ran past the 30-minute build limit. Make perf=fast a required node affinity for heavy (Gradle/kaniko) pods; light pods keep the soft preference. With the existing one-heavy-pod-per- node anti-affinity this allows up to five heavy pods at once and queues the rest. Co-Authored-By: Claude Opus 5.5 (1M context) --- ci/release.Jenkinsfile | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/ci/release.Jenkinsfile b/ci/release.Jenkinsfile index 0af80164..0e168df8 100644 --- a/ci/release.Jenkinsfile +++ b/ci/release.Jenkinsfile @@ -26,8 +26,9 @@ if (isReleaseDay && started_by_timer) { echo "Release channel $releaseChannel" def buildPodDefinition(workerPodImage, ciUtilsEnabled, kanikoEnabled) { - // Pods that run Gradle (worker-pod) or kaniko are "heavy": at most one of them may be scheduled per node, - // across all builds, so a burst of PR builds queues instead of piling onto (and thrashing) the fast nodes. + // Pods that run Gradle (worker-pod) or kaniko are "heavy": they are restricted to the perf=fast nodes, and at most + // one of them may be scheduled per node across all builds, so a burst of PR builds queues instead of piling onto + // (and thrashing) the nodes. def heavy = workerPodImage != null || kanikoEnabled // language=yaml @@ -47,6 +48,22 @@ metadata: spec: affinity: nodeAffinity: +""" + + if (heavy) { + // Gradle/kaniko pods must run on the perf=fast nodes (2.4 GHz). On the 1.5 GHz perf=slow nodes a full build + // or test run took over 30 minutes, and a soft preference was not enough to keep the scheduler off them (#559). + yaml += """ + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: perf + operator: In + values: + - fast +""" + } else { + yaml += """ preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 preference: @@ -56,6 +73,7 @@ spec: values: - fast """ + } if (heavy) { yaml += """