Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
83 commits
Select commit Hold shift + click to select a range
2d8817d
[regression] Multiple bug fixes
mcopik Mar 17, 2026
7cbc681
[ci] Update test job
mcopik Mar 17, 2026
eb4d0e0
[ci] Update test job
mcopik Mar 17, 2026
2b19309
[ci] Enable CI job on feature branches
mcopik Mar 17, 2026
09a350c
[ci] Fix CI command
mcopik Mar 17, 2026
e9185a1
[ci] Fix CI command
mcopik Mar 17, 2026
5334168
[regression] Non-zero return from failed registration
mcopik Mar 17, 2026
1fac84b
[aws] Remove unnecessary pkg_resources from container
mcopik Mar 17, 2026
a0d82f2
[ci] Fixes
mcopik Mar 17, 2026
7454aac
[ci] Migrate from CircleCI to GH Actions
mcopik Apr 15, 2026
62a6f31
[ci] Fixes
mcopik Apr 15, 2026
6615792
[dev] Linting
mcopik Apr 15, 2026
6340049
[dev] Update install in GH Actions
mcopik Apr 16, 2026
bd8d6e1
[aws] Reenable regression of 411 for containers
mcopik Apr 16, 2026
96ace65
[ci] Remove the old Docker copy feature needed on CircleCI
mcopik Apr 16, 2026
eb4f3bc
[ci] Ensure benchmarks data is cloned
mcopik Apr 16, 2026
3ed8812
[aws][ci] Shorten function names
mcopik Apr 16, 2026
62f437c
[aws] Fix functio nanem splitting
mcopik Apr 16, 2026
745cdd7
[docker] Ensure that failed builds are not marked as success
mcopik Apr 16, 2026
478428e
[system] Add explicit printing of full build log
mcopik Apr 16, 2026
6ac1184
[docker] Print full output of pip install
mcopik Apr 16, 2026
2983b21
[docker] Support fallback to previous version of Docker image
mcopik Apr 16, 2026
a569837
[benchmarks] Fix 504 compatibility issues on Python 3.11 and older glibc
mcopik Apr 16, 2026
2fe6edf
[aws] Debugging for regression runs
mcopik Apr 16, 2026
11c96a3
[benchmarks] Ensure that we always put correct path to 311 benchmark
mcopik Apr 16, 2026
3fa215d
[system] Bump current version
mcopik Apr 16, 2026
483b016
[ci] Simplify resource naming
mcopik Apr 16, 2026
fdd7639
[ci] Add Nodejs builds
mcopik Apr 16, 2026
75d5fee
[ci] Update badges
mcopik Apr 16, 2026
f0948f0
[ci] Cleanup functions once we are done
mcopik Apr 16, 2026
dbbf677
[ci] Enable GCP and Azure
mcopik Apr 16, 2026
9d8b39a
[system] Update default architecture
mcopik Apr 16, 2026
9339236
[ci] Add arm64 runs
mcopik Apr 16, 2026
4b1a07e
[ci] Try to fix GCP credentials
mcopik Apr 16, 2026
ffee6d4
[ci] Fix
mcopik Apr 16, 2026
ef681b0
[ci] Bump GCP node version
mcopik Apr 16, 2026
b9ff872
[ci] Use ARM runners
mcopik Apr 16, 2026
1214044
[ci] Fix typo in Azure creds
mcopik Apr 16, 2026
307e6aa
[system] Support building multi-platform images
mcopik Apr 16, 2026
921f5b6
[docs] Update docs on container images
mcopik Apr 16, 2026
106ece6
[gcp] Tolerate 503 errors
mcopik Apr 16, 2026
c6f5101
[gcp] Add public access to all functions
mcopik Apr 16, 2026
5a1f9fa
[ci] Extend timeout to handle Azure
mcopik Apr 16, 2026
7a8bfb9
[azure] Ensure that regression always logs in
mcopik Apr 16, 2026
b4a34b5
[docs] Update config paths
mcopik Apr 16, 2026
55adc37
[aws] Extend build image to arm64 compatibility
mcopik Apr 16, 2026
5e3400a
[system] Proper build of multi-platform images
mcopik Apr 16, 2026
54bc65a
[aws] Update Node.js build image for arm
mcopik Apr 16, 2026
31a775d
[aws] Properly cleanup function resources
mcopik Apr 17, 2026
7bb7e4a
[gcp] Delete functions
mcopik Apr 17, 2026
3567ac5
[aws] Proper cleaning of function URLs
mcopik Apr 17, 2026
379942f
[azure] Add function deletion option
mcopik Apr 17, 2026
f56f858
[ci] More langues
mcopik Apr 17, 2026
2f6c67e
[aws] Update Java build image for arm64
mcopik Apr 17, 2026
7c4418b
[system] Add language variants for Java and Cpp
mcopik Apr 17, 2026
01529c0
[cpp][aws] Support fallback to dependency images from previous release
mcopik Apr 17, 2026
8cf2d2c
[aws] Build multi-platform images for Java
mcopik Apr 17, 2026
fca1c94
[aws] Fix multi-platform images for Java
mcopik Apr 17, 2026
436a91a
[cpp] Fall back to previous release image for container builds
mcopik Apr 17, 2026
4f00689
[cpp] More fall back
mcopik Apr 17, 2026
711bc4a
[azure] Add the check for existing storage accounts
mcopik Apr 17, 2026
094d4e2
[ci] Try to correctly clean up functions
mcopik Apr 17, 2026
643f5c0
[ci] Dump all the caches - we should retrieve cloud resources on ever…
mcopik Apr 17, 2026
9e4518b
[azure] Additional exception handling for malformed CLI output
mcopik Apr 17, 2026
dc51bbd
[dev] Linting
mcopik Apr 17, 2026
f841cc0
[aws] Additional handling for partially broken cold starts.
mcopik Apr 17, 2026
fb61c87
[azure] Extra debugging
mcopik Apr 17, 2026
9d18d6b
[gcp] First attempt to introduce back-off for all GCP ops
mcopik Apr 17, 2026
c4f1a74
[aws] Fix wrong parameter
mcopik Apr 17, 2026
6b5804c
[dev] Linting
mcopik Apr 17, 2026
75cb235
[gcp] Additional checks for propagation of triggers
mcopik Apr 17, 2026
5a7d2ce
[azure] retries for azure publish
mcopik Apr 17, 2026
e9e7d1c
[azure] retries for azure publish
mcopik Apr 17, 2026
04cbaef
[gcp] Additional checks for propagation of triggers
mcopik Apr 17, 2026
8c51f3a
Merge branch 'feature/circle-ci-jobs' of github.com:spcl/serverless-b…
mcopik Apr 17, 2026
088d09d
[gcp] Disable the extra GCP check
mcopik Apr 17, 2026
7ea3d9b
[azure] Simplify error messages
mcopik Apr 17, 2026
1f2a911
[ci] Remove URLs and resource IDs from the output
mcopik Apr 19, 2026
3f5f62d
[ci] Keep functions around
mcopik Apr 19, 2026
2bbee45
[benchmarks] Remove unnecessary changes
mcopik Apr 19, 2026
13ccb64
[azure] Move debug output to full debug
mcopik Apr 19, 2026
dbd0a3c
[ci] Redact output
mcopik Apr 19, 2026
0fe150b
[regression] Fix output redaction for GCP
mcopik Apr 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 0 additions & 88 deletions .circleci/config.yml

This file was deleted.

126 changes: 126 additions & 0 deletions .github/workflows/_regression-job.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
name: Regression Job (Reusable)

on:
workflow_call:
inputs:
platform:
required: true
type: string
language:
required: true
type: string
version:
required: true
type: string

jobs:
test:
runs-on: ubuntu-latest

env:
RESOURCE_PREFIX: sebs-ci

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Restore SeBS cache
uses: actions/cache/restore@v4
with:
path: regression-cache/
key: sebs-cache-${{ github.ref_name }}-${{ inputs.platform }}-${{ inputs.language }}-${{ inputs.version }}
restore-keys: |
sebs-cache-${{ github.ref_name }}-

- name: Setup GCP credentials
if: inputs.platform == 'gcp'
run: |
echo "${{ secrets.GCP_SERVICE_ACCOUNT_JSON }}" > /tmp/gcp-credentials.json
echo "GOOGLE_APPLICATION_CREDENTIALS=/tmp/gcp-credentials.json" >> $GITHUB_ENV

- name: Setup Azure credentials
if: inputs.platform == 'azure'
run: |
echo "AZURE_SUBSCRIPTION_ID=${{ secrets.AZURE_SUBSCRIPTION_ID }}" >> $GITHUB_ENV
echo "AZURE_TENANT_ID=${{ secrets.AZURE_TENANT_ID }}" >> $GITHUB_ENV
echo "AZURE_CLIENT_ID=${{ secrets.AZURE_CLIENT_ID }}" >> $GITHUB_ENV
echo "AZURE_CLIENT_SECRET=${{ secrets.AZURE_CLIENT_SECRET }}" >> $GITHUB_ENV

- name: Setup AWS credentials
if: inputs.platform == 'aws'
run: |
echo "AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }}" >> $GITHUB_ENV
echo "AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }}" >> $GITHUB_ENV
echo "AWS_DEFAULT_REGION=${{ secrets.AWS_DEFAULT_REGION || 'us-east-1' }}" >> $GITHUB_ENV

- name: Install uv
uses: astral-sh/setup-uv@v4

- name: Install SeBS
run: uv pip install .

- name: Run regression tests
timeout-minutes: 5
run: |
sebs benchmark regression test \
--config configs/example.json \
--deployment ${{ inputs.platform }} \
--language ${{ inputs.language }} \
--language-version ${{ inputs.version }} \
--architecture x64 --selected-architecture \
--resource-prefix sebs-ci

- name: Generate test summary
if: always()
run: |
echo "Regression Test Summary" > test-summary.txt
echo "======================" >> test-summary.txt
echo "Platform: ${{ inputs.platform }}" >> test-summary.txt
echo "Language: ${{ inputs.language }}" >> test-summary.txt
echo "Version: ${{ inputs.version }}" >> test-summary.txt
echo "" >> test-summary.txt
if ls regression_*.json 1> /dev/null 2>&1; then
ls -1 regression_*.json | wc -l | xargs echo "Benchmarks tested:" >> test-summary.txt
echo "" >> test-summary.txt
echo "Results saved to artifacts/results/" >> test-summary.txt
else
echo "No benchmark results found" >> test-summary.txt
fi

- name: Upload test summary
if: always()
uses: actions/upload-artifact@v4
with:
name: test-summary-${{ inputs.platform }}-${{ inputs.language }}-${{ inputs.version }}
path: test-summary.txt

- name: Collect and upload regression results
if: always()
run: |
mkdir -p results
if ls regression_*.json 1> /dev/null 2>&1; then
mv regression_*.json results/ || true
fi

- name: Upload regression results
if: always()
uses: actions/upload-artifact@v4
with:
name: results-${{ inputs.platform }}-${{ inputs.language }}-${{ inputs.version }}
path: results/
if-no-files-found: ignore

- name: Upload cache snapshot
if: always()
uses: actions/upload-artifact@v4
with:
name: cache-snapshot-${{ inputs.platform }}-${{ inputs.language }}-${{ inputs.version }}
path: cache/
if-no-files-found: ignore
Comment thread
coderabbitai[bot] marked this conversation as resolved.

- name: Save SeBS cache
if: success()
uses: actions/cache/save@v4
with:
path: regression-cache/
key: sebs-cache-${{ github.ref_name }}-${{ inputs.platform }}-${{ inputs.language }}-${{ inputs.version }}
55 changes: 55 additions & 0 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: Lint

on:
push:
pull_request:
workflow_dispatch:

jobs:
linting:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up Python 3.10
uses: actions/setup-python@v5
with:
python-version: '3.10'

- name: Install uv
uses: astral-sh/setup-uv@v4

- name: Install system dependencies
run: sudo apt update && sudo apt install -y libcurl4-openssl-dev

- name: Cache uv dependencies
uses: actions/cache@v4
with:
path: ~/.cache/uv
key: uv-${{ runner.os }}-${{ hashFiles('requirements.txt', 'pyproject.toml') }}
restore-keys: |
uv-${{ runner.os }}-

- name: Install SeBS with dev dependencies
run: uv sync --extra dev

- name: Python code formatting with black
run: uv run black sebs --check --config .black.toml

- name: Python code lint with flake8
run: uv run flake8 sebs --config=.flake8.cfg --tee --output-file flake-reports

- name: Python static code verification with mypy
run: uv run mypy sebs --config-file=.mypy.ini

- name: Check for Python documentation coverage
run: uv run interrogate -v --fail-under 100 sebs

- name: Upload flake8 reports
if: always()
uses: actions/upload-artifact@v4
with:
name: flake-reports
path: flake-reports
25 changes: 25 additions & 0 deletions .github/workflows/regression.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: Regression Tests

on:
push:
branches:
- master
- 'feature/**'
workflow_dispatch:

jobs:
regression:
strategy:
matrix:
include:
- platform: aws
language: python
version: "3.11"
fail-fast: false

uses: ./.github/workflows/_regression-job.yml
with:
platform: ${{ matrix.platform }}
language: ${{ matrix.language }}
version: ${{ matrix.version }}
secrets: inherit
5 changes: 0 additions & 5 deletions benchmarks/wrappers/aws/python/setup.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,9 @@
# Copyright 2020-2025 ETH Zurich and the SeBS authors. All rights reserved.
from distutils.core import setup
from glob import glob
from pkg_resources import parse_requirements

with open('requirements.txt') as f:
requirements = [str(r) for r in parse_requirements(f)]

setup(
name='function',
install_requires=requirements,
packages=['function'],
package_dir={'function': '.'},
package_data={'function': glob('**', recursive=True)},
Expand Down
33 changes: 22 additions & 11 deletions sebs/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import logging
import functools
import os
import sys
import traceback
from typing import cast, List, Optional

Expand Down Expand Up @@ -455,33 +456,43 @@ def package(
multiple=True,
help="JSON configuration of deployed storage.",
)
@common_params
@click.option(
"--cache",
default=os.path.join(os.path.curdir, "regression-cache"),
help="Location of experiments cache.",
)
@click.option(
"--output-dir",
default=os.path.join(os.path.curdir, "regression-output"),
help="Output directory for results.",
"--selected-architecture/--all-architectures",
type=bool,
default=False,
help="Skip non-selected CPU architectures.",
)
def regression(benchmark_input_size, benchmark_name, storage_configuration, **kwargs):
@common_params
def regression(
benchmark_input_size, benchmark_name, storage_configuration, selected_architecture, **kwargs
):
"""Run regression test suite across benchmarks."""

# for regression, deployment client is initialized locally
# disable default initialization

from pathlib import Path

if Path(kwargs["cache"]) == Path("cache"):
kwargs["cache"] = os.path.join(os.path.curdir, "regression-cache")

(config, output_dir, logging_filename, sebs_client, _) = parse_common_params(
initialize_deployment=False,
storage_configuration=storage_configuration,
**kwargs,
)
regression_suite(
architecture = config["experiments"]["architecture"] if selected_architecture else None
Comment on lines 490 to +495
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Guard the architecture lookup before filtering.

parse_common_params() is still holding the raw JSON dict, so the default from sebs/experiments/config.py:39-50 is not guaranteed to exist here. On Line 483, --selected-architecture will raise KeyError whenever the config file omits experiments.architecture. Fall back to "x64" or derive the value from sebs_client.get_experiment_config(...) before calling regression_suite().

Suggested fix
-    architecture = config["experiments"]["architecture"] if selected_architecture else None
+    architecture = None
+    if selected_architecture:
+        architecture = config.get("experiments", {}).get("architecture") or "x64"
🧰 Tools
🪛 Ruff (0.15.6)

[warning] 478-478: Unpacked variable output_dir is never used

Prefix it with an underscore or any other dummy variable pattern

(RUF059)


[warning] 478-478: Unpacked variable logging_filename is never used

Prefix it with an underscore or any other dummy variable pattern

(RUF059)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@sebs/cli.py` around lines 478 - 483, The code currently reads
config["experiments"]["architecture"] into architecture which raises KeyError
when experiments or architecture is missing; change the lookup in the block
after parse_common_params to guard the access by using config.get("experiments",
{}).get("architecture") and fall back to "x64" (or, if sebs_client is available
and selected_architecture is false, call sebs_client.get_experiment_config(...)
to derive the architecture) before passing architecture into regression_suite();
ensure you reference parse_common_params, the local variable architecture,
selected_architecture, sebs_client.get_experiment_config, and regression_suite
when making the change.

has_failures = regression_suite(
sebs_client,
config["experiments"],
set((config["deployment"]["name"],)),
config,
kwargs["resource_prefix"],
Comment thread
coderabbitai[bot] marked this conversation as resolved.
benchmark_name,
architecture,
)
# Exit with non-zero code if any tests failed
sys.exit(1 if has_failures else 0)


@cli.group()
Expand Down
Loading
Loading