This commit is contained in:
Marc Beninca 2024-06-27 13:37:35 +02:00
parent a6d4cfc52c
commit e240fad832
Signed by: marc.beninca
GPG key ID: 9C7613450C80C24F
6 changed files with 0 additions and 0 deletions

111
spcd/__init__.py Normal file
View file

@ -0,0 +1,111 @@
"""Python Integration, Delivery & Deployment."""
__version__ = "0.0.1"
import os
import sys
from pathlib import Path
import env
from rwx import fs
from rwx.log import stream as log
import pidd
from pidd import cmd
from pidd.project import Project
from pidd.projects import Projects
COMMANDS_PREFIX = "pidd-"
projects = Projects()
project = Project(projects)
def browse(root: str) -> None:
paths = []
for directory, _, files in os.walk(root):
for file in files:
absolute_path = Path(directory) / file
relative_path = os.path.relpath(absolute_path, start=root)
paths.append(relative_path)
frame(root)
for path in sorted(paths):
log.info(path)
shut(root)
def cat(file: str) -> None:
frame(file)
log.info(fs.read_file_text(file).rstrip())
shut(file)
def install_commands(path: str) -> None:
step("Install commands")
user = Path("/usr/local/bin")
for command in [
"browse-workspace",
"build-project",
"clone-branch",
"list-environment",
"synchronize",
]:
log.info(command)
(user / f"{COMMANDS_PREFIX}{command}").symlink_to(path)
def main(main: str) -> None:
path, *arguments = sys.argv
name = Path(path).name
if name == "__main__.py":
pidd.set_ssh(*arguments)
pidd.install_commands(main)
else:
function = getattr(cmd, name.replace("-", "_"))
function(*arguments)
def set_ssh(*arguments: list[str]) -> None:
step("Set SSH")
#
ssh_key, ssh_hosts = arguments
#
ssh_type = "ed25519"
#
home = Path("~").expanduser()
#
ssh = home / ".ssh"
ssh.mkdir(exist_ok=True, parents=True)
ssh.chmod(0o700)
#
key = ssh / f"id_{ssh_type}"
if ssh_key:
fs.write(key, ssh_key)
key.chmod(0o400)
#
known = ssh / "known_hosts"
if ssh_hosts:
fs.write(known, ssh_hosts)
known.chmod(0o400)
#
browse(ssh)
cat(known)
def frame(text: str) -> None:
log.info(f"{env.PIDD_OPEN}{text}")
def shut(text: str) -> None:
log.info(f"{env.PIDD_SHUT}{text}")
def split() -> None:
log.info(env.PIDD_SPLT)
def step(text: str) -> None:
env.PIDD_STEP += 1
log.info(env.PIDD_DOWN)
log.info(f"{env.PIDD_VERT} {env.PIDD_STEP} {text}")
log.info(env.PIDD___UP)

8
spcd/__main__.py Executable file
View file

@ -0,0 +1,8 @@
#! /usr/bin/env python3
"""Entry point."""
import pidd
if __name__ == "__main__":
pidd.main(__file__)

65
spcd/cmd.py Normal file
View file

@ -0,0 +1,65 @@
import os
from pathlib import Path
from rwx import ps, split
from rwx.log import log
from pidd import browse, project, projects
def pidd_browse_workspace() -> None:
browse(project.root)
def pidd_build_project() -> None:
for extension in ["py", "sh"]:
path = Path(project.root) / f"build.{extension}"
if path.exists():
ps.run(path)
break
else:
pass
def pidd_clone_branch() -> None:
log.info(projects)
split()
log.info(project)
split()
log.info(f"""\
{project.url}
""")
ps.run(
"git",
"clone",
"--branch",
project.branch,
"--",
project.url,
project.root,
)
def pidd_list_environment() -> None:
for variable, value in sorted(projects.environment.items()):
log.info(f"{variable} = {value}")
def pidd_synchronize() -> None:
host = "rwx.work"
source = "out"
user = "cd"
#
root = Path(os.sep) / user / project.branch / projects.group / project.name
#
target = f"{user}@{host}:{root}"
ps.run(
"rsync",
"--archive",
"--delete-before",
"--verbose",
f"{source}/",
f"{target}/",
"--dry-run",
)

50
spcd/project.py Normal file
View file

@ -0,0 +1,50 @@
"""CI project."""
from __future__ import annotations
from pathlib import Path
from typing import TYPE_CHECKING
from urllib.parse import urljoin
if TYPE_CHECKING:
from pidd.projects import Projects
BRANCH = [
"GITHUB_REF_NAME",
"CI_COMMIT_BRANCH",
]
NAME = [
"GITHUB_REPOSITORY",
"CI_PROJECT_PATH",
]
ROOT = [
"GITHUB_WORKSPACE",
"CI_PROJECT_DIR",
]
class Project:
def __init__(self: Project, projects: Projects) -> None:
self.projects = projects
# branch
for variable in BRANCH:
if value := projects.environment.get(variable, None):
self.branch = value
# name
for variable in NAME:
if value := projects.environment.get(variable, None):
self.name = Path(value).name
# root
for variable in ROOT:
if value := projects.environment.get(variable, None):
self.root = value
# url
self.url = urljoin(projects.url, self.name)
def __str__(self: Project) -> str:
return f"""\
branch = {self.branch}
name = {self.name}
root = {self.root}
url = {self.url}
"""

38
spcd/projects.py Normal file
View file

@ -0,0 +1,38 @@
"""CI projects."""
from __future__ import annotations
import os
from pathlib import Path
from urllib.parse import urljoin
GROUP_AND_NAME = [
"GITHUB_REPOSITORY",
"CI_PROJECT_PATH",
]
SERVER_URL = [
"GITHUB_SERVER_URL",
"CI_SERVER_URL",
]
class Projects:
def __init__(self: Projects) -> None:
self.environment = os.environ
# group, name
for variable in GROUP_AND_NAME:
if value := self.environment.get(variable, None):
path = Path(value)
self.group = str(path.parent)
self.name = path.name
# url
for variable in SERVER_URL:
if value := self.environment.get(variable, None):
self.url = urljoin(value, self.group)
def __str__(self: Projects) -> str:
return f"""\
group = {self.group}
name = {self.name}
url = {self.url}
"""