Skip to content
Closed
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
23 changes: 13 additions & 10 deletions .github/python/add-release/add_release.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,10 @@ def main() -> None:
args = parser.parse_args()

version_metadata = VersionMetadata(
args.version, args.github_org, args.ee_release_repo_name
args.version,
args.github_org,
args.ee_release_repo_name,
args.jfrog_preprod_files_repo,
)
logging.debug("version=%s", version_metadata.version)

Expand All @@ -46,13 +49,13 @@ def update_hazelcast_open_source_metadata(version_metadata: VersionMetadata):
version_block = f"""---
Version: {version_metadata.version}
Date: ${{TBC_RELEASE_DATE}}
Download_ZIP_URL: {version_metadata.os_downloads.full_zip.url}
Download_ZIP_URL: {version_metadata.os_downloads.full_zip.live_url}
Download_ZIP_Size: {version_metadata.os_downloads.full_zip.size}
Download_slim_ZIP_URL: {version_metadata.os_downloads.slim_zip.url}
Download_slim_ZIP_URL: {version_metadata.os_downloads.slim_zip.live_url}
Download_slim_ZIP_Size: {version_metadata.os_downloads.slim_zip.size}
Download_TAR_URL: {version_metadata.os_downloads.full_tar.url}
Download_TAR_URL: {version_metadata.os_downloads.full_tar.live_url}
Download_TAR_Size: {version_metadata.os_downloads.full_tar.size}
Download_slim_TAR_URL: {version_metadata.os_downloads.slim_tar.url}
Download_slim_TAR_URL: {version_metadata.os_downloads.slim_tar.live_url}
Download_slim_TAR_Size: {version_metadata.os_downloads.slim_tar.size}
Docs_HTML: {version_metadata.docs_url}
Docs_PDF:
Expand All @@ -75,13 +78,13 @@ def update_hazelcast_enterprise_metadata(version_metadata: VersionMetadata):
version_block = f"""---
Version: {version_metadata.version}
Date: ${{TBC_RELEASE_DATE}}
Download_ZIP_URL: {version_metadata.ee_downloads.full_zip.url}
Download_ZIP_URL: {version_metadata.ee_downloads.full_zip.live_url}
Download_ZIP_Size: {version_metadata.ee_downloads.full_zip.size}
Download_slim_ZIP_URL: {version_metadata.ee_downloads.slim_zip.url}
Download_slim_ZIP_URL: {version_metadata.ee_downloads.slim_zip.live_url}
Download_slim_ZIP_Size: {version_metadata.ee_downloads.slim_zip.size}
Download_TAR_URL: {version_metadata.ee_downloads.full_tar.url}
Download_TAR_URL: {version_metadata.ee_downloads.full_tar.live_url}
Download_TAR_Size: {version_metadata.ee_downloads.full_tar.size}
Download_slim_TAR_URL: {version_metadata.ee_downloads.slim_tar.url}
Download_slim_TAR_URL: {version_metadata.ee_downloads.slim_tar.live_url}
Download_slim_TAR_Size: {version_metadata.ee_downloads.slim_tar.size}
Docs_HTML: {version_metadata.docs_url}
Docs_PDF:
Expand Down Expand Up @@ -154,7 +157,7 @@ def update_imdg_clients_metadata(version_metadata: VersionMetadata):
version_block = f"""---
Version: {version_metadata.version}
Date: ${{TBC_RELEASE_DATE}}
Download: {version_metadata.os_downloads.slim_zip.url}
Download: {version_metadata.os_downloads.slim_zip.live_url}
Download_Size: {version_metadata.os_downloads.slim_zip.size}
Github: {version_metadata.sources_url}
Docs: {version_metadata.docs_url}
Expand Down
18 changes: 10 additions & 8 deletions .github/python/add-release/tests/test_version_metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,23 @@


def test_build_downloads():
version_metadata = vm.VersionMetadata("5.4.1", "hazelcast", "download")
downloads = version_metadata._build_downloads("https://example.com/foo")
version_metadata = vm.VersionMetadata("5.4.1", "hazelcast", "download", "preprod")
downloads = version_metadata._build_downloads(
"https://example.com/foo", "https://example.com/bar"
)

assert downloads.full_zip.url == "https://example.com/foo.zip"
assert downloads.slim_zip.url == "https://example.com/foo-slim.zip"
assert downloads.full_tar.url == "https://example.com/foo.tar.gz"
assert downloads.slim_tar.url == "https://example.com/foo-slim.tar.gz"
assert downloads.full_zip.live_url == "https://example.com/foo.zip"
assert downloads.slim_zip.live_url == "https://example.com/foo-slim.zip"
assert downloads.full_tar.live_url == "https://example.com/foo.tar.gz"
assert downloads.slim_tar.live_url == "https://example.com/foo-slim.tar.gz"


def test_download_size():
version_metadata = vm.VersionMetadata("5.6.0", "hazelcast", "download")
version_metadata = vm.VersionMetadata("5.6.0", "hazelcast", "download", "preprod")
slim_zip = version_metadata.os_downloads.slim_zip

assert (
slim_zip.url
slim_zip.live_url
== "https://github.com/hazelcast/hazelcast/releases/download/v5.6.0/hazelcast-5.6.0-slim.zip"
)
assert slim_zip.size == "41 MB"
83 changes: 55 additions & 28 deletions .github/python/add-release/version_metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,44 +6,68 @@
import semver
from humanize import naturalsize
from requests.auth import HTTPBasicAuth
from urllib.parse import urlparse


@dataclass
class DownloadUrl:
"""A download URL with lazily computed, human-friendly size."""

url: str
_live_base_url: str
_preprod_base_url: str
_suffix: str
_size: str = field(default=None, init=False)

@property
def size(self) -> str:
@staticmethod
def _get_size(url: str) -> str:
"""Fetch and cache the artifact size without _actually_ downloading it."""
# Lazily evaluates
# So in the case of (say) an EE-only release we don't query (non-existent) OS artifacts
if self._size is None:
logging.debug("Getting size of %s", self.url)
logging.debug("Getting size of %s", url)

username = os.getenv("RELEASE_REPO_USER")
password = os.getenv("RELEASE_REPO_TOKEN")
username = os.getenv("RELEASE_REPO_USER")
password = os.getenv("RELEASE_REPO_TOKEN")

auth = HTTPBasicAuth(username, password) if username and password else None
auth = (
HTTPBasicAuth(username, password)
if urlparse(url).hostname == "repository.hazelcast.com"
and username
and password
else None
)

response = requests.head(
self.url,
allow_redirects=True,
auth=auth,
)
response.raise_for_status()
response = requests.head(
url,
allow_redirects=True,
auth=auth,
)
response.raise_for_status()

content_length = response.headers["Content-Length"]
content_length = response.headers["Content-Length"]

if content_length:
self._size = naturalsize(int(content_length), format="%.0f")
else:
raise Exception(f"{self.url} did not return a size")
if content_length:
return naturalsize(int(content_length), format="%.0f")
else:
raise Exception(f"{url} did not return a size")

@property
def size(self) -> str:
if self._size is None:
try:
self._size = self._get_size(self.live_url)
except requests.RequestException:
self._size = self._get_size(self.preprod_url)

return self._size

@property
def live_url(self) -> str:
return self._live_base_url + self._suffix

@property
def preprod_url(self) -> str:
return self._preprod_base_url + self._suffix


@dataclass
class Downloads:
Expand All @@ -62,17 +86,20 @@ class VersionMetadata:
version: semver.Version | str
github_org: InitVar[str]
ee_release_repo_name: InitVar[str]
jfrog_preprod_files_repo: InitVar[str]

def __post_init__(self, github_org, ee_release_repo_name):
def __post_init__(self, github_org, ee_release_repo_name, jfrog_preprod_files_repo):
"""Normalize version and populate derived URLs and metadata."""
if isinstance(self.version, str):
self.version = semver.Version.parse(self.version)

self.os_downloads = self._build_downloads(
f"https://github.com/{github_org}/hazelcast/releases/download/v{self.version}/hazelcast-{self.version}"
f"https://github.com/{github_org}/hazelcast/releases/download/v{self.version}/hazelcast-{self.version}",
f"https://repository.hazelcast.com/{jfrog_preprod_files_repo}/hazelcast/hazelcast-{self.version}",
)
self.ee_downloads = self._build_downloads(
f"https://repository.hazelcast.com/{ee_release_repo_name}/hazelcast-enterprise/hazelcast-enterprise-{self.version}"
f"https://repository.hazelcast.com/{ee_release_repo_name}/hazelcast-enterprise/hazelcast-enterprise-{self.version}",
f"https://repository.hazelcast.com/{jfrog_preprod_files_repo}/hazelcast-enterprise/hazelcast-enterprise-{self.version}",
)

self.sources_url = (
Expand All @@ -90,11 +117,11 @@ def __post_init__(self, github_org, ee_release_repo_name):
f"https://docs.hazelcast.org/hazelcast-ee-docs/{self.version}/javadoc"
)

def _build_downloads(self, base: str) -> Downloads:
"""Build a Downloads object for a given artifact base URL."""
def _build_downloads(self, live_base_url: str, preprod_base_url: str) -> Downloads:
"""Build a Downloads object for a given artifact base live URL."""
return Downloads(
full_zip=DownloadUrl(f"{base}.zip"),
slim_zip=DownloadUrl(f"{base}-slim.zip"),
full_tar=DownloadUrl(f"{base}.tar.gz"),
slim_tar=DownloadUrl(f"{base}-slim.tar.gz"),
full_zip=DownloadUrl(live_base_url, preprod_base_url, ".zip"),
slim_zip=DownloadUrl(live_base_url, preprod_base_url, "-slim.zip"),
full_tar=DownloadUrl(live_base_url, preprod_base_url, ".tar.gz"),
slim_tar=DownloadUrl(live_base_url, preprod_base_url, "-slim.tar.gz"),
)
1 change: 1 addition & 0 deletions .github/workflows/package.yml
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ jobs:
--version=${VERSION} \
--github-org=${GITHUB_REPOSITORY_OWNER} \
--ee-release-repo-name=${{ vars.EE_RELEASE_REPO_NAME }} \
--jfrog-preprod-files-repo=${{ vars.JFROG_PREPROD_FILES_REPO }} \
--should-build-oss=${{ steps.resolve-editions.outputs.should_build_oss }} \
--should-build-ee=${{ steps.resolve-editions.outputs.should_build_ee }}
env:
Expand Down
Loading