[couchbase-server] Refactor script (#220)

Make the script more readable, mostly by:

- using the endoflife.Product class,
- a little bit of renaming and documentation.
This commit is contained in:
Marc Wrobel
2023-12-10 17:06:28 +01:00
committed by GitHub
parent c20b65124d
commit 6cac26c41f

View File

@@ -3,54 +3,42 @@ from bs4 import BeautifulSoup
from common import http
from common import dates
from common import endoflife
from datetime import datetime
"""Fetch versions with their dates from docs.couchbase.com.
"""Fetches versions from release notes of each minor version on docs.couchbase.com.
Versions are fetched from the release notes of each minor version. Date is not
accurate (only month and year are provided) but it's already better than the
previous implementation which use dates of the images on Docker Hub. Because
of that lack of precision, all dates are set to the 15th of the month.
Notes:
- documentation for oldest versions is not available anymore on
docs.couchbase.com, so this script is using the Wayback Machine to fetch them.
- dates are not available for some versions, those had to be set manually.
Dates are not available for all versions, so they must be set manually in some cases.
Moreover dates are not accurate (only month and year are provided), so they are set to the last day of the month.
"""
PRODUCT = "couchbase-server"
REGEX = r"^Release (?P<version>\d+\.\d+(\.\d+)?) \((?P<date>.+)\)$"
URLS = "https://docs.couchbase.com/server"
FIXED_VERSIONS = {
"6.0.0": "2018-10-31", # https://www.couchbase.com/blog/announcing-couchbase-6-0/
"6.0.1": "2019-02-15", # https://web.archive.org/web/20190307191211/https://docs.couchbase.com/server/6.0/release-notes/relnotes.html
"6.6.0": "2020-08-12", # https://www.couchbase.com/blog/whats-new-and-improved-in-couchbase-server-6-6/
"7.2.0": "2023-06-01", # https://www.couchbase.com/blog/couchbase-capella-spring-release-72/
VERSION_AND_DATE_PATTERN = re.compile(r"^Release (?P<version>\d+\.\d+(\.\d+)?) \((?P<date>.+)\)$")
MANUAL_VERSIONS = {
"6.0.0": datetime(2018, 10, 31), # https://www.couchbase.com/blog/announcing-couchbase-6-0/
"6.0.1": datetime(2019, 2, 15), # https://web.archive.org/web/20190307191211/https://docs.couchbase.com/server/6.0/release-notes/relnotes.html
"6.6.0": datetime(2020, 8, 12), # https://www.couchbase.com/blog/whats-new-and-improved-in-couchbase-server-6-6/
"7.2.0": datetime(2023, 6, 1), # https://www.couchbase.com/blog/couchbase-capella-spring-release-72/
}
print(f"::group::{PRODUCT}")
versions = {}
response = http.fetch_url(f"{URLS}/current/install/install-intro.html")
soup = BeautifulSoup(response.text, features="html5lib")
minor_versions = [options.attrs["value"] for options in soup.find(class_="version_list").find_all("option")]
# there is no date available for x.y.0
for minor in minor_versions:
versions[minor + '.0'] = 'N/A'
product = endoflife.Product("couchbase-server")
print(f"::group::{product.name}")
main = http.fetch_url(f"{URLS}/current/install/install-intro.html")
main_soup = BeautifulSoup(main.text, features="html5lib")
minor_versions = [options.attrs["value"] for options in main_soup.find(class_="version_list").find_all("option")]
minor_version_urls = [f"{URLS}/{minor}/release-notes/relnotes.html" for minor in minor_versions]
for response in http.fetch_urls(minor_version_urls):
soup = BeautifulSoup(response.text, features="html5lib")
for title in soup.find_all("h2"):
versionAndDate = title.get_text().strip()
m = re.match(REGEX, versionAndDate)
if m:
version = f"{m['version']}.0" if len(m['version'].split('.')) == 2 else m['version']
date = dates.parse_month_year_date(m['date']).strftime("%Y-%m-%d")
versions[version] = date
print(f"{version}: {date}")
versions = versions | FIXED_VERSIONS
endoflife.write_releases(PRODUCT, versions)
for minor_version in http.fetch_urls(minor_version_urls):
minor_version_soup = BeautifulSoup(minor_version.text, features="html5lib")
for title in minor_version_soup.find_all("h2"):
match = VERSION_AND_DATE_PATTERN.match(title.get_text().strip())
if match:
version = match["version"]
version = f"{version}.0" if len(version.split(".")) == 2 else version
date = dates.parse_month_year_date(match['date'])
product.declare_version(version, date)
product.declare_versions(MANUAL_VERSIONS)
product.write()
print("::endgroup::")