release_mixin now might work

merge-requests/12/head
Michael Jerger 1 year ago
parent 9e91491542
commit 7f7878fe36

@ -1,2 +1,2 @@
from .image_build_service import ImageBuildService from .image_build_service import ImageBuildService
from .release_mixin_services import TagAndPushReleaseService, PrepareReleaseService from .release_mixin_services import ReleaseService

@ -1,34 +1,60 @@
from src.main.python.ddadevops.infrastructure.release_mixin import ReleaseContextRepository, VersionRepository, GitApi from typing import Optional, List
from src.main.python.ddadevops.infrastructure import GitApi, BuildFileRepository
from src.main.python.ddadevops.domain import Version, Release from src.main.python.ddadevops.domain import Version, Release
class PrepareReleaseService(): class ReleaseService:
def __init__(self, git_api: GitApi, build_file_repository: BuildFileRepository):
def __init__(self):
self.git_api = GitApi()
def __write_and_commit_version(self, release: Release, version_repository: VersionRepository, version: Version, commit_message: str):
release.is_valid()
version_repository.write_file(version.get_version_string())
self.git_api.add_file(version_repository.file)
self.git_api.commit(commit_message)
def write_and_commit_release(self, release: Release, version_repository: VersionRepository):
self.__write_and_commit_version(release, version_repository, release.release_version(), commit_message=f'Release v{release.release_version().get_version_string()}')
def write_and_commit_bump(self, release: Release, version_repository: VersionRepository):
self.__write_and_commit_version(release, version_repository, release.bump_version(), commit_message='Version bump')
class TagAndPushReleaseService():
def __init__(self, git_api: GitApi):
self.git_api = git_api self.git_api = git_api
self.build_file_repository = build_file_repository
def tag_release(self, release_repo: ReleaseContextRepository):
annotation = 'v' + release_repo.get_release().version.get_version_string() @classmethod
message = 'Release ' + annotation def prod(cls):
self.git_api.tag_annotated_second_last(annotation, message) return cls(
GitApi(),
def push_release(self): BuildFileRepository(),
)
def prepare_release(self, release: Release):
match release.release_type:
case ReleaseType.MAJOR:
version = release.version.create_major()
case ReleaseType.MINOR:
version = release.version.create_minor()
case ReleaseType.PATCH:
version = release.version.create_patch()
case ReleaseType.NONE:
return
message = f"release: {version.to_string()}"
self.__set_version_and_commit__(version, release.build_files(), message)
def tag_bump_and_push_release(self, release: Release):
match release.release_type:
case ReleaseType.MAJOR:
release_version = release.version.create_major()
case ReleaseType.MINOR:
release_version = release.version.create_minor()
case ReleaseType.PATCH:
release_version = release.version.create_patch()
case ReleaseType.NONE:
return
bump_version = release_version.create_bump()
release_message = f"release: {release_version.to_string()}"
bump_message = f"bump version to: {bump_version.to_string()}"
self.git_api.tag_annotated(release_version.to_string(), release_message, 0)
self.__set_version_and_commit__(
bump_version,
release.build_files(),
bump_message,
)
self.git_api.push() self.git_api.push()
def __set_version_and_commit__(
self, version: Version, build_file_ids: List[str], message: str
):
for id in build_file_ids:
build_file = self.build_file_repository.get(id)
build_file.set_version(release_version)
self.build_file_repository.write(build_file)
self.git_api.add_file(build_file.file_path)
self.git_api.commit(message)

@ -1,5 +1,5 @@
from enum import Enum from enum import Enum
from typing import Optional from typing import Optional, List
from pathlib import Path from pathlib import Path
from .common import ( from .common import (
Validateable, Validateable,
@ -49,3 +49,8 @@ class Release(Validateable):
): ):
result.append(f"Releases are allowed only on {self.release_main_branch}") result.append(f"Releases are allowed only on {self.release_main_branch}")
return result return result
def build_files(self) -> List[str]:
result = [self.release_primary_build_file]
result += self.release_secondary_build_files
return result

@ -5,5 +5,6 @@ from .infrastructure import (
ExecutionApi, ExecutionApi,
EnvironmentApi, EnvironmentApi,
CredentialsApi, CredentialsApi,
GitApi,
) )
from .repository import DevopsRepository, BuildFileRepository from .repository import DevopsRepository, BuildFileRepository

@ -133,3 +133,54 @@ class CredentialsApi:
["gopass", "show", "--password", path] ["gopass", "show", "--password", path]
) )
return credential return credential
class GitApi():
def __init__(self):
self.execution_api = ExecutionApi()
# pylint: disable=invalid-name
def get_latest_n_commits(self, n: int):
return self.execution_api.execute(
f'git log --oneline --format="%s %b" -n {n}')
def get_latest_commit(self):
return self.get_latest_n_commits(1)
def tag_annotated(self, annotation: str, message: str, count: int):
return self.execution_api.execute(
f'git tag -a {annotation} -m {message} HEAD~{count}')
def tag_annotated_second_last(self, annotation: str, message:str):
return self.tag_annotated(annotation, message, 1)
def get_latest_tag(self):
return self.execution_api.execute('git describe --tags --abbrev=0')
def get_current_branch(self):
return ''.join(self.execution_api.execute('git branch --show-current')).rstrip()
def init(self, default_branch: str = "main"):
self.execution_api.execute('git init')
self.execution_api.execute(f'git checkout -b {default_branch}')
def set_user_config(self, email: str, name: str):
self.execution_api.execute(f'git config user.email {email}')
self.execution_api.execute(f'git config user.name {name}')
def add_file(self, file_path: Path):
return self.execution_api.execute(f'git add {file_path}')
def add_remote(self, origin: str, url: str):
return self.execution_api.execute(f'git remote add {origin} {url}')
def commit(self, commit_message: str):
return self.execution_api.execute(
f'git commit -m "{commit_message}"')
def push(self):
return self.execution_api.execute('git push')
def checkout(self, branch: str):
return self.execution_api.execute(f'git checkout {branch}')

@ -1,2 +1,2 @@
from .infrastructure_api import FileHandler, GitApi, JsonFileHandler, GradleFileHandler, PythonFileHandler, ClojureFileHandler from .infrastructure_api import FileHandler, JsonFileHandler, GradleFileHandler, PythonFileHandler, ClojureFileHandler
from .repo import VersionRepository, ReleaseContextRepository, ReleaseTypeRepository from .repo import VersionRepository, ReleaseContextRepository, ReleaseTypeRepository

@ -180,54 +180,5 @@ class ClojureFileHandler(FileHandler):
clj_file.truncate() clj_file.truncate()
class GitApi():
def __init__(self):
self.execution_api = ExecutionApi()
# pylint: disable=invalid-name
def get_latest_n_commits(self, n: int):
return self.execution_api.execute(
f'git log --oneline --format="%s %b" -n {n}')
def get_latest_commit(self):
return self.get_latest_n_commits(1)
def tag_annotated(self, annotation: str, message: str, count: int):
return self.execution_api.execute(
f'git tag -a {annotation} -m {message} HEAD~{count}')
def tag_annotated_second_last(self, annotation: str, message:str):
return self.tag_annotated(annotation, message, 1)
def get_latest_tag(self):
return self.execution_api.execute('git describe --tags --abbrev=0')
def get_current_branch(self):
return ''.join(self.execution_api.execute('git branch --show-current')).rstrip()
def init(self, default_branch: str = "main"):
self.execution_api.execute('git init')
self.execution_api.execute(f'git checkout -b {default_branch}')
def set_user_config(self, email: str, name: str):
self.execution_api.execute(f'git config user.email {email}')
self.execution_api.execute(f'git config user.name {name}')
def add_file(self, file_path: Path):
return self.execution_api.execute(f'git add {file_path}')
def add_remote(self, origin: str, url: str):
return self.execution_api.execute(f'git remote add {origin} {url}')
def commit(self, commit_message: str):
return self.execution_api.execute(
f'git commit -m "{commit_message}"')
def push(self):
return self.execution_api.execute('git push')
def checkout(self, branch: str):
return self.execution_api.execute(f'git checkout {branch}')

@ -1,39 +1,23 @@
from pybuilder.core import Project from pybuilder.core import Project
from src.main.python.ddadevops.devops_build import DevopsBuild from src.main.python.ddadevops.devops_build import DevopsBuild
from src.main.python.ddadevops.infrastructure.release_mixin import ReleaseContextRepository, ReleaseTypeRepository, VersionRepository, GitApi from src.main.python.ddadevops.application import ReleaseService
from src.main.python.ddadevops.infrastructure import EnvironmentApi from src.main.python.ddadevops.domain import MixinType
from src.main.python.ddadevops.application import PrepareReleaseService, TagAndPushReleaseService
from src.main.python.ddadevops.domain import Release, EnvironmentKeys, MixinType
class ReleaseMixin(DevopsBuild): class ReleaseMixin(DevopsBuild):
def __init__(self, project: Project, input: dict): def __init__(self, project: Project, input: dict):
super().__init__(project, input) super().__init__(project, input)
devops = self.repo.get_devops(self.project) self.release_service = ReleaseService.prod()
git_api = GitApi() devops = self.devops_repo.get_devops(self.project)
self.tag_and_push_release_service = TagAndPushReleaseService(git_api)
environment_api = EnvironmentApi()
if MixinType.RELEASE not in devops.mixins: if MixinType.RELEASE not in devops.mixins:
raise ValueError(f"ReleaseMixin requires MixinType.RELEASE") raise ValueError(f"ReleaseMixin requires MixinType.RELEASE")
# TODO: move this to service
release = devops.mixins[MixinType.RELEASE]
env_key = EnvironmentKeys.DDADEVOPS_RELEASE_TYPE.name
environment_val_set = environment_api.get(env_key) != "" and environment_api.get(env_key) is not None
if environment_val_set:
release_type_repo = ReleaseTypeRepository.from_environment(environment_api)
else:
release_type_repo = ReleaseTypeRepository.from_git(git_api)
version_repo = VersionRepository(release.release_config_file)
self.release_repo = ReleaseContextRepository(version_repo, release_type_repo)
# Here the initialization can happen
self.prepare_release_service = PrepareReleaseService()
def prepare_release(self): def prepare_release(self):
devops = self.repo.get_devops(self.project) devops = self.repo.get_devops(self.project)
release = devops.mixins[MixinType.RELEASE] release = devops.mixins[MixinType.RELEASE]
self.prepare_release_service.write_and_commit_release(release, self.release_repo.version_repository) self.release_service.prepare_release(release)
self.prepare_release_service.write_and_commit_bump(release, self.release_repo.version_repository)
def tag_and_push_release(self): def tag_bump_and_push_release(self):
self.tag_and_push_release_service.tag_release(self.release_repo) devops = self.repo.get_devops(self.project)
self.tag_and_push_release_service.push_release() release = devops.mixins[MixinType.RELEASE]
self.release_service.tag_bump_and_push_release(release)

@ -3,10 +3,6 @@ from pathlib import Path
from pybuilder.core import Project from pybuilder.core import Project
from src.main.python.ddadevops.release_mixin import ReleaseMixin from src.main.python.ddadevops.release_mixin import ReleaseMixin
from src.main.python.ddadevops.infrastructure.release_mixin import (
GitApi,
EnvironmentApi,
)
from src.main.python.ddadevops.domain import Devops, Release from src.main.python.ddadevops.domain import Devops, Release
from .resource_helper import ResourceHelper from .resource_helper import ResourceHelper

Loading…
Cancel
Save