Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
3 changes: 0 additions & 3 deletions .github/actions/build-and-tag-locally/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,6 @@ runs:
linux/i386)
plaform_name="i386"
;;
linux/mips64le)
plaform_name="mips64le"
;;
linux/ppc64le)
plaform_name="ppc64le"
;;
Expand Down
5 changes: 0 additions & 5 deletions .github/workflows/pre-merge.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,18 +36,13 @@ jobs:
- linux/arm/v5
- linux/arm/v6
- linux/arm/v7
- linux/mips64le
- linux/ppc64le
- linux/s390x
- linux/arm64
- linux/riscv64
exclude:
- distribution: alpine
platform: linux/mips64le
- distribution: alpine
platform: linux/arm/v5
- distribution: debian
platform: linux/riscv64
- distribution: debian
platform: linux/arm/v6
steps:
Expand Down
2 changes: 1 addition & 1 deletion debian/Dockerfile

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

59 changes: 52 additions & 7 deletions release-automation/src/stackbrew_generator/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
import functools
import re
from enum import Enum
from typing import List, Optional
from typing import List, Optional, Tuple

from pydantic import BaseModel, Field, validator
from pydantic import BaseModel, Field


class DistroType(str, Enum):
Expand All @@ -15,6 +15,50 @@ class DistroType(str, Enum):
DEBIAN = "debian"


class DebianRelease:
"""Debian release names."""

TRIXIE = "trixie"
BOOKWORM = "bookworm"


DEBIAN_TRIXIE_ARCHITECTURES: Tuple[str, ...] = (
"amd64",
"arm32v5",
"arm32v7",
"arm64v8",
"i386",
"riscv64",
"ppc64le",
"s390x",
)
DEBIAN_BOOKWORM_ARCHITECTURES: Tuple[str, ...] = (
"amd64",
"arm32v5",
"arm32v7",
"arm64v8",
"i386",
"mips64le",
"ppc64le",
"s390x",
)
ALPINE_ARCHITECTURES: Tuple[str, ...] = (
"amd64",
"arm32v6",
"arm32v7",
"arm64v8",
"i386",
"ppc64le",
"riscv64",
"s390x",
)

DEBIAN_ARCHITECTURES: dict[str, Tuple[str, ...]] = {
DebianRelease.TRIXIE: DEBIAN_TRIXIE_ARCHITECTURES,
DebianRelease.BOOKWORM: DEBIAN_BOOKWORM_ARCHITECTURES,
}


@functools.total_ordering
class RedisVersion(BaseModel):
"""Represents a parsed Redis version.
Expand Down Expand Up @@ -213,14 +257,15 @@ class StackbrewEntry(BaseModel):

@property
def architectures(self) -> List[str]:
"""Get supported architectures based on distribution type."""
"""Get supported architectures based on distribution type and version."""
if self.distribution.type == DistroType.DEBIAN:
return ["amd64", "arm32v5", "arm32v7", "arm64v8", "i386", "mips64le", "ppc64le", "s390x"]
archs = DEBIAN_ARCHITECTURES.get(self.distribution.name, DEBIAN_TRIXIE_ARCHITECTURES)
return list(archs)
elif self.distribution.type == DistroType.ALPINE:
return ["amd64", "arm32v6", "arm32v7", "arm64v8", "i386", "ppc64le", "riscv64", "s390x"]
return list(ALPINE_ARCHITECTURES)
else:
# Fallback to debian architectures for unknown distributions
return ["amd64", "arm32v5", "arm32v7", "arm64v8", "i386", "mips64le", "ppc64le", "s390x"]
# Fallback to debian trixie architectures for unknown distributions
return list(DEBIAN_TRIXIE_ARCHITECTURES)

def __str__(self) -> str:
"""String representation in stackbrew format."""
Expand Down
45 changes: 36 additions & 9 deletions release-automation/tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,17 @@

import pytest

from stackbrew_generator.models import RedisVersion, Distribution, DistroType, Release, StackbrewEntry
from stackbrew_generator.models import (
ALPINE_ARCHITECTURES,
DEBIAN_BOOKWORM_ARCHITECTURES,
DEBIAN_TRIXIE_ARCHITECTURES,
DebianRelease,
Distribution,
DistroType,
RedisVersion,
Release,
StackbrewEntry,
)


class TestRedisVersion:
Expand Down Expand Up @@ -248,10 +258,27 @@ def test_release_string_representation(self):
class TestStackbrewEntry:
"""Tests for StackbrewEntry model."""

def test_debian_architectures(self):
"""Test that Debian distributions get the correct architectures."""
def test_debian_trixie_architectures(self):
"""Test that Debian trixie gets riscv64 architecture (no mips64le)."""
version = RedisVersion.parse("8.4.0")
distribution = Distribution(type=DistroType.DEBIAN, name=DebianRelease.TRIXIE)

entry = StackbrewEntry(
tags=["8.4.0", "latest"],
commit="abc123def456",
version=version,
distribution=distribution,
git_fetch_ref="refs/tags/v8.4.0",
)

assert entry.architectures == list(DEBIAN_TRIXIE_ARCHITECTURES)
assert "riscv64" in entry.architectures
assert "mips64le" not in entry.architectures

def test_debian_bookworm_architectures(self):
"""Test that Debian bookworm gets mips64le architecture (no riscv64)."""
version = RedisVersion.parse("8.2.1")
distribution = Distribution(type=DistroType.DEBIAN, name="bookworm")
distribution = Distribution(type=DistroType.DEBIAN, name=DebianRelease.BOOKWORM)

entry = StackbrewEntry(
tags=["8.2.1", "latest"],
Expand All @@ -261,8 +288,9 @@ def test_debian_architectures(self):
git_fetch_ref="refs/tags/v8.2.1"
)

expected_architectures = ["amd64", "arm32v5", "arm32v7", "arm64v8", "i386", "mips64le", "ppc64le", "s390x"]
assert entry.architectures == expected_architectures
assert entry.architectures == list(DEBIAN_BOOKWORM_ARCHITECTURES)
assert "mips64le" in entry.architectures
assert "riscv64" not in entry.architectures

def test_alpine_architectures(self):
"""Test that Alpine distributions get the correct architectures."""
Expand All @@ -277,8 +305,7 @@ def test_alpine_architectures(self):
git_fetch_ref="refs/tags/v8.2.1"
)

expected_architectures = ["amd64", "arm32v6", "arm32v7", "arm64v8", "i386", "ppc64le", "riscv64", "s390x"]
assert entry.architectures == expected_architectures
assert entry.architectures == list(ALPINE_ARCHITECTURES)

def test_stackbrew_entry_string_format(self):
"""Test that StackbrewEntry formats correctly with architectures."""
Expand All @@ -296,7 +323,7 @@ def test_stackbrew_entry_string_format(self):
output = str(entry)

# Check that it contains the expected Alpine architectures
assert "amd64, arm32v6, arm32v7, arm64v8, i386, ppc64le, riscv64, s390x" in output
assert ", ".join(ALPINE_ARCHITECTURES) in output
assert "Tags: 8.2.1-alpine, alpine" in output
assert "GitCommit: abc123def456" in output
assert "GitFetch: refs/tags/v8.2.1" in output
Expand Down
2 changes: 1 addition & 1 deletion release-automation/tests/test_update_stackbrew_file.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ def test_update_stackbrew_file_basic(self):
Directory: debian

Tags: 8.2.1-alpine, 8.2-alpine, 8-alpine, 8.2.1-alpine3.22, 8.2-alpine3.22, 8-alpine3.22, alpine, alpine3.22
Architectures: amd64, arm32v5, arm32v7, arm64v8, i386, mips64le, ppc64le, s390x
Architectures: amd64, arm32v5, arm32v7, arm64v8, i386, riscv64, ppc64le, s390x
GitCommit: old123commit
GitFetch: refs/tags/v8.2.1
Directory: alpine
Expand Down