Skip to content

Commit 6244583

Browse files
authored
ci: save job steps, partially pr event fields in webhook receiver server (#10255)
1 parent 576bc68 commit 6244583

File tree

3 files changed

+118
-26
lines changed

3 files changed

+118
-26
lines changed

ydb/ci/gh-webhook-job/app.py

Lines changed: 73 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
flask_app = Flask("github-webhook")
1515

1616

17-
logger = logging.getLogger(__name__)
17+
logger = logging.getLogger("wh")
1818

1919

2020
def check_github_signature(f):
@@ -37,21 +37,8 @@ def decorated_func(*args, **kwargs):
3737
return decorated_func
3838

3939

40-
@flask_app.route("/webhooks", methods=["GET", "POST"])
41-
@check_github_signature
42-
def webhooks():
43-
cfg = current_app.config
44-
45-
job = request.get_json()
46-
47-
if "workflow_job" not in job:
48-
print("No workflow_job, skip")
49-
return jsonify({"status": False, "description": "No workflow_job in the request"})
50-
51-
# noinspection HttpUrlsUsage
52-
ch_url = f"http://{current_app.config['CH_FQDNS'][0]}:8123"
53-
54-
query = "INSERT INTO workflow_jobs FORMAT JSONEachRow"
40+
def ch_execute(cfg, query, data):
41+
ch_url = f"http://{cfg['CH_FQDNS'][0]}:8123"
5542

5643
params = {
5744
"database": cfg["CH_DATABASE"],
@@ -70,20 +57,84 @@ def webhooks():
7057
}
7158
)
7259

73-
job = job["workflow_job"]
74-
job["steps"] = len(job["steps"])
75-
7660
for i in range(5):
7761
response = None
7862
try:
79-
response = requests.post(ch_url, params=params, data=json.dumps(job), headers=headers)
63+
response = requests.post(ch_url, params=params, data=data, headers=headers)
8064
response.raise_for_status()
8165
break
8266
except Exception as e:
8367
logger.exception("while inserting into clickhouse", exc_info=e)
8468
if response:
8569
logger.warning("Response text %s", response.text)
8670
time.sleep(0.1 * i)
71+
else:
72+
raise Exception("Unable to execute")
73+
74+
return response
75+
76+
77+
def save_workflow_job(cfg, event):
78+
logger.info("save_workflow_job")
79+
job = event["workflow_job"]
80+
orig_steps = job["steps"]
81+
job["steps"] = len(job["steps"])
82+
83+
logger.info("save job")
84+
ch_execute(cfg, "INSERT INTO workflow_jobs FORMAT JSONEachRow", json.dumps(job))
85+
86+
for step in orig_steps:
87+
step = step.copy()
88+
for f in ["id", "run_id", "started_at"]:
89+
step[f"wf_{f}"] = job[f]
90+
logger.info("save step")
91+
ch_execute(cfg, "INSERT INTO workflow_job_steps FORMAT JSONEachRow", json.dumps(step))
92+
93+
94+
def save_pullrequest(cfg, event):
95+
action = event["action"]
96+
97+
logger.info("save_pullrequest")
98+
99+
pr = event["pull_request"]
100+
data = {
101+
"id": pr["id"],
102+
"action": action,
103+
"state": pr["state"],
104+
"url": pr["url"],
105+
"html_url": pr["html_url"],
106+
"number": pr["number"],
107+
"user_login": pr["user"]["login"],
108+
"labels": [l["name"] for l in pr["labels"]],
109+
"head_sha": pr["head"]["sha"],
110+
"head_ref": pr["head"]["ref"],
111+
"base_sha": pr["base"]["sha"],
112+
"base_ref": pr["base"]["ref"],
113+
"merge_commit_sha": pr["merge_commit_sha"],
114+
"merged": pr["merged"],
115+
"draft": pr["draft"],
116+
"created_at": pr["created_at"],
117+
"updated_at": pr["updated_at"],
118+
"closed_at": pr["closed_at"],
119+
"merged_at": pr["merged_at"],
120+
}
121+
ch_execute(cfg, "INSERT INTO pull_request FORMAT JSONEachRow", json.dumps(data))
122+
123+
124+
@flask_app.route("/webhooks", methods=["GET", "POST"])
125+
@check_github_signature
126+
def webhooks():
127+
cfg = current_app.config
128+
129+
event = request.get_json()
130+
131+
if "workflow_job" in event:
132+
save_workflow_job(cfg, event)
133+
elif "pull_request" in event:
134+
save_pullrequest(cfg, event)
135+
else:
136+
logger.error("Unknown event action=%s, keys=%r, skip", event["action"], list(event.keys()))
137+
return jsonify({"status": False, "description": "No workflow_job in the request"})
87138

88139
return jsonify({"status": True})
89140

@@ -120,12 +171,11 @@ def prepare_logger():
120171
},
121172
},
122173
"loggers": {
123-
"": {
124-
#
174+
"wh": {
125175
"handlers": ["default"],
126176
"level": "INFO",
127177
"propagate": False,
128-
},
178+
}
129179
},
130180
}
131181
)
@@ -143,7 +193,6 @@ def main():
143193
"GH_WEBHOOK_SECRET": os.environ["GH_WEBHOOK_SECRET"].encode("utf8"),
144194
}
145195
)
146-
147196
# https://docs.gunicorn.org/en/stable/settings.html
148197
config = {
149198
"bind": f"[::]:{port}",

ydb/ci/gh-webhook-job/schema.sql

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,47 @@ CREATE TABLE gh.workflow_jobs (
2626
)
2727
ENGINE = MergeTree
2828
PARTITION BY toStartOfMonth(started_at)
29-
ORDER BY (id, updated_at)
29+
ORDER BY (id, updated_at);
30+
31+
32+
CREATE TABLE gh.workflow_job_steps (
33+
wf_id UInt64,
34+
wf_run_id UInt64,
35+
wf_started_at DateTime,
36+
name LowCardinality(String),
37+
status LowCardinality(String),
38+
conclusion LowCardinality(String),
39+
number UInt16,
40+
started_at DateTime,
41+
completed_at DateTime DEFAULT now()
42+
)
43+
ENGINE = MergeTree
44+
PARTITION BY toStartOfMonth(wf_started_at)
45+
ORDER BY (wf_id, number);
46+
47+
48+
CREATE TABLE gh.pull_request (
49+
id UInt64,
50+
action LowCardinality(String),
51+
state LowCardinality(String),
52+
number UInt64,
53+
url String,
54+
html_url String,
55+
user_login LowCardinality(String),
56+
labels Array(LowCardinality(String)),
57+
head_sha String,
58+
head_ref String,
59+
base_sha String,
60+
base_ref String,
61+
merge_commit_sha String,
62+
draft bool,
63+
merged bool,
64+
created_at DateTime,
65+
updated_at DateTime,
66+
closed_at DateTime,
67+
merged_at DateTime
68+
69+
)
70+
ENGINE = MergeTree
71+
PARTITION BY toStartOfMonth(created_at)
72+
ORDER BY (number, action);

ydb/ci/ydb-ci-cloud/terraform/ydb-ci-cloud/variables.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,5 +66,5 @@ variable "ssh-keys-lockbox-version-id" {
6666

6767
variable "webhook_container_image" {
6868
type = string
69-
default = "cr.yandex/crp2lrlsrs36odlvd8dv/github-runner-scale-webhook:1"
69+
default = "cr.yandex/crp2lrlsrs36odlvd8dv/github-runner-scale-webhook:2"
7070
}

0 commit comments

Comments
 (0)