2022-04-29 10:48:25 +00:00
|
|
|
"""parse and forward docker webhooks"""
|
|
|
|
|
|
|
|
import requests
|
|
|
|
|
2022-05-20 04:41:44 +00:00
|
|
|
from src.webhook_base import WebhookBase
|
2022-04-29 10:48:25 +00:00
|
|
|
|
2022-05-20 04:41:44 +00:00
|
|
|
|
|
|
|
class DockerHook(WebhookBase):
|
2022-04-29 10:48:25 +00:00
|
|
|
"""parse docker webhook and forward to discord"""
|
|
|
|
|
2022-05-20 04:41:44 +00:00
|
|
|
def __init__(self, request):
|
|
|
|
self.request = request
|
|
|
|
self.name = False
|
|
|
|
self.hook = False
|
|
|
|
self.repo_conf = False
|
|
|
|
self.tag = False
|
2022-04-29 10:48:25 +00:00
|
|
|
|
2022-05-20 04:41:44 +00:00
|
|
|
def validate(self):
|
|
|
|
"""validate hook origin"""
|
|
|
|
received = self.request.args.get("secret")
|
|
|
|
if not received:
|
|
|
|
return False
|
2022-04-29 10:48:25 +00:00
|
|
|
|
2022-05-20 04:41:44 +00:00
|
|
|
return received == self.DOCKER_HOOK_SECRET
|
2022-04-29 10:48:25 +00:00
|
|
|
|
2022-05-20 04:41:44 +00:00
|
|
|
def process(self):
|
|
|
|
"""process the hook data"""
|
|
|
|
|
|
|
|
parsed = self._parse_hook()
|
|
|
|
if not parsed:
|
|
|
|
return False
|
|
|
|
|
|
|
|
if self.tag == "unstable":
|
|
|
|
response = self._send_unstable_hook()
|
|
|
|
else:
|
|
|
|
response = self._send_release_hook()
|
|
|
|
|
|
|
|
return response
|
|
|
|
|
|
|
|
def _send_unstable_hook(self):
|
|
|
|
"""send notification for unstable build"""
|
|
|
|
|
|
|
|
commit_url, first_line_message = self._get_last_commit()
|
|
|
|
if not first_line_message.endswith(self.repo_conf["unstable_keyword"]):
|
|
|
|
message = {"success": False}
|
|
|
|
print(message, "build message not found in commit")
|
|
|
|
return message
|
|
|
|
|
|
|
|
url = self.repo_conf["discord_unstable_hook"]
|
|
|
|
message_data = self._build_unstable_message(commit_url)
|
|
|
|
response = self._forward_message(message_data, url)
|
|
|
|
return response
|
|
|
|
|
|
|
|
def _parse_hook(self):
|
|
|
|
"""parse hook json"""
|
|
|
|
self.hook = self.request.json
|
|
|
|
self.tag = self.hook["push_data"]["tag"]
|
|
|
|
if not self.tag or self.tag == "latest":
|
|
|
|
return False
|
2022-04-29 10:48:25 +00:00
|
|
|
|
2022-05-20 04:41:44 +00:00
|
|
|
self.name = self.hook["repository"]["name"]
|
|
|
|
if self.name not in self.HOOK_MAP:
|
|
|
|
print(f"repo {self.name} not registered")
|
|
|
|
return False
|
2022-04-29 10:48:25 +00:00
|
|
|
|
2022-05-20 04:41:44 +00:00
|
|
|
self.repo_conf = self.HOOK_MAP[self.name]
|
2022-04-29 10:48:25 +00:00
|
|
|
|
2022-05-20 04:41:44 +00:00
|
|
|
return True
|
|
|
|
|
|
|
|
def _get_last_commit(self):
|
|
|
|
"""get last commit from git repo"""
|
|
|
|
user = self.repo_conf.get("gh_user")
|
|
|
|
repo = self.repo_conf.get("gh_repo")
|
|
|
|
url = f"https://api.github.com/repos/{user}/{repo}/commits/master"
|
|
|
|
response = requests.get(url).json()
|
|
|
|
commit_url = response["html_url"]
|
|
|
|
first_line_message = response["commit"]["message"].split("\n")[0]
|
|
|
|
|
|
|
|
return commit_url, first_line_message
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def _forward_message(message_data, url):
|
2022-04-29 10:48:25 +00:00
|
|
|
"""forward message to discrod"""
|
2022-05-20 04:41:44 +00:00
|
|
|
response = requests.post(url, json=message_data)
|
2022-04-29 10:48:25 +00:00
|
|
|
if not response.ok:
|
|
|
|
print(response.json())
|
|
|
|
return {"success": False}
|
|
|
|
|
|
|
|
return {"success": True}
|
|
|
|
|
2022-05-20 04:41:44 +00:00
|
|
|
def _build_unstable_message(self, commit_url):
|
2022-04-29 10:48:25 +00:00
|
|
|
"""build message for discord hook"""
|
2022-05-20 04:41:44 +00:00
|
|
|
repo_url = self.hook["repository"]["repo_url"]
|
2022-04-29 10:48:25 +00:00
|
|
|
message = (
|
2022-05-20 04:41:44 +00:00
|
|
|
f"There is a new **{self.tag}** build published to " +
|
|
|
|
f"[docker]({repo_url}). Built from:\n{commit_url}"
|
|
|
|
)
|
|
|
|
message_data = {
|
2022-04-29 10:48:25 +00:00
|
|
|
"content": message
|
|
|
|
}
|
|
|
|
|
2022-05-20 04:41:44 +00:00
|
|
|
return message_data
|
|
|
|
|
|
|
|
def _send_release_hook(self):
|
|
|
|
"""send new release notification"""
|
|
|
|
user = self.repo_conf.get("gh_user")
|
|
|
|
repo = self.repo_conf.get("gh_repo")
|
|
|
|
release_url = (
|
|
|
|
f"https://github.com/{user}/{repo}/" +
|
|
|
|
f"releases/tag/{self.tag}"
|
|
|
|
)
|
|
|
|
message_data = {
|
|
|
|
"content": release_url
|
|
|
|
}
|
|
|
|
|
|
|
|
url = self.repo_conf["discord_release_hook"]
|
|
|
|
response = self._forward_message(message_data, url)
|
|
|
|
|
|
|
|
return response
|