|
@@ -1,80 +0,0 @@
|
|
|
-# encoding: utf-8
|
|
|
|
|
-
|
|
|
|
|
-import json
|
|
|
|
|
-import os
|
|
|
|
|
-import subprocess
|
|
|
|
|
-import hmac
|
|
|
|
|
-import hashlib
|
|
|
|
|
-from flask import Flask, request, abort
|
|
|
|
|
-
|
|
|
|
|
-app = Flask(__name__)
|
|
|
|
|
-#prueba 2
|
|
|
|
|
-GITHUB_SECRET = os.environ.get("GITHUB_WEBHOOK_SECRET")
|
|
|
|
|
-
|
|
|
|
|
-REPO_PATH = "/home/superti/page"
|
|
|
|
|
-
|
|
|
|
|
-SERVICE_NAME = "latapp-server.service"
|
|
|
|
|
-
|
|
|
|
|
-def verify_signature(data, github_signature):
|
|
|
|
|
- if not GITHUB_SECRET:
|
|
|
|
|
- print("GITHUB_SECRET no configurado. PELIGRO Los webhooks no serán validados.")
|
|
|
|
|
- return False
|
|
|
|
|
-
|
|
|
|
|
- hasher = hmac.new(GITHUB_SECRET.encode("utf-8"), data, hashlib.sha256)
|
|
|
|
|
- expected_signature = "sha256="+ hasher.hexdigest()
|
|
|
|
|
- return hmac.compare_digest(expected_signature, github_signature)
|
|
|
|
|
-
|
|
|
|
|
-@app.route("/webhook", methods=["POST"])
|
|
|
|
|
-def webhook():
|
|
|
|
|
- print(request.headers)
|
|
|
|
|
- if request.method == "POST":
|
|
|
|
|
- signature = request.headers.get("X-Hub-Signature-256", type=str)
|
|
|
|
|
- if not verify_signature(request.get_data(), signature):
|
|
|
|
|
- abort(403)
|
|
|
|
|
-
|
|
|
|
|
- event = request.headers.get("X-GitHub-Event")
|
|
|
|
|
- if event == "push":
|
|
|
|
|
- payload = request.json
|
|
|
|
|
-
|
|
|
|
|
- ref = payload["ref"]
|
|
|
|
|
-
|
|
|
|
|
- if ref == "refs/heads/main":
|
|
|
|
|
- print("Webhook de PR recibido para la rama {}. Iniciando despliegue...".format(ref.split("/")[2]))
|
|
|
|
|
- try:
|
|
|
|
|
- os.chdir(REPO_PATH)
|
|
|
|
|
-
|
|
|
|
|
- print("Ejecutando git pull...")
|
|
|
|
|
- subprocess.run(["git", "pull"], check=True)
|
|
|
|
|
-
|
|
|
|
|
- print("Creando/activando entorno virtual...")
|
|
|
|
|
- if not os.path.exists(".venv"):
|
|
|
|
|
- subprocess.run(["python3", "-m", "venv", ".venv"], check=True)
|
|
|
|
|
-
|
|
|
|
|
- print("Ejecutando pip install...")
|
|
|
|
|
- subprocess.run(["{}/.venv/bin/pip".format(REPO_PATH), "install", "-r", "requirements.txt"], check=True)
|
|
|
|
|
-
|
|
|
|
|
- print("Reiniciando servicio {}...".format(SERVICE_NAME))
|
|
|
|
|
- subprocess.run(["sudo", "systemctl", "restart", SERVICE_NAME], check=True)
|
|
|
|
|
-
|
|
|
|
|
- print("Despliegue completado con éxito.")
|
|
|
|
|
- return "Despliegue iniciado", 200
|
|
|
|
|
-
|
|
|
|
|
- except subprocess.CalledProcessError as e:
|
|
|
|
|
- print("Error durante el despliegue: {}".format(e))
|
|
|
|
|
- print(e.stderr)
|
|
|
|
|
- return "Error en el despliegue: {}".format(e), 500
|
|
|
|
|
- except Exception as e:
|
|
|
|
|
- print("Error inesperado: {}".format(e))
|
|
|
|
|
- return "Error inesperado: {}".format(e), 500
|
|
|
|
|
- else:
|
|
|
|
|
- print("Evento '{}' en rama '{}' no procesada.".format(event,ref.split("/")[2]))
|
|
|
|
|
- return "Evento no procesado", 200
|
|
|
|
|
- else:
|
|
|
|
|
- print("Evento '{}' no es de pull_request. Ignorando.".format(event))
|
|
|
|
|
- return "Evento no de PR. Ignorando.", 200
|
|
|
|
|
- else:
|
|
|
|
|
- abort(400)
|
|
|
|
|
-
|
|
|
|
|
-if __name__ == "__main__":
|
|
|
|
|
- print("Servidor Flask iniciado. Esperando webhooks en /webhook")
|
|
|
|
|
- app.run(host="0.0.0.0", port=9001)
|
|
|