From b98e6a99ae2e64f18d5ca72cf5d38b087e10b364 Mon Sep 17 00:00:00 2001 From: "Dustin C. Hatch" Date: Thu, 25 Sep 2025 18:52:44 -0500 Subject: [PATCH] bci2: Add resources argument Instead of a top-level boolean that says whether or not the build can/should run on a Raspberry Pi, we'll expose a `resources` argument that allows jobs to specify their compute requirements. If they're not specified, then the job can run anywhere. Otherwise, if the requirements are too large for a Pi, then the autoscaler will launch a cloud worker to handle the build. --- vars/buildContainerImage2.groovy | 37 ++++++++++++++++---------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/vars/buildContainerImage2.groovy b/vars/buildContainerImage2.groovy index 891c1ff..478d917 100644 --- a/vars/buildContainerImage2.groovy +++ b/vars/buildContainerImage2.groovy @@ -9,6 +9,7 @@ def call(args) { def schedule = args?.schedule def defaultBranch = args?.defaultBranch def pi = args?.pi + def resources = args?.resources properties([ pipelineTriggers([cron(schedule ?: 'H H H * *')]) @@ -32,9 +33,6 @@ def call(args) { if (defaultBranch == null) { defaultBranch = 'main' } - if (pi == null) { - pi = true - } def repo = "${registry}/${project}/${name}" def full_name = "${repo}:${tag}" @@ -48,14 +46,14 @@ def call(args) { full_name: full_name, registry: registry, arch: arch, - pi: pi, + resources: resources, ) } } } parallel stages - runInPod(pi: false) { + runInPod { container('buildah') { withBuildahCreds(registry) { if (archlist.size() > 1) { @@ -96,9 +94,9 @@ def buildStage(args) { def full_name = args.full_name def registry = args.registry def arch = args.arch - def pi = args.pi + def resources = args?.resources - runInPod(arch: arch, pi: pi) { + runInPod(arch: arch, resources: resources) { checkout scm container('buildah') { @@ -111,23 +109,24 @@ def buildStage(args) { } } +def runInPod(block) { + runInPod(null, block) +} + def runInPod(args, block) { def arch = args?.arch - def pi = args?.pi - if (pi == null) { - pi = true - } + def resources = args?.resources def podTemplateYaml = libraryResource('podTemplate2.yaml') - if (pi) { + if (resources) { def tmpl = readYaml(text: podTemplateYaml) - def tolerations = tmpl['spec']['tolerations'] ?: [] - tolerations.push([ - key: 'du5t1n.me/machine', - value: 'raspberrypi', - effect: 'NoExecute', - ]) - tmpl['spec']['tolerations'] = tolerations + tmpl.spec.containers.each { c -> + c.resources = c.resources ?: [:] + c.resources.putAll([ + requests: (c.resources.requests ?: [:]) + resources, + limits: (c.resources.limits ?: [:]) + resources, + ]) + } podTemplateYaml = writeYaml(data: tmpl, returnText: true) } podTemplate(