add git credential auth

This commit is contained in:
2026-01-01 11:24:59 -08:00
parent 9eeb346b8a
commit ef86a101bd
3 changed files with 35 additions and 10 deletions

View File

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

View File

@@ -1,8 +1,8 @@
"""Provides setup and the core Composer class functionality to interact with a compose stack"""
from git import Repo
from git import exc, Repo
import logging
from os import getenv
from os import environ, getenv
from pathlib import Path
from python_on_whales import DockerClient
from python_on_whales.exceptions import DockerException
@@ -16,10 +16,27 @@ logger = logging.getLogger("composer-agent-logger")
logger.addHandler(handler)
logger.setLevel(logging.DEBUG) #TODO: add something to change log levles
environ['GIT_TERMINAL_PROMPT'] = '0'
class Setup:
"""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
def create_symlink():
@@ -74,10 +91,14 @@ class Composer:
if not Path("store/stack/.git").exists():
self.repo = Repo.init("store/stack")
self.repo.create_remote('origin', url)
self.repo.create_remote('origin', remote_url)
else:
self.repo = Repo("store/stack")
try:
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":
logger.warn(f"Composer stack name is wrong, either make sure it is set manually or keep it store/stack")
self.start_update_job()
@@ -137,14 +158,17 @@ class Composer:
else:
logger.warn(f"Undefined status {status} - use up, down, or restart")
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):
"""Updates the Composer stack based on the remote repo"""
current = self.repo.head.commit
try:
self.repo.remotes.origin.pull('master')
except exc.GitCommandError:
logger.critical("Failed to autheticate remote, aborting!")
if current != self.repo.head.commit:
self._create_services()
self.set_status("up")
@@ -240,8 +264,7 @@ class Service:
else:
logger.warn(f"Undefined status {status} - use up, down, or restart")
except DockerException as error:
logger.critical(f"Setting status for service {self.name} failed: {error}")
logger.critical(error)
logger.error(f"Setting status for service {self.name} failed: {error}")
def update(self, restart=True):

View File

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