From 1a80a18997903d8956bcd4766ea3074a21c880fe Mon Sep 17 00:00:00 2001 From: Jack Date: Tue, 23 Jun 2026 12:14:01 +0100 Subject: [PATCH 1/2] DI-794 --- .github/python/add-release/add_release.py | 24 +++--- .../tests/test_version_metadata.py | 18 ++-- .../python/add-release/version_metadata.py | 83 ++++++++++++------- .github/workflows/package.yml | 1 + 4 files changed, 80 insertions(+), 46 deletions(-) diff --git a/.github/python/add-release/add_release.py b/.github/python/add-release/add_release.py index 55c2105..b4628a4 100644 --- a/.github/python/add-release/add_release.py +++ b/.github/python/add-release/add_release.py @@ -19,12 +19,16 @@ def main() -> None: parser.add_argument("--version", required=True) parser.add_argument("--github-org", required=True) parser.add_argument("--ee-release-repo-name", required=True) + parser.add_argument("--jfrog-preprod-files-repo", required=True) parser.add_argument("--should-build-oss", required=True) parser.add_argument("--should-build-ee", required=True) 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) @@ -46,13 +50,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: @@ -75,13 +79,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: @@ -154,7 +158,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} diff --git a/.github/python/add-release/tests/test_version_metadata.py b/.github/python/add-release/tests/test_version_metadata.py index 1a16815..1e5bd41 100644 --- a/.github/python/add-release/tests/test_version_metadata.py +++ b/.github/python/add-release/tests/test_version_metadata.py @@ -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" diff --git a/.github/python/add-release/version_metadata.py b/.github/python/add-release/version_metadata.py index 417844f..7e463df 100644 --- a/.github/python/add-release/version_metadata.py +++ b/.github/python/add-release/version_metadata.py @@ -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.preprod_url) + except requests.RequestException: + self._size = self._get_size(self.live_url) return self._size + @property + def live_url(self) -> str: + return f"{self._live_base_url}{self._suffix}" + + @property + def preprod_url(self) -> str: + return f"{self._preprod_base_url}{self._suffix}" + @dataclass class Downloads: @@ -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 = ( @@ -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"), ) diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index 6be85d9..afac616 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -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: From 395fada97b12e7392ea94a553653a744b6efbffd Mon Sep 17 00:00:00 2001 From: Jack Green Date: Thu, 25 Jun 2026 09:51:53 +0100 Subject: [PATCH 2/2] https://github.com/hazelcast/rel-scripts/pull/76#discussion_r3473077980 --- .github/python/add-release/add_release.py | 18 +++++++++--------- .../add-release/tests/test_version_metadata.py | 10 +++++----- .github/python/add-release/version_metadata.py | 4 ++-- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/python/add-release/add_release.py b/.github/python/add-release/add_release.py index b4628a4..08ac7a9 100644 --- a/.github/python/add-release/add_release.py +++ b/.github/python/add-release/add_release.py @@ -50,13 +50,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.live_url} +Download_ZIP_URL: {version_metadata.os_downloads.full_zip.public_url} Download_ZIP_Size: {version_metadata.os_downloads.full_zip.size} -Download_slim_ZIP_URL: {version_metadata.os_downloads.slim_zip.live_url} +Download_slim_ZIP_URL: {version_metadata.os_downloads.slim_zip.public_url} Download_slim_ZIP_Size: {version_metadata.os_downloads.slim_zip.size} -Download_TAR_URL: {version_metadata.os_downloads.full_tar.live_url} +Download_TAR_URL: {version_metadata.os_downloads.full_tar.public_url} Download_TAR_Size: {version_metadata.os_downloads.full_tar.size} -Download_slim_TAR_URL: {version_metadata.os_downloads.slim_tar.live_url} +Download_slim_TAR_URL: {version_metadata.os_downloads.slim_tar.public_url} Download_slim_TAR_Size: {version_metadata.os_downloads.slim_tar.size} Docs_HTML: {version_metadata.docs_url} Docs_PDF: @@ -79,13 +79,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.live_url} +Download_ZIP_URL: {version_metadata.ee_downloads.full_zip.public_url} Download_ZIP_Size: {version_metadata.ee_downloads.full_zip.size} -Download_slim_ZIP_URL: {version_metadata.ee_downloads.slim_zip.live_url} +Download_slim_ZIP_URL: {version_metadata.ee_downloads.slim_zip.public_url} Download_slim_ZIP_Size: {version_metadata.ee_downloads.slim_zip.size} -Download_TAR_URL: {version_metadata.ee_downloads.full_tar.live_url} +Download_TAR_URL: {version_metadata.ee_downloads.full_tar.public_url} Download_TAR_Size: {version_metadata.ee_downloads.full_tar.size} -Download_slim_TAR_URL: {version_metadata.ee_downloads.slim_tar.live_url} +Download_slim_TAR_URL: {version_metadata.ee_downloads.slim_tar.public_url} Download_slim_TAR_Size: {version_metadata.ee_downloads.slim_tar.size} Docs_HTML: {version_metadata.docs_url} Docs_PDF: @@ -158,7 +158,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.live_url} +Download: {version_metadata.os_downloads.slim_zip.public_url} Download_Size: {version_metadata.os_downloads.slim_zip.size} Github: {version_metadata.sources_url} Docs: {version_metadata.docs_url} diff --git a/.github/python/add-release/tests/test_version_metadata.py b/.github/python/add-release/tests/test_version_metadata.py index 1e5bd41..d0fd33a 100644 --- a/.github/python/add-release/tests/test_version_metadata.py +++ b/.github/python/add-release/tests/test_version_metadata.py @@ -16,10 +16,10 @@ def test_build_downloads(): "https://example.com/foo", "https://example.com/bar" ) - 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" + assert downloads.full_zip.public_url == "https://example.com/foo.zip" + assert downloads.slim_zip.public_url == "https://example.com/foo-slim.zip" + assert downloads.full_tar.public_url == "https://example.com/foo.tar.gz" + assert downloads.slim_tar.public_url == "https://example.com/foo-slim.tar.gz" def test_download_size(): @@ -27,7 +27,7 @@ def test_download_size(): slim_zip = version_metadata.os_downloads.slim_zip assert ( - slim_zip.live_url + slim_zip.public_url == "https://github.com/hazelcast/hazelcast/releases/download/v5.6.0/hazelcast-5.6.0-slim.zip" ) assert slim_zip.size == "41 MB" diff --git a/.github/python/add-release/version_metadata.py b/.github/python/add-release/version_metadata.py index 7e463df..5643554 100644 --- a/.github/python/add-release/version_metadata.py +++ b/.github/python/add-release/version_metadata.py @@ -56,12 +56,12 @@ def size(self) -> str: try: self._size = self._get_size(self.preprod_url) except requests.RequestException: - self._size = self._get_size(self.live_url) + self._size = self._get_size(self.public_url) return self._size @property - def live_url(self) -> str: + def public_url(self) -> str: return f"{self._live_base_url}{self._suffix}" @property