2 Commits

Author SHA1 Message Date
ef86a101bd add git credential auth 2026-01-01 11:24:59 -08:00
9eeb346b8a module docs 2025-12-31 22:16:29 -08:00
3 changed files with 37 additions and 10 deletions

View File

@@ -3,3 +3,4 @@
## TODO ## TODO
- Support building images within docker compose - Support building images within docker compose
- GUI - GUI
- Allow stack to be named whatever is needed

View File

@@ -1,6 +1,8 @@
from git import Repo """Provides setup and the core Composer class functionality to interact with a compose stack"""
from git import exc, Repo
import logging import logging
from os import getenv from os import environ, getenv
from pathlib import Path from pathlib import Path
from python_on_whales import DockerClient from python_on_whales import DockerClient
from python_on_whales.exceptions import DockerException from python_on_whales.exceptions import DockerException
@@ -14,10 +16,27 @@ logger = logging.getLogger("composer-agent-logger")
logger.addHandler(handler) logger.addHandler(handler)
logger.setLevel(logging.DEBUG) #TODO: add something to change log levles logger.setLevel(logging.DEBUG) #TODO: add something to change log levles
environ['GIT_TERMINAL_PROMPT'] = '0'
class Setup: class Setup:
"""Setup class ensuring appropriate files and symlinks are created for a Composer instance""" """Setup class ensuring appropriate files and symlinks are created for a Composer instance"""
@staticmethod
def create_credential_remote():
"""Creates a remote url with credentials embedded"""
username, password = getenv("GIT_USERNAME"), getenv("GIT_PASSWORD")
remote = getenv("REMOTE_REPO")
if not remote:
logger.critical("Remote URL not defined, aborting!")
raise Exception("Remote URL not defined!")
if username is not None and password is not None:
return f"https://{username}:{password}@{remote.removeprefix('https://')}"
else:
return remote
@staticmethod @staticmethod
def create_symlink(): def create_symlink():
@@ -72,10 +91,14 @@ class Composer:
if not Path("store/stack/.git").exists(): if not Path("store/stack/.git").exists():
self.repo = Repo.init("store/stack") self.repo = Repo.init("store/stack")
self.repo.create_remote('origin', url) self.repo.create_remote('origin', remote_url)
else: else:
self.repo = Repo("store/stack") self.repo = Repo("store/stack")
try:
self.repo.remotes.origin.pull('master') self.repo.remotes.origin.pull('master')
except exc.GitCommandError:
logger.critical("Failed to autheticate remote, aborting!")
raise Exception("Failed to authenticate remote!")
if self.docker.compose.config(return_json=True)["name"] != "stack": if self.docker.compose.config(return_json=True)["name"] != "stack":
logger.warn(f"Composer stack name is wrong, either make sure it is set manually or keep it store/stack") logger.warn(f"Composer stack name is wrong, either make sure it is set manually or keep it store/stack")
self.start_update_job() self.start_update_job()
@@ -135,14 +158,17 @@ class Composer:
else: else:
logger.warn(f"Undefined status {status} - use up, down, or restart") logger.warn(f"Undefined status {status} - use up, down, or restart")
except DockerException as error: except DockerException as error:
logger.critical(f"Setting status of composer failed: {error}") logger.error(f"Setting status of composer failed: {error}")
def update(self): def update(self):
"""Updates the Composer stack based on the remote repo""" """Updates the Composer stack based on the remote repo"""
current = self.repo.head.commit current = self.repo.head.commit
try:
self.repo.remotes.origin.pull('master') self.repo.remotes.origin.pull('master')
except exc.GitCommandError:
logger.critical("Failed to autheticate remote, aborting!")
if current != self.repo.head.commit: if current != self.repo.head.commit:
self._create_services() self._create_services()
self.set_status("up") self.set_status("up")
@@ -238,8 +264,7 @@ class Service:
else: else:
logger.warn(f"Undefined status {status} - use up, down, or restart") logger.warn(f"Undefined status {status} - use up, down, or restart")
except DockerException as error: except DockerException as error:
logger.critical(f"Setting status for service {self.name} failed: {error}") logger.error(f"Setting status for service {self.name} failed: {error}")
logger.critical(error)
def update(self, restart=True): def update(self, restart=True):

View File

@@ -5,7 +5,8 @@ import time
Setup.populate_store() Setup.populate_store()
Setup.create_symlink() Setup.create_symlink()
composer = Composer(getenv("REMOTE_REPO")) remote = Setup.create_credential_remote()
composer = Composer(remote)
while True: while True:
schedule.run_pending() schedule.run_pending()
time.sleep(1) time.sleep(1)