scripts/release.py (150 lines of code) (raw):
#
# Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
# or more contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Elasticsearch B.V. licenses this file to you under
# the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
import os
import re
import sys
from pathlib import Path
from sh import ErrorReturnCode
from scripts.utils import Constants, detect_gh, detect_git, project_version
def __set_version(version: str) -> None:
# Update app version
try:
data = Constants.TERRANOVA_INIT_PATH.read_text()
except Exception as err:
print(
f"The `{Constants.TERRANOVA_INIT_PATH.as_posix()}` can't be read",
file=sys.stderr,
)
raise err
data = re.sub(
r"__version__ = \"(.*)\"", f'__version__ = "{version}"', data, count=1
)
try:
Constants.TERRANOVA_INIT_PATH.write_text(data)
except Exception as err:
print(
f"The `{Constants.TERRANOVA_INIT_PATH.as_posix()}` file can't be written",
file=sys.stderr,
)
raise err
# Update project version
try:
data = Constants.PYPROJECT_PATH.read_text()
except Exception as err:
print(
f"The `{Constants.PYPROJECT_PATH.as_posix()}` can't be read",
file=sys.stderr,
)
raise err
data = re.sub(r"version = \"(.+)\"", f'version = "{version}"', data, count=1)
try:
Constants.PYPROJECT_PATH.write_text(data)
except Exception as err:
print(
f"The `{Constants.PYPROJECT_PATH.as_posix()}` file can't be written",
file=sys.stderr,
)
raise err
def __set_version_install_file(version: str) -> None:
# Update install file version version
try:
data = Constants.INSTALL_PATH.read_text()
except Exception as err:
print(
f"The `{Constants.INSTALL_PATH.as_posix()}` can't be read",
file=sys.stderr,
)
raise err
data = re.sub(r"VERSION=\"(.*)\"", f'VERSION="{version}"', data, count=1)
try:
Constants.INSTALL_PATH.write_text(data)
except Exception as err:
print(
f"The `{Constants.INSTALL_PATH.as_posix()}` file can't be written",
file=sys.stderr,
)
raise err
def pre() -> None:
# Ensure we have inputs
release_version = os.getenv("RELEASE_VERSION")
if not release_version:
return print(
"You must define `RELEASE_VERSION` environment variable.", file=sys.stderr
)
if not re.match(r"(\d){1,2}\.(\d){1,2}\.(\d){1,2}", release_version):
return print(
"The `RELEASE_VERSION` should match semver format.", file=sys.stderr
)
# Create a new branch
# TODO: if you change the branch_name, please update the
# condition at .github/workflows/ci.yml
branch_name = f"feat/pre-release-v{release_version}"
git = detect_git()
git("checkout", "-b", branch_name, _out=sys.stdout, _err=sys.stderr)
# Update all files
__set_version(release_version)
# Update install file
__set_version_install_file(release_version)
# Push release branch
git("add", "--all", _out=sys.stdout, _err=sys.stderr)
git(
"commit",
"-m",
f"release: terranova v{release_version}",
"--no-verify",
_out=sys.stdout,
_err=sys.stderr,
)
git("push", "origin", branch_name, _out=sys.stdout, _err=sys.stderr)
# Create a PR
gh = detect_gh()
gh(
"pr",
"create",
"--fill",
"--base=main",
f"--head={branch_name}",
_out=sys.stdout,
_err=sys.stderr,
)
def run() -> None:
# Read project version
release_version = project_version()
# Create the release tag
try:
git = detect_git()
git("tag", release_version)
git("push", "origin", release_version)
except ErrorReturnCode:
return print(
f"The release `v{release_version}` already exists.", file=sys.stderr
)
# Create the release
args = [
"release",
"create",
"--generate-notes",
"--latest",
f"--title=terranova v{release_version}",
release_version,
]
binaries = [file.absolute().as_posix() for file in Path(".").glob("./terranova-*")]
args.extend(binaries)
gh = detect_gh()
gh(args, _out=sys.stdout, _err=sys.stderr)
def post() -> None:
# Ensure we have inputs
next_version = os.getenv("NEXT_VERSION")
if not next_version:
return print(
"You must define `NEXT_VERSION` environment variable", file=sys.stderr
)
if not re.match(r"(\d){1,2}\.(\d){1,2}\.(\d){1,2}-dev", next_version):
return print("The `NEXT_VERSION` should match semver format.", file=sys.stderr)
# Create a new branch
# TODO: if you change the branch_name, please update the
# condition at .github/workflows/ci.yml
branch_name = f"feat/post-release-v{next_version}"
git = detect_git()
git("checkout", "-b", branch_name, _out=sys.stdout, _err=sys.stderr)
# Update all files
__set_version(next_version)
# Push changes
git("add", "--all", _out=sys.stdout, _err=sys.stderr)
git(
"commit",
"-m",
"chore: prepare for next iteration",
"--no-verify",
_out=sys.stdout,
_err=sys.stderr,
)
git("push", "origin", branch_name, _out=sys.stdout, _err=sys.stderr)
# Create a PR
gh = detect_gh()
gh(
"pr",
"create",
"--fill",
"--base=main",
f"--head={branch_name}",
_out=sys.stdout,
_err=sys.stderr,
)