Skip to content

Commit 5553383

Browse files
committed
Restructure and clean up GitHub release notes generator
Signed-off-by: Tobias Wolf <wolf@b1-systems.de> On-behalf-of: SAP <tobias.wolf@sap.com>
1 parent 35741dd commit 5553383

42 files changed

Lines changed: 2090 additions & 2262 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

poetry.lock

Lines changed: 14 additions & 48 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ pygit2 = "^1.19.1"
2121
pygments = "^2.19.2"
2222
PyGithub = "^2.8.1"
2323
PyYAML = "^6.0.2"
24-
gitpython = "^3.1.45"
24+
semver = "^3.0.4"
2525

2626
[tool.poetry.group.dev.dependencies]
2727
bandit = "^1.9.3"

src/gardenlinux/constants.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@
145145

146146
GL_BUG_REPORT_URL = "https://github.com/gardenlinux/gardenlinux/issues"
147147
GL_COMMIT_SPECIAL_VALUES = ("local",)
148+
GL_CONTAINER_REGISTRY_BASE_URL = "ghcr.io/gardenlinux/gardenlinux"
148149
GL_DEB_REPO_BASE_URL = "https://packages.gardenlinux.io/gardenlinux"
149150
GL_DISTRIBUTION_NAME = "Garden Linux"
150151
GL_HOME_URL = "https://gardenlinux.io"
@@ -157,8 +158,6 @@
157158
OCI_ANNOTATION_SIGNED_STRING_KEY = "io.gardenlinux.oci.signed-string"
158159
OCI_IMAGE_INDEX_MEDIA_TYPE = "application/vnd.oci.image.index.v1+json"
159160

160-
RELEASE_ID_FILE = ".github_release_id"
161-
162161
REQUESTS_TIMEOUTS = (5, 60) # connect, read
163162

164163
S3_DOWNLOADS_DIR = Path(os.path.dirname(__file__)) / ".." / "s3_downloads"
@@ -167,7 +166,3 @@
167166
GLVD_BASE_URL = "https://security.gardenlinux.org/v1"
168167

169168
PODMAN_CONNECTION_MAX_IDLE_SECONDS = 3
170-
171-
# https://github.com/gardenlinux/gardenlinux/issues/3044
172-
# Empty string is the 'legacy' variant with traditional root fs and still needed/supported
173-
IMAGE_VARIANTS = ["", "_usi", "_tpm2_trustedboot"]

src/gardenlinux/distro_version.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
from semver import Version
2+
3+
4+
class UnsupportedDistroVersion(Exception):
5+
pass
6+
7+
8+
class NotAPatchRelease(Exception):
9+
pass
10+
11+
12+
class DistroVersion(Version): # type: ignore[misc]
13+
def __init__(self, version: str | Version):
14+
self._version_format_without_patch_number = False
15+
16+
try:
17+
if isinstance(version, Version):
18+
version_parsed = version
19+
elif len(version.split(".")) == 2:
20+
# Support version strings without patch numbers
21+
version_parsed = Version.parse(f"{version}.0")
22+
self._version_format_without_patch_number = True
23+
else:
24+
version_parsed = Version.parse(version)
25+
except Exception as exc:
26+
raise UnsupportedDistroVersion(exc)
27+
28+
Version.__init__(
29+
self,
30+
version_parsed.major,
31+
version_parsed.minor,
32+
version_parsed.patch,
33+
version_parsed.prerelease,
34+
version_parsed.build,
35+
)
36+
37+
@property
38+
def is_patch_release(self) -> bool:
39+
if self._version_format_without_patch_number:
40+
return self.minor > 0 # type: ignore[no-any-return]
41+
42+
return self.patch > 0 # type: ignore[no-any-return]
43+
44+
@property
45+
def previous_patch_release(self) -> str:
46+
if not self.is_patch_release:
47+
raise NotAPatchRelease(f"{self} is not a patch release")
48+
49+
if self._version_format_without_patch_number:
50+
previous_version = DistroVersion(
51+
Version(self.major, self.minor - 1, self.patch)
52+
)
53+
return f"{previous_version.major}.{previous_version.minor}"
54+
55+
return str(
56+
Version(
57+
self.major,
58+
self.minor,
59+
self.patch - 1,
60+
prerelease=self.prerelease,
61+
build=self.build,
62+
)
63+
)

src/gardenlinux/distro_version/__init__.py

Lines changed: 0 additions & 73 deletions
This file was deleted.
Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,5 @@
1-
import logging
2-
import sys
3-
4-
from ...constants import RELEASE_ID_FILE
5-
from ...logger import LoggerSetup
1+
from .deployment_platform import DeploymentPlatform
62
from .release import Release
3+
from .release_images_metadata import ReleaseImagesMetadata
74

8-
LOGGER = LoggerSetup.get_logger("gardenlinux.github.release", logging.INFO)
9-
10-
11-
def write_to_release_id_file(release_id: str | int) -> None:
12-
try:
13-
with open(RELEASE_ID_FILE, "w") as file:
14-
file.write(str(release_id))
15-
LOGGER.info(f"Created {RELEASE_ID_FILE} successfully.")
16-
except IOError as e:
17-
LOGGER.error(f"Could not create {RELEASE_ID_FILE} file: {e}")
18-
sys.exit(1)
19-
20-
21-
__all__ = ["Release", "write_to_release_id_file"]
5+
__all__ = ["DeploymentPlatform", "Release", "ReleaseImagesMetadata"]

src/gardenlinux/github/release/__main__.py

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44
from gardenlinux.constants import GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME
55
from gardenlinux.logger import LoggerSetup
66

7-
from ..release_notes import create_github_release_notes
8-
from . import write_to_release_id_file
7+
from .notes import MarkdownGenerator
98
from .release import Release
109

1110
LOGGER = LoggerSetup.get_logger("gardenlinux.github", logging.INFO)
@@ -167,24 +166,24 @@ def main() -> None:
167166
release.is_latest = args.latest
168167
release.create()
169168
elif args.command == "create-with-gl-release-notes":
170-
body = create_github_release_notes(
171-
args.tag, args.commit, GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME
172-
)
169+
release = Release(args.repo, args.owner)
170+
release.tag = args.tag
171+
release.commitish = args.commit
172+
release.is_latest = args.latest
173+
174+
generator = MarkdownGenerator(release, GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME)
173175

174176
if args.dry_run:
175177
print("Dry Run ...")
176178
print("This release would be created:")
177-
print(body)
179+
print(str(generator))
178180
else:
179-
release = Release(args.repo, args.owner)
180-
release.tag = args.tag
181-
release.body = body
182-
release.commitish = args.commit
183-
release.is_latest = args.latest
181+
release.body = str(generator)
184182

185183
release_id = release.create()
186-
write_to_release_id_file(f"{release_id}")
187184
LOGGER.info(f"Release created with ID: {release_id}")
185+
186+
print(f"{release_id}")
188187
elif args.command == "upload":
189188
release = Release.get(args.release_id, repo=args.repo, owner=args.owner)
190189

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"short_name": "ali",
3+
"full_name": "Alibaba Cloud",
4+
"image_extension": "qcow2",
5+
6+
"mapping_type": "regions_list",
7+
"mapping_entry_json": "{\"region\": \"{region_id}\", \"image_id\": \"{image_id}\"}"
8+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"short_name": "aws",
3+
"full_name": "Amazon Web Services",
4+
"image_extension": "raw",
5+
6+
"mapping_type": "regions_list",
7+
"mapping_entry_json": "{\"region\": \"{aws_region_id}\", \"image_id\": \"{ami_id}\"}"
8+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"short_name": "azure",
3+
"full_name": "Microsoft Azure",
4+
"image_extension": "vhd",
5+
6+
"mapping_type": "azure_gallery_and_marketplace_list",
7+
"mapping_entry_json": "{\"hyper_v_generation\": \"{hyper_v_generation}\", \"azure_cloud\": \"{azure_cloud}\", \"image_id\": \"{community_gallery_image_id}\", \"urn\": \"{urn}\"}"
8+
}

0 commit comments

Comments
 (0)