diff --git a/.renovaterc.json b/.renovaterc.json new file mode 100644 index 0000000..ff27ef5 --- /dev/null +++ b/.renovaterc.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "local>infrastructure/renovate-config" + ] +} diff --git a/README.md b/README.md index f64716e..8803808 100644 --- a/README.md +++ b/README.md @@ -18,50 +18,6 @@ See `requirements.txt` 2. Adapt `config.yml.example` to your needs and save it as `config.yml` 3. Run `dc-ops` from the shell or from a cron job -### Cron - -Recommended crontab usage: - -`*/15 * * * * python3 /opt/dc-ops/dc-ops 2>&1 | ts "\%FT\%H:\%M:\%S" >>/var/log/dc-ops.log` - -(do not forget logrotate) - -### Systemd - -Recommended systemd usage: - -```toml -# /etc/systemd/system/dc-ops.service -[Unit] -Description=Run dc-ops once -After=docker.target - -[Service] -Type=simple -WorkingDirectory=/opt/dc-ops/ -ExecStart=python3 dc-ops -``` - -```toml -# /etc/systemd/system/dc-ops.timer -[Unit] -Description=Start dc-ops service periodically - -[Timer] -Persistent=true -OnCalendar=*:0/15 -Unit=dc-ops.service - -[Install] -WantedBy=timers.target -``` - -Enable and start the timer: -``` -systemctl enable dc-ops.timer -systemctl start dc-ops.timer -``` - ## Parameters See `dc-ops --help` diff --git a/config.yml.example b/config.yml.example index af277e7..a277ca8 100644 --- a/config.yml.example +++ b/config.yml.example @@ -1,4 +1,3 @@ -self-update: true # optional loglevdel: "INFO" # optional compose-opts: "--dry-run" stacks: diff --git a/dc-ops b/dc-ops index 311fe48..965bda1 100755 --- a/dc-ops +++ b/dc-ops @@ -5,8 +5,6 @@ # CC-BY-SA (https://creativecommons.org/licenses/by-sa/4.0/deed.de) # for civil use only -# pylint: disable=missing-module-docstring,invalid-name - import argparse import logging as log from pathlib import Path @@ -17,12 +15,12 @@ from lib.helper import run_subprocess, update_git_repo, do_selfupdate # read config file configfile = Path(__file__).with_name("config.yml") -with configfile.open("r", encoding="utf-8") as f: +with configfile.open("r") as f: cfg = yaml.safe_load(f.read()) # fmt: off parser = argparse.ArgumentParser() -parser.add_argument("--ignore-git-status", action="store_true", help="continue even if there are no new commits") +parser.add_argument("--ignore-git-status", action="store_true", help="continue even if there are no new commits") # noqa parser.add_argument("--loglevel", help="set loglevel (overrides config file)") args = parser.parse_args() # fmt: on @@ -49,7 +47,7 @@ for stack in cfg["stacks"]: # header stackdir = stack["dir"] - log.info("processing: %s", stackdir) + log.info(f"* processing {stackdir}") # update repo and check for new commits if not update_git_repo(stackdir, args.ignore_git_status): @@ -57,7 +55,6 @@ for stack in cfg["stacks"]: # run pre-command if "pre" in stack: - log.info("-> executing pre-command") if not run_subprocess(stack["pre"], stackdir): continue @@ -65,7 +62,6 @@ for stack in cfg["stacks"]: # (or just for the directory if no compose-file defined) composefiles = stack.get("compose-files", ["docker-compose.yml"]) for composefile in composefiles: - log.info("-> bringing up %s", composefile) if not run_subprocess( f"docker compose --file {composefile} up --detach {composeopts}", stackdir, @@ -74,6 +70,5 @@ for stack in cfg["stacks"]: # run post-command if "post" in stack: - log.info("-> executing post-command") if not run_subprocess(stack["post"], stackdir): continue diff --git a/lib/helper.py b/lib/helper.py index 1fbe286..9eae836 100644 --- a/lib/helper.py +++ b/lib/helper.py @@ -1,5 +1,3 @@ -# pylint: disable=missing-module-docstring - import logging as log import subprocess import sys @@ -18,9 +16,9 @@ def do_selfupdate(): log.error(str(e)) return if pull_res.old_commit: - log.info("SelfUpdate: successfully updated myself - exiting") + log.info("selfupdate: successfully updated myself - exiting") sys.exit(0) - log.info("SelfUpdate: no updates found for myself") + log.info("selfupdate: no updates found for myself") def run_subprocess(command: str, workdir: str) -> bool: @@ -34,9 +32,7 @@ def run_subprocess(command: str, workdir: str) -> bool: bool: False if subprocess fails """ try: - log.debug( - subprocess.run(command.split(" "), cwd=workdir, text=True, check=False) - ) + log.debug(subprocess.run(command.split(" "), cwd=workdir, text=True)) except subprocess.CalledProcessError: return False @@ -53,12 +49,11 @@ def update_git_repo(repo_path: str, ignore_git_status: bool) -> bool: Returns: bool: False if any step fails """ - # create repo instance if it exists try: repo = git.Repo(repo_path) except git.exc.NoSuchPathError: - log.error("-> directory not found") + log.error("directory not found") return False if not ignore_git_status: @@ -66,19 +61,19 @@ def update_git_repo(repo_path: str, ignore_git_status: bool) -> bool: try: fetch_res = repo.remotes.origin.fetch()[0] except git.exc.GitCommandError as e: - log.error("-> %s ", str(e)) + log.error(str(e)) return False # check for new commits if not fetch_res.old_commit: - log.info("-> no changes - skipping") + log.info("no changes - skipping") return False # pull remote changes to local branch try: - log.info("-> %s", repo.git.pull()) + log.info(repo.git.pull()) except git.exc.GitCommandError as e: - log.error("-> %s", str(e)) + log.error(str(e)) return False return True