From ff259a1ae13d70e6aa3949456b7454ef38cb664c Mon Sep 17 00:00:00 2001 From: vanzhiganov Date: Thu, 30 Jan 2025 00:10:18 +0300 Subject: [PATCH] WIP --- config.ini | 2 ++ koji_forgejo_webhook.conf | 16 ++++++--- koji_forgejo_webhook.py | 70 ++++++++++++++++++++++++--------------- koji_forgejo_webhook.wsgi | 2 +- 4 files changed, 58 insertions(+), 32 deletions(-) diff --git a/config.ini b/config.ini index 49c63c7..6459417 100644 --- a/config.ini +++ b/config.ini @@ -3,4 +3,6 @@ SECRET_KEY = $3cr3tk3y KOJI_SERVER = https://kojidev.stackwebservices.com/kojihub KOJI_TARGET = rl9-candidate KOJI_USE_SHELL = true +KOJI_NOWAIT = true +KOJI_SCRATCH = true WEBHOOK_SECRET_KEY = your_secret_key diff --git a/koji_forgejo_webhook.conf b/koji_forgejo_webhook.conf index 41a669e..e506bc8 100644 --- a/koji_forgejo_webhook.conf +++ b/koji_forgejo_webhook.conf @@ -1,5 +1,11 @@ -WSGIDaemonProcess forgejo user=builder group=builder processes=2 threads=4 -WSGIScriptAlias /forgejo-webhook /opt/koji-forgejo-webhook/koji_forgejo_webhook.wsgi - - Require all granted - +Listen 5001 + + # ServerName example:5001 + WSGIDaemonProcess forgejo user=builder group=builder processes=4 threads=4 + WSGIScriptAlias /forgejo-webhook /opt/koji-forgejo-webhook/koji_forgejo_webhook.wsgi + + Require all granted + + ErrorLog logs/fwh_error.log + CustomLog logs/fwh_access.log combined + \ No newline at end of file diff --git a/koji_forgejo_webhook.py b/koji_forgejo_webhook.py index beb8a5c..87cd743 100644 --- a/koji_forgejo_webhook.py +++ b/koji_forgejo_webhook.py @@ -4,20 +4,22 @@ import hmac import logging import configparser import subprocess -from flask import Flask, request, abort +from flask import Flask, request, abort, jsonify import koji # Load configuration from .ini file config = configparser.ConfigParser() -config.read('config.ini') +config.read('/opt/koji-forgejo-webhook/config.ini') app = Flask(__name__, instance_relative_config=True) # app.config.from_mapping(config['DEFAULT']) +app.config['DEBUG'] = True app.config['SECRET_KEY'] = config.get('DEFAULT', 'SECRET_KEY') app.config['KOJI_SERVER'] = config.get('DEFAULT', 'KOJI_SERVER') app.config['KOJI_TARGET'] = config.get('DEFAULT', 'KOJI_TARGET') app.config['KOJI_USE_SHELL'] = config.getboolean('DEFAULT', 'KOJI_USE_SHELL') -app.config['KOJI_NOWAIT'] = config.getboolean('DEFAULT', 'KOJI_NOWAIT', True) +app.config['KOJI_NOWAIT'] = config.getboolean('DEFAULT', 'KOJI_NOWAIT') +app.config['KOJI_SCRATCH'] = config.getboolean('DEFAULT', 'KOJI_SCRATCH') app.config['WEBHOOK_SECRET_KEY'] = config.get('DEFAULT', 'WEBHOOK_SECRET_KEY') @@ -25,21 +27,28 @@ class KojiProcessor: def __init__(self): pass - def koji_build_shell(self, build_target, git_url, nowait=True): + def koji_build_shell(self, build_target: str, git_url: str, scratch: bool = True, nowait: bool = True) -> str: + result = {"out": "", "err": ""} + + # Construct the koji build command + nw = '--nowait' if nowait else '' + sc = '--scratch' if scratch else '' + command = ['sudo', 'koji', 'build', sc, nw, build_target, git_url] try: - # Construct the koji build command - nw = '--nowait' if nowait else '' - command = ['koji', 'build', nw, build_target, git_url] - # Start the build process - result = subprocess.run(command, check=True, capture_output=True, text=True) - + exec = subprocess.run(' '.join(command), shell=True, capture_output=True, text=True) + result['err'] = exec.stderr + result['out'] = exec.stdout + # Print output from the command logging.info(f"Build started successfully!") - logging.info(result.stdout) - except subprocess.CalledProcessError as e: - logging.error("Error starting build:") - logging.error(e.stderr) + logging.info(exec.stdout) + # except subprocess.CalledProcessError as e: + # logging.error("Error starting build:") + except Exception as e: + result['err'] = f"{e}" + + return result def koji_build(self, server_url, build_target, source_url, nowait=True): """ @@ -66,7 +75,6 @@ class KojiProcessor: 'nowait': nowait # Wait for build completion } ) - return build_id except Exception as e: @@ -90,6 +98,7 @@ class ForgejoWebhookProcessor: def process_webhook(self, payload): """Process webhook payload""" + result = dict() try: data = json.loads(payload) @@ -104,6 +113,7 @@ class ForgejoWebhookProcessor: logging.info(f"Branch: {ref}") logging.info(f"Number of Commits: {len(commits)}") + # result = head_commit.get("id") # Custom processing logic here # for commit in commits: # logging.info(f"Commit: {commit.get('id')}") @@ -114,21 +124,31 @@ class ForgejoWebhookProcessor: git_url = f"git+{clone_url}#{commit_id}" - if int(app.config.get('KOJI_USE_SHELL')) == 1: - KojiProcessor().koji_build_shell(app.config['KOJI_TARGET'], git_url) + if app.config.get('KOJI_USE_SHELL'): + result = KojiProcessor().koji_build_shell(app.config['KOJI_TARGET'], git_url) else: - KojiProcessor().koji_build(app.config['KOJI_SERVER'], app.config['KOJI_TARGET'], git_url) + result = KojiProcessor().koji_build(app.config['KOJI_SERVER'], app.config['KOJI_TARGET'], git_url) except json.JSONDecodeError: logging.error("Invalid JSON payload") abort(400) + return result -@app.route('/', methods=['POST']) -@app.route('/forgejo-webhook', methods=['POST']) -@app.route('/forgejo-webhook/', methods=['POST']) +@app.route('/ping', methods=['GET']) +def ping(): + result = subprocess.run('sudo koji moshimoshi', shell=True, capture_output=True, text=True) + stdout = result.stdout + stderr = result.stderr + return jsonify({ + "out": f"{stdout}", + "err": f"{stderr}", + }) + + +@app.route('/forgejo', methods=['POST']) def webhook(): - processor = ForgejoWebhookProcessor(app.config['WEBHOOK_SECRET_KEY']) + processor = ForgejoWebhookProcessor(app.config.get('WEBHOOK_SECRET_KEY')) # Get payload and signature payload = request.get_data(as_text=True) @@ -139,11 +159,9 @@ def webhook(): abort(403) # Process webhook - processor.process_webhook(payload) - - return 'Webhook processed', 200 + return jsonify(processor.process_webhook(payload)) if __name__ == '__main__': - logging.basicConfig(level=logging.INFO) + logging.basicConfig(filename='/opt/koji-forgejo-webhook/error.log', level=logging.DEBUG) app.run(host="0.0.0.0", port=5001) diff --git a/koji_forgejo_webhook.wsgi b/koji_forgejo_webhook.wsgi index 74515f5..8ccbdc1 100644 --- a/koji_forgejo_webhook.wsgi +++ b/koji_forgejo_webhook.wsgi @@ -1,7 +1,7 @@ import sys import logging -logging.basicConfig(stream=sys.stderr) +logging.basicConfig(stream=sys.stderr, level=logging.DEBUG) sys.path.insert(0, "/opt/koji-forgejo-webhook") from koji_forgejo_webhook import app as application