# Copyright 2025 syzkaller project authors. All rights reserved. # Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. # Do smoke builds of all kernel repositories that might be used as base kernels. # The kernels will be rebuilt only if there are newer commits available, so # it's okay to invoke this workflow often. # TODO: once we switch to some build service, ensure that these are cached. apiVersion: argoproj.io/v1alpha1 kind: CronWorkflow metadata: name: rebuild-kernels-cron spec: # Three times per day. schedule: "30 */8 * * *" concurrencyPolicy: "Replace" startingDeadlineSeconds: 0 workflowSpec: entrypoint: main podMetadata: labels: tier: workflow podGC: strategy: OnPodCompletion deleteDelayDuration: 12h ttlStrategy: secondsAfterCompletion: 86400 templates: - name: main parallelism: 1 steps: - - name: query-data template: query-data-template - - name: prepare-build-requests template: prepare-build-requests-template arguments: parameters: - name: response value: "{{steps.query-data.outputs.result}}" - - name: iterate-builds template: process-build-request arguments: parameters: - name: request-json value: "{{item}}" withParam: "{{steps.prepare-build-requests.outputs.result}}" continueOn: failed: true - name: query-data-template http: url: "http://controller-service:8080/trees" method: "GET" - name: prepare-build-requests-template inputs: parameters: - name: response script: image: python:3.9 command: [python] source: | import json import sys data = json.loads('''{{inputs.parameters.response}}''') unique_kernel_configs = sorted(list(set( campaign["kernel_config"] for fuzz_config in data.get("fuzz_targets", []) for campaign in fuzz_config.get("campaigns", []) ))) build_requests = [] for tree in data.get("trees", []): for config_name in unique_kernel_configs: build_request = { "arch": "amd64", # TODO: consider others as well. "tree_name": tree["name"], "tree_url": tree["URL"], "commit_hash": tree["branch"], "config_name": config_name } build_requests.append(build_request) print(json.dumps(build_requests)) - name: process-build-request inputs: parameters: - name: request-json steps: - - name: create-request-artifact template: request-to-artifact arguments: parameters: - name: data value: "{{inputs.parameters.request-json}}" - - name: run-build templateRef: name: build-step-template template: build-step arguments: parameters: - name: smoke-build value: "true" artifacts: - name: request from: "{{steps.create-request-artifact.outputs.artifacts.request}}" - name: request-to-artifact inputs: parameters: - name: data outputs: artifacts: - name: request path: /tmp/request.json script: image: alpine:latest command: [sh, -c] source: | printf '%s' '{{inputs.parameters.data}}' > /tmp/request.json