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 ## 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,8 +1,8 @@
"""Provides setup and the core Composer class functionality to interact with a compose stack""" """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 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
@@ -16,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():
@@ -74,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")
self.repo.remotes.origin.pull('master') 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": 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()
@@ -137,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
self.repo.remotes.origin.pull('master') try:
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")
@@ -240,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)