Skip to content

Commit 4f32c6a

Browse files
committed
Package specific DetectReleaseType and NeedToRelease
1 parent cc85d23 commit 4f32c6a

14 files changed

+438
-79
lines changed

src/redis_release/bht/behaviours.py

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -864,54 +864,6 @@ def update(self) -> Status:
864864
return Status.SUCCESS
865865

866866

867-
class DetectReleaseType(LoggingAction):
868-
def __init__(
869-
self,
870-
name: str,
871-
package_meta: PackageMeta,
872-
release_meta: ReleaseMeta,
873-
log_prefix: str = "",
874-
) -> None:
875-
self.release_meta = release_meta
876-
self.package_meta = package_meta
877-
self.release_version: Optional[RedisVersion] = None
878-
super().__init__(name=name, log_prefix=log_prefix)
879-
880-
def initialise(self) -> None:
881-
if self.package_meta.release_type is not None:
882-
return
883-
if self.release_meta.tag is None:
884-
self.logger.error("Release tag is not set")
885-
return
886-
self.release_version = RedisVersion.parse(self.release_meta.tag)
887-
888-
def update(self) -> Status:
889-
result: Status = Status.FAILURE
890-
891-
if self.package_meta.release_type is not None:
892-
result = Status.SUCCESS
893-
self.feedback_message = f"Release type: {self.package_meta.release_type}"
894-
elif self.release_version is not None:
895-
if self.release_version.is_internal:
896-
self.package_meta.release_type = ReleaseType.INTERNAL
897-
else:
898-
self.package_meta.release_type = ReleaseType.PUBLIC
899-
result = Status.SUCCESS
900-
self.feedback_message = f"Release type: {self.package_meta.release_type}"
901-
else:
902-
self.feedback_message = "Failed to detect release type"
903-
result = Status.FAILURE
904-
905-
if self.log_once(
906-
"release_type_detected", self.release_meta.ephemeral.log_once_flags
907-
):
908-
if result == Status.SUCCESS:
909-
self.logger.info(f"[green]{self.feedback_message}[/green]")
910-
else:
911-
self.logger.error(f"[red]{self.feedback_message}[/red]")
912-
return result
913-
914-
915867
class IsForceRebuild(LoggingAction):
916868
def __init__(
917869
self, name: str, package_meta: PackageMeta, log_prefix: str = ""

src/redis_release/bht/behaviours_debian.py

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,66 @@
44

55
from redis_release.bht.behaviours import LoggingAction
66
from redis_release.bht.state import PackageMeta, ReleaseMeta
7-
from redis_release.models import RedisVersion
7+
from redis_release.models import RedisVersion, ReleaseType
88

99
# Conditions
1010

1111

12+
class DetectReleaseTypeDebian(LoggingAction):
13+
"""Detect release type for Debian packages based on version."""
14+
15+
def __init__(
16+
self,
17+
name: str,
18+
package_meta: PackageMeta,
19+
release_meta: ReleaseMeta,
20+
log_prefix: str = "",
21+
) -> None:
22+
self.release_meta = release_meta
23+
self.package_meta = package_meta
24+
self.release_version: Optional[RedisVersion] = None
25+
super().__init__(name=name, log_prefix=log_prefix)
26+
27+
def initialise(self) -> None:
28+
if self.package_meta.release_type is not None:
29+
return
30+
if self.release_meta.tag is None:
31+
self.logger.error("Release tag is not set")
32+
return
33+
if self.release_meta.tag == "unstable":
34+
return
35+
self.release_version = RedisVersion.parse(self.release_meta.tag)
36+
37+
def update(self) -> Status:
38+
result: Status = Status.FAILURE
39+
40+
if self.package_meta.release_type is not None:
41+
result = Status.SUCCESS
42+
self.feedback_message = f"Release type for debian (from state): {self.package_meta.release_type}"
43+
elif self.release_version is not None:
44+
# Debian only publishes GA versions
45+
if self.release_version.is_ga:
46+
self.package_meta.release_type = ReleaseType.PUBLIC
47+
else:
48+
self.package_meta.release_type = ReleaseType.INTERNAL
49+
result = Status.SUCCESS
50+
self.feedback_message = (
51+
f"Detected release type for debian: {self.package_meta.release_type}"
52+
)
53+
else:
54+
self.feedback_message = "Failed to detect release type"
55+
result = Status.FAILURE
56+
57+
if self.log_once(
58+
"release_type_detected", self.package_meta.ephemeral.log_once_flags
59+
):
60+
if result == Status.SUCCESS:
61+
self.logger.info(f"[green]{self.feedback_message}[/green]")
62+
else:
63+
self.logger.error(f"[red]{self.feedback_message}[/red]")
64+
return result
65+
66+
1267
class NeedToReleaseDebian(LoggingAction):
1368
"""Check if Debian package needs to be released."""
1469

@@ -47,11 +102,11 @@ def update(self) -> Status:
47102
self.feedback_message = "Release tag is not set"
48103
result = Status.FAILURE
49104
if self.release_meta.tag == "unstable":
50-
self.feedback_message = "Skip unstable release for debian"
105+
self.feedback_message = "No, skip unstable release for debian"
51106
result = Status.FAILURE
52107

53108
if self.release_version is not None:
54-
self.feedback_message = "Need to release debian"
109+
self.feedback_message = "Yes, need to release debian"
55110
result = Status.SUCCESS
56111

57112
if self.log_once("need_to_release", self.package_meta.ephemeral.log_once_flags):

src/redis_release/bht/behaviours_docker.py

Lines changed: 100 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
from typing import Optional
2+
13
from py_trees.common import Status
24

35
from redis_release.bht.behaviours import LoggingAction, ReleaseAction
46
from redis_release.bht.state import PackageMeta, ReleaseMeta, Workflow
7+
from redis_release.models import RedisVersion, ReleaseType
58

69

710
class DockerWorkflowInputs(ReleaseAction):
@@ -29,6 +32,60 @@ def update(self) -> Status:
2932
# Conditions
3033

3134

35+
class DetectReleaseTypeDocker(LoggingAction):
36+
"""Detect release type for Docker packages based on version."""
37+
38+
def __init__(
39+
self,
40+
name: str,
41+
package_meta: PackageMeta,
42+
release_meta: ReleaseMeta,
43+
log_prefix: str = "",
44+
) -> None:
45+
self.release_meta = release_meta
46+
self.package_meta = package_meta
47+
self.release_version: Optional[RedisVersion] = None
48+
super().__init__(name=name, log_prefix=log_prefix)
49+
50+
def initialise(self) -> None:
51+
if self.package_meta.release_type is not None:
52+
return
53+
if self.release_meta.tag is None:
54+
self.logger.error("Release tag is not set")
55+
return
56+
if self.release_meta.tag == "unstable":
57+
return
58+
self.release_version = RedisVersion.parse(self.release_meta.tag)
59+
60+
def update(self) -> Status:
61+
result: Status = Status.FAILURE
62+
63+
if self.package_meta.release_type is not None:
64+
result = Status.SUCCESS
65+
self.feedback_message = f"Release type for docker (from state): {self.package_meta.release_type}"
66+
elif self.release_version is not None:
67+
if self.release_version.is_internal:
68+
self.package_meta.release_type = ReleaseType.INTERNAL
69+
else:
70+
self.package_meta.release_type = ReleaseType.PUBLIC
71+
result = Status.SUCCESS
72+
self.feedback_message = (
73+
f"Detected release type for docker: {self.package_meta.release_type}"
74+
)
75+
else:
76+
self.feedback_message = "Failed to detect release type"
77+
result = Status.FAILURE
78+
79+
if self.log_once(
80+
"release_type_detected", self.package_meta.ephemeral.log_once_flags
81+
):
82+
if result == Status.SUCCESS:
83+
self.logger.info(f"[green]{self.feedback_message}[/green]")
84+
else:
85+
self.logger.error(f"[red]{self.feedback_message}[/red]")
86+
return result
87+
88+
3289
class NeedToReleaseDocker(LoggingAction):
3390
"""Check if Docker package needs to be released."""
3491

@@ -41,8 +98,49 @@ def __init__(
4198
) -> None:
4299
self.package_meta = package_meta
43100
self.release_meta = release_meta
101+
self.release_version: Optional[RedisVersion] = None
102+
44103
super().__init__(name=name, log_prefix=log_prefix)
45104

105+
def initialise(self) -> None:
106+
if self.release_meta.tag is None:
107+
self.logger.error("Release tag is not set")
108+
return
109+
if self.release_version is not None:
110+
return
111+
112+
if self.release_meta.tag == "unstable":
113+
return
114+
try:
115+
self.release_version = RedisVersion.parse(self.release_meta.tag)
116+
except ValueError as e:
117+
self.logger.error(f"Failed to parse release tag: {e}")
118+
return
119+
pass
120+
46121
def update(self) -> Status:
47-
# Docker packages are always released
48-
return Status.SUCCESS
122+
result: Status = Status.FAILURE
123+
if self.release_meta.tag is None:
124+
self.feedback_message = "Release tag is not set"
125+
result = Status.FAILURE
126+
if self.release_meta.tag == "unstable":
127+
self.feedback_message = "Skip unstable release for docker"
128+
result = Status.FAILURE
129+
130+
if self.release_version is not None:
131+
if self.release_version.major < 8:
132+
self.feedback_message = (
133+
f"Skip release for docker {str(self.release_version)} < 8.0"
134+
)
135+
result = Status.FAILURE
136+
else:
137+
self.feedback_message = (
138+
f"Need to release docker version {str(self.release_version)}"
139+
)
140+
result = Status.SUCCESS
141+
142+
if self.log_once("need_to_release", self.package_meta.ephemeral.log_once_flags):
143+
color_open = "" if result == Status.SUCCESS else "yellow"
144+
color_close = "" if result == Status.SUCCESS else "[/]"
145+
self.logger.info(f"{color_open}{self.feedback_message}{color_close}")
146+
return result

src/redis_release/bht/behaviours_homebrew.py

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ def initialise(self) -> None:
5353
return
5454
if self.release_version is not None:
5555
return
56-
56+
if self.release_meta.tag == "unstable":
57+
return
5758
self.feedback_message = ""
5859
try:
5960
self.release_version = RedisVersion.parse(self.release_meta.tag)
@@ -72,6 +73,15 @@ def update(self) -> Status:
7273
):
7374
return Status.SUCCESS
7475
else:
76+
if self.release_meta.tag == "unstable":
77+
self.feedback_message = "Skip unstable release for Homebrew"
78+
if self.log_once(
79+
"homebrew_channel_detected",
80+
self.package_meta.ephemeral.log_once_flags,
81+
):
82+
self.logger.info(self.feedback_message)
83+
return Status.SUCCESS
84+
7585
assert self.release_version is not None
7686
if self.package_meta.release_type is None:
7787
if self.release_version.is_internal:
@@ -131,6 +141,12 @@ def initialise(self) -> None:
131141
if self.package_meta.ephemeral.is_version_acceptable is not None:
132142
return
133143

144+
if self.release_meta.tag == "unstable":
145+
self.package_meta.ephemeral.is_version_acceptable = False
146+
# we need to set remote version to not None as it is a sign of successful classify step
147+
self.package_meta.remote_version = "unstable"
148+
return
149+
134150
self.feedback_message = ""
135151
# Validate homebrew_channel is set
136152
if self.package_meta.homebrew_channel is None:
@@ -258,6 +274,34 @@ def update(self) -> Status:
258274
# Conditions
259275

260276

277+
class DetectReleaseTypeHomebrew(LoggingAction):
278+
"""Check that release_type is set for Homebrew packages.
279+
280+
Homebrew packages should have release_type set by DetectHombrewReleaseAndChannel.
281+
This behavior just validates that it's set and fails if not.
282+
"""
283+
284+
def __init__(
285+
self,
286+
name: str,
287+
package_meta: HomebrewMeta,
288+
release_meta: ReleaseMeta,
289+
log_prefix: str = "",
290+
) -> None:
291+
self.package_meta = package_meta
292+
self.release_meta = release_meta
293+
super().__init__(name=name, log_prefix=log_prefix)
294+
295+
def update(self) -> Status:
296+
if self.package_meta.release_type is not None:
297+
self.feedback_message = f"Release type: {self.package_meta.release_type}"
298+
return Status.SUCCESS
299+
else:
300+
self.feedback_message = "Release type is not set"
301+
self.logger.error("Release type is not set for Homebrew package")
302+
return Status.FAILURE
303+
304+
261305
class NeedToReleaseHomebrew(LoggingAction):
262306
def __init__(
263307
self,

0 commit comments

Comments
 (0)