add git credential auth
This commit is contained in:
@@ -2,4 +2,5 @@
|
|||||||
|
|
||||||
## TODO
|
## TODO
|
||||||
- Support building images within docker compose
|
- Support building images within docker compose
|
||||||
- GUI
|
- GUI
|
||||||
|
- Allow stack to be named whatever is needed
|
||||||
@@ -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):
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
Reference in New Issue
Block a user