Skip to content

Commit bf365ea

Browse files
committed
Snap release, move around the code and some refactoring
1 parent 4709783 commit bf365ea

File tree

8 files changed

+872
-357
lines changed

8 files changed

+872
-357
lines changed

config.yaml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,14 @@ packages:
5252
publish_workflow: release_publish.yml
5353
publish_timeout_minutes: 10
5454
publish_inputs: {}
55+
snap:
56+
package_type: snap
57+
repo: redislabsdev/redis-snap
58+
# homebrew has one fixed release branch: main
59+
ref: main
60+
build_workflow: release_build_and_test.yml
61+
build_inputs: {}
62+
publish_internal_release: yes
63+
publish_workflow: release_publish.yml
64+
publish_timeout_minutes: 10
65+
publish_inputs: {}

src/redis_release/bht/behaviours.py

Lines changed: 2 additions & 294 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,9 @@
2626
from redis_release.bht.state import reset_model_to_defaults
2727

2828
from ..github_client_async import GitHubClientAsync
29-
from ..models import (
30-
HomebrewChannel,
31-
PackageType,
32-
RedisVersion,
33-
ReleaseType,
34-
WorkflowConclusion,
35-
WorkflowStatus,
36-
)
29+
from ..models import RedisVersion, ReleaseType, WorkflowConclusion, WorkflowStatus
3730
from .logging_wrapper import PyTreesLoggerWrapper
38-
from .state import HomebrewMeta, Package, PackageMeta, ReleaseMeta, Workflow
31+
from .state import Package, PackageMeta, ReleaseMeta, Workflow
3932

4033
logger = logging.getLogger(__name__)
4134

@@ -721,273 +714,6 @@ def update(self) -> Status:
721714
return Status.SUCCESS
722715

723716

724-
class DockerWorkflowInputs(ReleaseAction):
725-
"""
726-
Docker uses only release_tag input which is set automatically in TriggerWorkflow
727-
"""
728-
729-
def __init__(
730-
self,
731-
name: str,
732-
workflow: Workflow,
733-
package_meta: PackageMeta,
734-
release_meta: ReleaseMeta,
735-
log_prefix: str = "",
736-
) -> None:
737-
self.workflow = workflow
738-
self.package_meta = package_meta
739-
self.release_meta = release_meta
740-
super().__init__(name=name, log_prefix=log_prefix)
741-
742-
def update(self) -> Status:
743-
return Status.SUCCESS
744-
745-
746-
class HomewbrewWorkflowInputs(ReleaseAction):
747-
def __init__(
748-
self,
749-
name: str,
750-
workflow: Workflow,
751-
package_meta: HomebrewMeta,
752-
release_meta: ReleaseMeta,
753-
log_prefix: str = "",
754-
) -> None:
755-
self.workflow = workflow
756-
self.package_meta = package_meta
757-
self.release_meta = release_meta
758-
super().__init__(name=f"{name} - homebrew", log_prefix=log_prefix)
759-
760-
def update(self) -> Status:
761-
if self.package_meta.release_type is not None:
762-
self.workflow.inputs["release_type"] = self.package_meta.release_type.value
763-
if self.release_meta.tag is not None:
764-
self.workflow.inputs["release_tag"] = self.release_meta.tag
765-
if self.package_meta.homebrew_channel is not None:
766-
self.workflow.inputs["channel"] = self.package_meta.homebrew_channel.value
767-
return Status.SUCCESS
768-
769-
770-
class DetectHombrewReleaseAndChannel(ReleaseAction):
771-
def __init__(
772-
self,
773-
name: str,
774-
package_meta: HomebrewMeta,
775-
release_meta: ReleaseMeta,
776-
log_prefix: str = "",
777-
) -> None:
778-
self.package_meta = package_meta
779-
self.release_meta = release_meta
780-
self.release_version: Optional[RedisVersion] = None
781-
super().__init__(name=name, log_prefix=log_prefix)
782-
783-
def initialise(self) -> None:
784-
if self.release_meta.tag is None:
785-
self.logger.error("Release tag is not set")
786-
return
787-
if self.release_version is not None:
788-
return
789-
790-
self.feedback_message = ""
791-
try:
792-
self.release_version = RedisVersion.parse(self.release_meta.tag)
793-
except ValueError as e:
794-
self.logger.error(f"Failed to parse release tag: {e}")
795-
return
796-
797-
def update(self) -> Status:
798-
if self.release_meta.tag is None:
799-
logger.error("Release tag is not set")
800-
return Status.FAILURE
801-
802-
if (
803-
self.package_meta.homebrew_channel is not None
804-
and self.package_meta.release_type is not None
805-
):
806-
pass
807-
else:
808-
assert self.release_version is not None
809-
if self.package_meta.release_type is None:
810-
if self.release_version.is_internal:
811-
self.package_meta.release_type = ReleaseType.INTERNAL
812-
else:
813-
if self.release_version.is_ga:
814-
self.package_meta.release_type = ReleaseType.PUBLIC
815-
elif self.release_version.is_rc:
816-
self.package_meta.release_type = ReleaseType.PUBLIC
817-
else:
818-
self.package_meta.release_type = ReleaseType.INTERNAL
819-
820-
if self.package_meta.homebrew_channel is None:
821-
if self.release_version.is_ga:
822-
self.package_meta.homebrew_channel = HomebrewChannel.STABLE
823-
else:
824-
# RC, internal, or any other version goes to RC channel
825-
self.package_meta.homebrew_channel = HomebrewChannel.RC
826-
self.feedback_message = f"release_type: {self.package_meta.release_type.value}, homebrew_channel: {self.package_meta.homebrew_channel.value}"
827-
828-
if self.log_once(
829-
"homebrew_channel_detected", self.package_meta.ephemeral.log_once_flags
830-
):
831-
self.logger.info(
832-
f"Hombrew release_type: {self.package_meta.release_type}, homebrew_channel: {self.package_meta.homebrew_channel}"
833-
)
834-
835-
return Status.SUCCESS
836-
837-
838-
class ClassifyHomebrewVersion(ReleaseAction):
839-
"""Classify Homebrew version by downloading and parsing the cask file.
840-
841-
This behavior downloads the appropriate Homebrew cask file (redis.rb or redis-rc.rb)
842-
based on the homebrew_channel, extracts the version, and compares it with the
843-
release tag version to determine if the version is acceptable.
844-
"""
845-
846-
def __init__(
847-
self,
848-
name: str,
849-
package_meta: HomebrewMeta,
850-
release_meta: ReleaseMeta,
851-
github_client: GitHubClientAsync,
852-
log_prefix: str = "",
853-
) -> None:
854-
self.package_meta = package_meta
855-
self.release_meta = release_meta
856-
self.github_client = github_client
857-
self.task: Optional[asyncio.Task] = None
858-
self.release_version: Optional[RedisVersion] = None
859-
self.cask_version: Optional[RedisVersion] = None
860-
super().__init__(name=name, log_prefix=log_prefix)
861-
862-
def initialise(self) -> None:
863-
"""Initialize by validating inputs and starting download task."""
864-
if self.package_meta.ephemeral.is_version_acceptable is not None:
865-
return
866-
867-
self.feedback_message = ""
868-
# Validate homebrew_channel is set
869-
if self.package_meta.homebrew_channel is None:
870-
self.logger.error("Homebrew channel is not set")
871-
return
872-
873-
# Validate repo and ref are set
874-
if not self.package_meta.repo:
875-
self.logger.error("Package repository is not set")
876-
return
877-
878-
if not self.package_meta.ref:
879-
self.logger.error("Package ref is not set")
880-
return
881-
882-
# Parse release version from tag
883-
if self.release_meta.tag is None:
884-
self.logger.error("Release tag is not set")
885-
return
886-
887-
if self.package_meta.release_type is None:
888-
self.logger.error("Package release type is not set")
889-
return
890-
891-
try:
892-
self.release_version = RedisVersion.parse(self.release_meta.tag)
893-
self.logger.debug(f"Parsed release version: {self.release_version}")
894-
except ValueError as e:
895-
self.logger.error(f"Failed to parse release tag: {e}")
896-
return
897-
898-
# Determine which cask file to download based on channel
899-
if self.package_meta.homebrew_channel == HomebrewChannel.STABLE:
900-
cask_file = "Casks/redis.rb"
901-
elif self.package_meta.homebrew_channel == HomebrewChannel.RC:
902-
cask_file = "Casks/redis-rc.rb"
903-
else:
904-
self.logger.error(
905-
f"Unknown homebrew channel: {self.package_meta.homebrew_channel}"
906-
)
907-
return
908-
909-
self.logger.debug(
910-
f"Downloading cask file: {cask_file} from {self.package_meta.repo}@{self.package_meta.ref}"
911-
)
912-
913-
# Start async task to download the cask file from package repo and ref
914-
self.task = asyncio.create_task(
915-
self.github_client.download_file(
916-
self.package_meta.repo, cask_file, self.package_meta.ref
917-
)
918-
)
919-
920-
def update(self) -> Status:
921-
"""Process downloaded cask file and classify version."""
922-
if self.package_meta.ephemeral.is_version_acceptable is not None:
923-
return Status.SUCCESS
924-
925-
try:
926-
assert self.task is not None
927-
928-
# Wait for download to complete
929-
if not self.task.done():
930-
return Status.RUNNING
931-
932-
# Get the downloaded content
933-
cask_content = self.task.result()
934-
if cask_content is None:
935-
self.logger.error("Failed to download cask file")
936-
return Status.FAILURE
937-
938-
# Parse version from cask file
939-
# Look for: version "X.Y.Z"
940-
version_match = re.search(
941-
r'^\s*version\s+"([^"]+)"', cask_content, re.MULTILINE
942-
)
943-
if not version_match:
944-
self.logger.error("Could not find version declaration in cask file")
945-
return Status.FAILURE
946-
947-
version_str = version_match.group(1)
948-
self.logger.debug(f"Found version in cask file: {version_str}")
949-
950-
# Parse the cask version
951-
try:
952-
self.cask_version = RedisVersion.parse(version_str)
953-
self.logger.info(
954-
f"Cask version: {self.cask_version}, Release version: {self.release_version}"
955-
)
956-
except ValueError as e:
957-
self.logger.error(f"Failed to parse cask version '{version_str}': {e}")
958-
return Status.FAILURE
959-
960-
# Compare versions: cask version >= release version means acceptable
961-
assert self.release_version is not None
962-
self.package_meta.remote_version = str(self.cask_version)
963-
log_prepend = ""
964-
prepend_color = "green"
965-
if self.release_version >= self.cask_version:
966-
self.package_meta.ephemeral.is_version_acceptable = True
967-
self.feedback_message = (
968-
f"release {self.release_version} >= cask {self.cask_version}"
969-
)
970-
log_prepend = "Version acceptable: "
971-
else:
972-
self.package_meta.ephemeral.is_version_acceptable = False
973-
log_prepend = "Version NOT acceptable: "
974-
prepend_color = "yellow"
975-
self.feedback_message = (
976-
f"release {self.release_version} < cask {self.cask_version}"
977-
)
978-
if self.log_once(
979-
"homebrew_version_classified",
980-
self.package_meta.ephemeral.log_once_flags,
981-
):
982-
self.logger.info(
983-
f"[{prepend_color}]{log_prepend}{self.feedback_message}[/]"
984-
)
985-
return Status.SUCCESS
986-
987-
except Exception as e:
988-
return self.log_exception_and_return_failure(e)
989-
990-
991717
### Conditions ###
992718

993719

@@ -1181,21 +907,3 @@ def update(self) -> Status:
1181907
if self.package_meta.ephemeral.force_rebuild:
1182908
return Status.SUCCESS
1183909
return Status.FAILURE
1184-
1185-
1186-
class NeedToReleaseHomebrew(LoggingAction):
1187-
def __init__(
1188-
self,
1189-
name: str,
1190-
package_meta: HomebrewMeta,
1191-
release_meta: ReleaseMeta,
1192-
log_prefix: str = "",
1193-
) -> None:
1194-
self.package_meta = package_meta
1195-
self.release_meta = release_meta
1196-
super().__init__(name=name, log_prefix=log_prefix)
1197-
1198-
def update(self) -> Status:
1199-
if self.package_meta.ephemeral.is_version_acceptable is True:
1200-
return Status.SUCCESS
1201-
return Status.FAILURE
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from py_trees.common import Status
2+
3+
from redis_release.bht.behaviours import ReleaseAction
4+
from redis_release.bht.state import PackageMeta, ReleaseMeta, Workflow
5+
6+
7+
class DockerWorkflowInputs(ReleaseAction):
8+
"""
9+
Docker uses only release_tag input which is set automatically in TriggerWorkflow
10+
"""
11+
12+
def __init__(
13+
self,
14+
name: str,
15+
workflow: Workflow,
16+
package_meta: PackageMeta,
17+
release_meta: ReleaseMeta,
18+
log_prefix: str = "",
19+
) -> None:
20+
self.workflow = workflow
21+
self.package_meta = package_meta
22+
self.release_meta = release_meta
23+
super().__init__(name=name, log_prefix=log_prefix)
24+
25+
def update(self) -> Status:
26+
return Status.SUCCESS

0 commit comments

Comments
 (0)