14
14
flask_app = Flask ("github-webhook" )
15
15
16
16
17
- logger = logging .getLogger (__name__ )
17
+ logger = logging .getLogger ("wh" )
18
18
19
19
20
20
def check_github_signature (f ):
@@ -37,21 +37,8 @@ def decorated_func(*args, **kwargs):
37
37
return decorated_func
38
38
39
39
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"
55
42
56
43
params = {
57
44
"database" : cfg ["CH_DATABASE" ],
@@ -70,20 +57,84 @@ def webhooks():
70
57
}
71
58
)
72
59
73
- job = job ["workflow_job" ]
74
- job ["steps" ] = len (job ["steps" ])
75
-
76
60
for i in range (5 ):
77
61
response = None
78
62
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 )
80
64
response .raise_for_status ()
81
65
break
82
66
except Exception as e :
83
67
logger .exception ("while inserting into clickhouse" , exc_info = e )
84
68
if response :
85
69
logger .warning ("Response text %s" , response .text )
86
70
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" })
87
138
88
139
return jsonify ({"status" : True })
89
140
@@ -120,12 +171,11 @@ def prepare_logger():
120
171
},
121
172
},
122
173
"loggers" : {
123
- "" : {
124
- #
174
+ "wh" : {
125
175
"handlers" : ["default" ],
126
176
"level" : "INFO" ,
127
177
"propagate" : False ,
128
- },
178
+ }
129
179
},
130
180
}
131
181
)
@@ -143,7 +193,6 @@ def main():
143
193
"GH_WEBHOOK_SECRET" : os .environ ["GH_WEBHOOK_SECRET" ].encode ("utf8" ),
144
194
}
145
195
)
146
-
147
196
# https://docs.gunicorn.org/en/stable/settings.html
148
197
config = {
149
198
"bind" : f"[::]:{ port } " ,
0 commit comments